0Pricing
Scala for Backend Engineering & Functional Programming · درس

الاختبار القائم على الخصائص

ScalaCheck

الاختبار القائم على الخصائص درس مجاني في Scala for Backend Engineering & Functional Programming على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Scala for Backend Engineering & Functional Programming، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.

ما هو الاختبار القائم على الخصائص؟

في الاختبار القائم على الخصائص، تحدد خاصية عامة ينبغي أن تتحقق في جميع المدخلات، ثم ينشئ الإطار مدخلات عشوائية كثيرة لمحاولة إثبات خطئها. ويساعد ذلك في اكتشاف الحالات الحدية التي قد تفوتها الأمثلة المكتوبة يدويًا.

المثال مقابل الخاصية

يتحقق اختبار المثال من حالة واحدة: reverse(List(1,2,3)) == List(3,2,1). أما الخاصية فتحدد قاعدة: إن عكس القائمة مرتين يعيد القائمة الأصلية، لأي قائمة. ويتحقق الإطار من هذه القاعدة على مئات القوائم المُنشأة.

ScalaCheck

إن ScalaCheck مكتبة الاختبار القائم على الخصائص في Scala. أضفها كاعتمادية اختبار؛ فهي تتكامل مع ScalaTest.

libraryDependencies += "org.scalatestplus" %% "scalacheck-1-17" % "3.2.18.0" % Test

forAll

البنية الأساسية هي forAll؛ إذ تنشئ قيمًا عشوائية وتتحقق من جسم الخاصية لكل قيمة منها. نختبر هنا أن عملية الجمع تبديلية.

import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
import org.scalatestplus.scalacheck.ScalaCheckPropertyChecks

class AddSpec extends AnyFlatSpec with Matchers with ScalaCheckPropertyChecks {
  "addition" should "be commutative" in {
    forAll { (a: Int, b: Int) =>
      a + b shouldBe b + a
    }
  }
}

خاصية الرحلة ذهابًا وإيابًا

من الأنماط القوية الرحلة ذهابًا وإيابًا: إذ ينبغي أن تعيد عملية الترميز ثم فك الترميز (أو العكس مرتين) القيمة الأصلية لأي إدخال.

import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
import org.scalatestplus.scalacheck.ScalaCheckPropertyChecks

class RevSpec extends AnyFlatSpec with Matchers with ScalaCheckPropertyChecks {
  "reverse" should "be its own inverse" in {
    forAll { (xs: List[Int]) =>
      xs.reverse.reverse shouldBe xs
    }
  }
}

المولّدات

توفر ScalaCheck مولّدات Gen للأنواع المضمّنة تلقائيًا. ويمكنك أيضًا إنشاء مولّدات مخصّصة، مثل Gen.choose(1, 100) لعدد صحيح ضمن نطاق محدد.

import org.scalacheck.Gen

val smallInt: Gen[Int] = Gen.choose(1, 100)
val nonEmpty: Gen[List[Int]] = Gen.nonEmptyListOf(Gen.choose(0, 9))

استخدام مولّد مخصّص

مرّر مولّدًا إلى forAll لتقييد المدخلات، مثل السماح بالأعداد الموجبة فقط.

import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
import org.scalatestplus.scalacheck.ScalaCheckPropertyChecks
import org.scalacheck.Gen

class PosSpec extends AnyFlatSpec with Matchers with ScalaCheckPropertyChecks {
  "abs" should "stay positive" in {
    forAll(Gen.choose(1, 1000)) { (n: Int) =>
      math.abs(n) should be > 0
    }
  }
}

التصغير

عند فشل خاصية، تُجري ScalaCheck عملية تصغير للإدخال الفاشل حتى تصل إلى أصغر مثال لا يزال يفشل. وبدلًا من قائمة عشوائية ضخمة، تحصل على مثال مضاد صغير يسهل تصحيح أخطائه.

الخصائص الشرطية

استخدم whenever لقصر الخاصية على المدخلات التي تستوفي شرطًا مسبقًا. وتُستبعد المدخلات التي تفشل في استيفاء الشرط.

import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
import org.scalatestplus.scalacheck.ScalaCheckPropertyChecks

class DivSpec extends AnyFlatSpec with Matchers with ScalaCheckPropertyChecks {
  "division" should "hold for nonzero divisors" in {
    forAll { (a: Int, b: Int) =>
      whenever(b != 0) {
        (a / b) * b + (a % b) shouldBe a
      }
    }
  }
}

خصائص جيدة للاختبار

فئات الخصائص المفيدة:

  • الرحلات ذهابًا وإيابًا: الترميز/فك الترميز، والعكس/العكس.
  • الثوابت: يحافظ الفرز على الطول.
  • القوانين الجبرية: التبديلية، والتجميعية، والعنصر المحايد.

متى يُستخدم؟

يكمل اختبار الخصائص اختبارات الأمثلة، ولا يستبدل بها. استخدمه مع الدوال النقية التي لها قواعد رياضية أو بنيوية واضحة. واحتفظ باختبارات أمثلة موجّهة للحالات المعروفة المحددة وحالات التراجع.

تحقّق سريع

اختبر معرفتك بالاختبار القائم على الخصائص.

مراجعة

لقد تعلّمت الاختبار القائم على الخصائص باستخدام ScalaCheck:

  • حدّد خصائص صحيحة لجميع المدخلات؛ ثم ينشئ الإطار عددًا كبيرًا منها.
  • يتولى forAll عملية التوليد، بينما ينشئ Gen مدخلات مخصّصة.
  • يضيف whenever شروطًا مسبقة، وتُصغّر حالات الفشل إلى أمثلة دنيا.
  • وهو مناسب جدًا للرحلات ذهابًا وإيابًا والثوابت والقوانين الجبرية.

الأسئلة الشائعة

هل درس «الاختبار القائم على الخصائص» مجاني؟

نعم — نص درس «الاختبار القائم على الخصائص» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Scala for Backend Engineering & Functional Programming، انتقل إلى CoddyKit PRO. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.

ماذا ستتعلم في «الاختبار القائم على الخصائص»؟

ScalaCheck تتمرن على Scala for Backend Engineering & Functional Programming مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Scala for Backend Engineering & Functional Programming؟

لا تُشترط خبرة سابقة. Scala for Backend Engineering & Functional Programming على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «الاختبار القائم على الخصائص»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Scala for Backend Engineering & Functional Programming هذا؟

نعم. كل درس في Scala for Backend Engineering & Functional Programming يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أنماط ScalaTest
  2. Matchers
  3. الاختبار القائم على الخصائص
  4. المحاكاة وFixtures
← العودة إلى Scala for Backend Engineering & Functional Programming