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

การทดสอบตามคุณสมบัติ

ScalaCheck

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

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

บทเรียน “การทดสอบตามคุณสมบัติ” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การทดสอบตามคุณสมบัติ”

ScalaCheck คุณปฏิบัติ Scala for Backend Engineering & Functional Programming ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 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 ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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