Scala til backendudvikling og funktionel programmering · Lektion

Property-based testing

ScalaCheck

Lektion 3 af 413 trin

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" % Test

forAll

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.
  • forAll styrer genereringen; Gen opretter brugerdefinerede input.
  • whenever tilføjer forudsætninger; fejl formindskes til minimale eksempler.
  • Det er velegnet til round trips, invarianter og algebraiske love.
Gratis at komme i gang

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

  1. ScalaTest-stile
  2. Matchers
  3. Property-based testing
  4. Mocking og fixtures
← Tilbage til Scala til backendudvikling og funktionel programmering