Pengujian Berbasis Properti
ScalaCheck.
Pengujian Berbasis Properti adalah pelajaran Scala for Backend Engineering & Functional Programming gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Scala for Backend Engineering & Functional Programming, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Scala for Backend Engineering & Functional Programming mencakup 4 pelajaran total.
Apa Itu Pengujian Berbasis Properti?
Dalam pengujian berbasis properti, Anda menyatakan suatu properti umum yang harus berlaku untuk semua input, lalu kerangka kerja menghasilkan banyak input acak untuk mencoba membuktikan bahwa properti tersebut salah. Teknik ini menemukan kasus batas yang mungkin terlewat oleh contoh yang ditulis secara manual.
Contoh vs Properti
Pengujian contoh memeriksa satu kasus: reverse(List(1,2,3)) == List(3,2,1). Properti menyatakan suatu aturan: membalik dua kali menghasilkan daftar semula, untuk daftar apa pun. Kerangka kerja memeriksa aturan tersebut pada ratusan daftar yang dihasilkan.
ScalaCheck
ScalaCheck adalah pustaka pengujian berbasis properti untuk Scala. Tambahkan sebagai dependensi pengujian; pustaka ini terintegrasi dengan ScalaTest.
libraryDependencies += "org.scalatestplus" %% "scalacheck-1-17" % "3.2.18.0" % TestforAll
Konstruksi intinya adalah forAll: konstruksi ini menghasilkan nilai acak dan mengasersi isi properti untuk setiap nilai. Di sini kita menguji bahwa penjumlahan bersifat komutatif.
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
}
}
}Properti Pulang-Pergi
Pola yang kuat adalah pulang-pergi: proses menyandikan lalu mendekodekan (atau membalik dua kali) seharusnya mengembalikan nilai semula, untuk input apa pun.
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
}
}
}Generator
ScalaCheck secara otomatis menyediakan generator Gen untuk tipe bawaan. Anda juga dapat membuat generator khusus, misalnya Gen.choose(1, 100) untuk bilangan bulat dalam batas tertentu.
import org.scalacheck.Gen
val smallInt: Gen[Int] = Gen.choose(1, 100)
val nonEmpty: Gen[List[Int]] = Gen.nonEmptyListOf(Gen.choose(0, 9))Menggunakan Generator Khusus
Berikan generator kepada forAll untuk membatasi input, misalnya hanya bilangan positif.
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
}
}
}Penyusutan
Ketika suatu properti gagal, ScalaCheck menyusutkan input yang gagal menjadi contoh terkecil yang masih gagal. Alih-alih daftar acak yang sangat besar, Anda mendapatkan contoh tandingan minimal yang mudah di-debug.
Properti Bersyarat
Gunakan whenever untuk membatasi properti pada input yang memenuhi prasyarat. Input yang tidak memenuhi kondisi akan dibuang.
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
}
}
}
}Properti yang Baik untuk Diuji
Kategori properti yang berguna:
- Pulang-pergi: encode/decode, reverse/reverse.
- Invarian: pengurutan mempertahankan panjang.
- Hukum aljabar: komutativitas, asosiativitas, identitas.
Kapan Menggunakannya
Pengujian berbasis properti melengkapi pengujian contoh; teknik ini tidak menggantikannya. Gunakan untuk fungsi murni dengan aturan matematis atau struktural yang jelas. Pertahankan pengujian contoh yang terarah untuk kasus khusus dan regresi yang telah diketahui.
Pemeriksaan Singkat
Uji pengetahuan Anda tentang pengujian berbasis properti.
Rangkuman
Anda telah mempelajari pengujian berbasis properti dengan ScalaCheck:
- Nyatakan properti yang benar untuk semua input; kerangka kerja akan menghasilkan banyak input.
forAllmengatur pembuatan input;Genmembuat input khusus.whenevermenambahkan prasyarat; kegagalan disusutkan menjadi contoh minimal.- Sangat cocok untuk proses pulang-pergi, invarian, dan hukum aljabar.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pengujian Berbasis Properti” gratis?
Ya — teks lengkap “Pengujian Berbasis Properti” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Scala for Backend Engineering & Functional Programming, upgrade ke CoddyKit PRO. Kursus Scala for Backend Engineering & Functional Programming mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pengujian Berbasis Properti”?
ScalaCheck. Kamu berlatih Scala for Backend Engineering & Functional Programming dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Scala for Backend Engineering & Functional Programming?
Tidak diperlukan pengalaman sebelumnya. Scala for Backend Engineering & Functional Programming di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Pengujian Berbasis Properti” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Scala for Backend Engineering & Functional Programming ini?
Ya. Setiap pelajaran Scala for Backend Engineering & Functional Programming menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Gaya ScalaTest
- Matcher
- Pengujian Berbasis Properti
- Mocking dan Fixture