การทดสอบตามคุณสมบัติ
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" % TestforAll
โครงสร้างหลักคือ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- รูปแบบของ ScalaTest
- ตัวจับคู่
- การทดสอบตามคุณสมบัติ
- การจำลองและชุดข้อมูลทดสอบ