Property-based testing
ScalaCheck
Property-based testing er en gratis Scala til backendudvikling og funktionel programmering-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Scala til backendudvikling og funktionel programmering, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Scala til backendudvikling og funktionel programmering-kurset indeholder 4 lektioner i alt.
Hvad er egenskabsbaseret testning?
Ved egenskabsbaseret testning formulerer du en generel egenskab, som skal gælde for alle input, og frameworket genererer mange tilfældige input for at forsøge at modbevise den. Det finder kanttilfælde, som håndskrevne eksempler overser.
Eksempel kontra egenskab
En eksempeltest kontrollerer ét tilfælde: reverse(List(1,2,3)) == List(3,2,1). En egenskab formulerer en regel: at vende en liste om to gange giver den oprindelige liste for enhver liste. Frameworket kontrollerer reglen på hundredvis af genererede lister.
ScalaCheck
ScalaCheck er biblioteket til egenskabsbaseret testning i Scala. Tilføj det som en testafhængighed; det integreres med ScalaTest.
libraryDependencies += "org.scalatestplus" %% "scalacheck-1-17" % "3.2.18.0" % TestforAll
Den centrale konstruktion er forAll: den genererer tilfældige værdier og kontrollerer egenskaben for hver værdi. Her tester vi, at addition er kommutativ.
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
}
}
}En round-trip-egenskab
Et stærkt mønster er en round trip: Kodning efterfulgt af afkodning (eller to vendinger) bør give den oprindelige værdi tilbage for ethvert input.
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
}
}
}Generatorer
ScalaCheck leverer automatisk Gen-generatorer til indbyggede typer. Du kan også opbygge dine egne, f.eks. Gen.choose(1, 100) til et heltal inden for et afgrænset interval.
import org.scalacheck.Gen
val smallInt: Gen[Int] = Gen.choose(1, 100)
val nonEmpty: Gen[List[Int]] = Gen.nonEmptyListOf(Gen.choose(0, 9))Brug af en brugerdefineret generator
Giv en generator til forAll for at begrænse inputtene, f.eks. til kun positive tal.
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
}
}
}Formindskning
Når en egenskab fejler, formindsker ScalaCheck det fejlslagne input til det mindste eksempel, der stadig fejler. I stedet for en enorm tilfældig liste får du et minimalt modeksempel, som er let at fejlfinde.
Betingede egenskaber
Brug whenever til at begrænse en egenskab til input, der opfylder en forudsætning. Input, der ikke opfylder betingelsen, kasseres.
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
}
}
}
}Gode egenskaber at teste
Nyttige kategorier af egenskaber:
- Round trips: kodning/afkodning, vending/vending.
- Invarianter: sortering bevarer længden.
- Algebraiske love: kommutativitet, associativitet, identitet.
Hvornår skal du bruge det?
Egenskabsbaseret testning supplerer eksempeltests; det erstatter dem ikke. Brug det til rene funktioner med klare matematiske eller strukturelle regler. Behold målrettede eksempeltests til specifikke kendte tilfælde og regressioner.
Hurtigt tjek
Test din viden om egenskabsbaseret testning.
Opsummering
Du har lært om egenskabsbaseret testning med ScalaCheck:
- Formulér egenskaber, der er sande for alle input; frameworket genererer mange.
forAllstyrer genereringen;Genopretter brugerdefinerede input.whenevertilføjer forudsætninger; fejl formindskes til minimale eksempler.- Det er velegnet til round trips, invarianter og algebraiske love.
Lær Scala med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 39
- Lektioner
- 143
Ofte stillede spørgsmål
Er lektionen “Property-based testing” gratis?
Ja — hele teksten til “Property-based testing” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Scala til backendudvikling og funktionel programmering-kurset, skal du opgradere til CoddyKit PRO. Scala til backendudvikling og funktionel programmering-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Property-based testing”?
ScalaCheck Du øver dig i Scala til backendudvikling og funktionel programmering med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Scala til backendudvikling og funktionel programmering?
Der kræves ingen tidligere erfaring. Scala til backendudvikling og funktionel programmering på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “Property-based testing”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Scala til backendudvikling og funktionel programmering-lektion?
Ja. Alle Scala til backendudvikling og funktionel programmering-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- ScalaTest-stile
- Matchers
- Property-based testing
- Mocking og fixtures