0Pricing
Scala for Backend Engineering & Functional Programming · Lektion

Property-Based Testing

ScalaCheck

Property-Based Testing ist eine kostenlose Scala for Backend Engineering & Functional Programming-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Scala for Backend Engineering & Functional Programming-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Scala for Backend Engineering & Functional Programming-Kurs umfasst insgesamt 4 Lektionen.

Was ist property-basiertes Testen?

Beim property-basierten Testen formulieren Sie eine allgemeine Eigenschaft, die für alle Eingaben gelten soll. Das Framework erzeugt zahlreiche zufällige Eingaben, um diese Eigenschaft zu widerlegen. So werden Randfälle gefunden, die handgeschriebene Beispiele übersehen.

Beispiel vs. Eigenschaft

Ein Beispieltest prüft einen einzelnen Fall: reverse(List(1,2,3)) == List(3,2,1). Eine Eigenschaft formuliert eine Regel: Zweimaliges Umkehren ergibt für jede Liste wieder die ursprüngliche Liste. Das Framework prüft diese Regel anhand Hunderter generierter Listen.

ScalaCheck

ScalaCheck ist die Bibliothek für property-basiertes Testen in Scala. Fügen Sie sie als Testabhängigkeit hinzu; sie lässt sich in ScalaTest integrieren.

libraryDependencies += "org.scalatestplus" %% "scalacheck-1-17" % "3.2.18.0" % Test

forAll

Das zentrale Konstrukt ist forAll: Es erzeugt zufällige Werte und prüft den Eigenschaftsblock für jeden einzelnen. Hier testen wir, dass die Addition kommutativ ist.

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
    }
  }
}

Eine Round-Trip-Eigenschaft

Ein leistungsfähiges Muster ist der Round Trip: Eine Kodierung mit anschließender Dekodierung (oder zweimaliges Umkehren) sollte für jede Eingabe den ursprünglichen Wert zurückgeben.

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
    }
  }
}

Generatoren

ScalaCheck stellt automatisch Gen-Generatoren für integrierte Typen bereit. Sie können auch eigene Generatoren erstellen, zum Beispiel Gen.choose(1, 100) für eine ganze Zahl innerhalb eines begrenzten Bereichs.

import org.scalacheck.Gen

val smallInt: Gen[Int] = Gen.choose(1, 100)
val nonEmpty: Gen[List[Int]] = Gen.nonEmptyListOf(Gen.choose(0, 9))

Einen benutzerdefinierten Generator verwenden

Übergeben Sie forAll einen Generator, um die Eingaben einzuschränken, zum Beispiel auf positive Zahlen.

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
    }
  }
}

Shrinking

Wenn eine Eigenschaft fehlschlägt, führt ScalaCheck ein Shrinking der fehlerhaften Eingabe durch, bis das kleinste weiterhin fehlschlagende Beispiel gefunden ist. Statt einer großen Zufallsliste erhalten Sie ein minimales Gegenbeispiel, das sich leicht debuggen lässt.

Bedingte Eigenschaften

Verwenden Sie whenever, um eine Eigenschaft auf Eingaben zu beschränken, die eine Vorbedingung erfüllen. Eingaben, die die Bedingung nicht erfüllen, werden verworfen.

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
      }
    }
  }
}

Geeignete Eigenschaften zum Testen

Nützliche Kategorien von Eigenschaften:

  • Round Trips: Kodieren/Dekodieren, Umkehren/Umkehren.
  • Invarianten: Sortieren erhält die Länge.
  • Algebraische Gesetze: Kommutativität, Assoziativität, neutrales Element.

Wann Sie es verwenden sollten

Property-basiertes Testen ergänzt Beispieltests, ersetzt sie aber nicht. Verwenden Sie es für reine Funktionen mit klaren mathematischen oder strukturellen Regeln. Behalten Sie gezielte Beispieltests für bestimmte bekannte Fälle und Regressionen bei.

Kurzer Test

Testen Sie Ihr Wissen über property-basiertes Testen.

Zusammenfassung

Sie haben property-basiertes Testen mit ScalaCheck gelernt:

  • Formulieren Sie Eigenschaften, die für alle Eingaben gelten; das Framework erzeugt zahlreiche Eingaben.
  • forAll steuert die Generierung; Gen erstellt benutzerdefinierte Eingaben.
  • whenever fügt Vorbedingungen hinzu; Fehler werden durch Shrinking auf minimale Beispiele reduziert.
  • Besonders geeignet für Round Trips, Invarianten und algebraische Gesetze.

Häufig gestellte Fragen

Ist die Lektion „Property-Based Testing“ kostenlos?

Ja — der vollständige Text von „Property-Based Testing“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Scala for Backend Engineering & Functional Programming-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Scala for Backend Engineering & Functional Programming-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Property-Based Testing“?

ScalaCheck Du übst Scala for Backend Engineering & Functional Programming mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Scala for Backend Engineering & Functional Programming zu starten?

Keine Vorkenntnisse erforderlich. Scala for Backend Engineering & Functional Programming auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „Property-Based Testing“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Scala for Backend Engineering & Functional Programming-Lektion Code schreiben und ausführen?

Ja. Jede Scala for Backend Engineering & Functional Programming-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. ScalaTest-Stile
  2. Matcher
  3. Property-Based Testing
  4. Mocking und Fixtures
← Zurück zu Scala for Backend Engineering & Functional Programming