Scala for Backend Engineering & Functional Programming · บทเรียน

การจำลองและชุดข้อมูลทดสอบ

การเตรียมการทดสอบ

บทเรียน 4 จาก 413 ขั้นตอน

การจำลองและชุดข้อมูลทดสอบ เป็นบทเรียน Scala for Backend Engineering & Functional Programming ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 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")
  }
}

สิ่งจำลอง เทียบกับตัวแทน และของปลอม

คำศัพท์:

  • ตัวแทน: ส่งคืนคำตอบที่เตรียมไว้
  • สิ่งจำลอง: ช่วยให้ตรวจสอบการโต้ตอบได้ด้วย
  • ของปลอม: การนำไปใช้งานที่ทำงานได้และมีน้ำหนักเบา เช่น ที่เก็บข้อมูลในหน่วยความจำ

เมื่อทำได้ง่าย ให้เลือกของปลอมหรืออ็อบเจกต์จริง และใช้สิ่งจำลองเฉพาะการพึ่งพาภายนอกที่จำเป็นจริง

การแยกการทดสอบออกจากกัน

อุปกรณ์ประกอบและสิ่งจำลองมีเป้าหมายเดียวกัน คือให้การทดสอบแต่ละรายการทำงานในสถานะที่ทราบแน่ชัดและเป็นอิสระต่อกัน รีเซ็ตสถานะที่เปลี่ยนแปลงร่วมกันก่อนการทดสอบแต่ละรายการ และหลีกเลี่ยงการใช้อุปกรณ์ประกอบที่เปลี่ยนแปลงร่วมกันระหว่างการทดสอบ เพื่อป้องกันความล้มเหลวที่เกิดขึ้นไม่แน่นอนและขึ้นกับลำดับการทำงาน

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความรู้เกี่ยวกับอุปกรณ์ประกอบและการจำลอง

สรุปทบทวน

คุณได้เรียนรู้เรื่องอุปกรณ์ประกอบและการจำลอง:

  • อุปกรณ์ประกอบ: เมธอดช่วย BeforeAndAfter, BeforeAndAfterAll และรูปแบบการยืม
  • สิ่งจำลอง (ผ่าน MockitoSugar): กำหนดตัวแทนด้วย when().thenReturn() และตรวจสอบการเรียกด้วย verify
  • เลือกของปลอมสำหรับกรณีง่าย ๆ และใช้สิ่งจำลองกับการพึ่งพาภายนอก
  • แยกการทดสอบทุกชุดออกจากกันและไม่ให้ขึ้นกับลำดับ
เริ่มต้นได้ฟรี

เรียนรู้ Scala ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
39
บทเรียน
143

คำถามที่พบบ่อย

บทเรียน “การจำลองและชุดข้อมูลทดสอบ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การจำลองและชุดข้อมูลทดสอบ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Scala for Backend Engineering & Functional Programming ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การจำลองและชุดข้อมูลทดสอบ”

การเตรียมการทดสอบ คุณปฏิบัติ Scala for Backend Engineering & Functional Programming ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Scala for Backend Engineering & Functional Programming หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Scala for Backend Engineering & Functional Programming บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การจำลองและชุดข้อมูลทดสอบ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Scala for Backend Engineering & Functional Programming นี้ได้ไหม

ได้ บทเรียน Scala for Backend Engineering & Functional Programming ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. รูปแบบของ ScalaTest
  2. ตัวจับคู่
  3. การทดสอบตามคุณสมบัติ
  4. การจำลองและชุดข้อมูลทดสอบ
← กลับไปที่ Scala for Backend Engineering & Functional Programming