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

المحاكاة وFixtures

إعداد الاختبارات

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

إعداد الاختبارات وتنظيفها

تحتاج اختبارات كثيرة إلى بيانات تجهيز مشتركة: وهي بيانات أو موارد تُعدّ قبل الاختبار ويُتخلّص منها بعده. وتوفر ScalaTest عدة طرق لإدارة ذلك دون تكرار كود الإعداد.

تجهيز بسيط: مجرد دالة

أبسط طريقة للتجهيز هي دالة مساعدة تنشئ حالة جديدة. يستدعيها كل اختبار، مما يضمن العزل.

import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers

class StackSpec extends AnyFlatSpec with Matchers {
  def emptyStack(): scala.collection.mutable.Stack[Int] =
    scala.collection.mutable.Stack.empty[Int]

  "a stack" should "start empty" in {
    emptyStack().size shouldBe 0
  }
}

BeforeAndAfter

أضف السمة BeforeAndAfter لتشغيل كود قبل كل اختبار وبعده باستخدام الكتلتين before { } وafter { }.

import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
import org.scalatest.BeforeAndAfter

class DbSpec extends AnyFlatSpec with Matchers with BeforeAndAfter {
  var counter = 0
  before { counter = 10 }
  after  { counter = 0 }

  "counter" should "be initialized" in {
    counter shouldBe 10
  }
}

BeforeAndAfterAll

بالنسبة إلى الموارد المكلفة التي تُشارك بين جميع اختبارات المجموعة، مثل اتصال قاعدة بيانات أو خادم مضمن، استخدم BeforeAndAfterAll مع beforeAll وafterAll.

import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.BeforeAndAfterAll

class ServerSpec extends AnyFlatSpec with BeforeAndAfterAll {
  override def beforeAll(): Unit = println("start server")
  override def afterAll(): Unit  = println("stop server")

  "server" should "respond" in {
    assert(true)
  }
}

نمط تجهيز الإعارة

يمرّر نمط الإعارة موردًا مُنشأ حديثًا إلى جسم الاختبار، ويضمن تنظيفه داخل finally حتى إذا فشل الاختبار.

import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers

class FileSpec extends AnyFlatSpec with Matchers {
  def withBuffer(test: StringBuilder => Any): Unit = {
    val buf = new StringBuilder("init")
    try test(buf)
    finally buf.clear()
  }

  "a buffer" should "start with init" in withBuffer { buf =>
    buf.toString shouldBe "init"
  }
}

لماذا استخدام المحاكاة؟

إن المحاكي بديل عن اعتمادية حقيقية، مثل قاعدة بيانات أو عميل HTTP، بحيث يظل اختبار الوحدة سريعًا وحتميًا. ويمكنك التحكم فيما يعيده المحاكي والتحقق من كيفية استدعائه.

إضافة Mockito

تتكامل ScalaTest مع Mockito عبر scalatestplus. أضف الاعتمادية وأضف السمة MockitoSugar.

libraryDependencies += "org.scalatestplus" %% "mockito-5-10" % "3.2.18.0" % Test

تهيئة سلوك دالة

أنشئ محاكيًا وبرمج سلوكه باستخدام when(...).thenReturn(...). ثم يختبر الاختبار الكود الذي يعتمد عليه.

import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
import org.scalatestplus.mockito.MockitoSugar
import org.mockito.Mockito.when

trait Repo { def find(id: Int): String }

class RepoSpec extends AnyFlatSpec with Matchers with MockitoSugar {
  "a repo" should "return stubbed value" in {
    val repo = mock[Repo]
    when(repo.find(1)).thenReturn("Alice")
    repo.find(1) shouldBe "Alice"
  }
}

التحقق من التفاعلات

إلى جانب القيم المُعادة، يمكنك التحقق من استدعاء دالة بالعدد المتوقع من المرات باستخدام verify.

import org.scalatest.flatspec.AnyFlatSpec
import org.scalatestplus.mockito.MockitoSugar
import org.mockito.Mockito.{verify, times}

trait Logger { def log(msg: String): Unit }

class LogSpec extends AnyFlatSpec with MockitoSugar {
  "a service" should "log once" in {
    val logger = mock[Logger]
    logger.log("hi")
    verify(logger, times(1)).log("hi")
  }
}

المحاكيات مقابل البدائل والتطبيقات الوهمية

المصطلحات:

  • Stub: يعيد إجابات محددة مسبقًا.
  • Mock: يتيح أيضًا التحقق من التفاعلات.
  • Fake: تطبيق عملي خفيف الوزن، مثل مستودع في الذاكرة.

فضّل التطبيقات الوهمية أو الكائنات الحقيقية عندما يكون ذلك بسيطًا؛ واستخدم المحاكاة فقط للاعتماديات الخارجية الفعلية.

الحفاظ على عزل الاختبارات

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

تحقّق سريع

اختبر معرفتك ببيانات التجهيز والمحاكاة.

مراجعة

لقد تعلّمت بيانات التجهيز والمحاكاة:

  • بيانات التجهيز: الدوال المساعدة، وBeforeAndAfter، وBeforeAndAfterAll، ونمط الإعارة.
  • المحاكيات (عبر MockitoSugar): استخدم when().thenReturn() لتهيئة السلوك، وتحقق من الاستدعاءات باستخدام verify.
  • فضّل التطبيقات الوهمية في الحالات البسيطة، واستخدم المحاكاة للاعتماديات الخارجية.
  • حافظ على عزل كل اختبار واستقلاله عن الترتيب.

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

هل درس «المحاكاة وFixtures» مجاني؟

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

ماذا ستتعلم في «المحاكاة وFixtures»؟

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

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

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

كم من الوقت يستغرق درس «المحاكاة وFixtures»؟

معظم دروس 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