Test basati sulle proprietà
ScalaCheck
Test basati sulle proprietà è una lezione Scala for Backend Engineering & Functional Programming gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Scala for Backend Engineering & Functional Programming, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Scala for Backend Engineering & Functional Programming include 4 lezioni in totale.
Che cos'è il property-based testing?
Nel property-based testing esprimi una proprietà generale che dovrebbe essere valida per tutti gli input, e il framework genera molti input casuali per provare a confutarla. Questo permette di trovare casi limite che gli esempi scritti manualmente non rilevano.
Esempio vs proprietà
Un test basato su un esempio verifica un singolo caso: reverse(List(1,2,3)) == List(3,2,1). Una proprietà esprime una regola: invertire due volte restituisce la lista originale, per qualsiasi lista. Il framework verifica la regola su centinaia di liste generate.
ScalaCheck
ScalaCheck è la libreria di property testing per Scala. Aggiungila come dipendenza di test: si integra con ScalaTest.
libraryDependencies += "org.scalatestplus" %% "scalacheck-1-17" % "3.2.18.0" % TestforAll
Il costrutto principale è forAll: genera valori casuali e verifica il corpo della proprietà per ciascuno di essi. Qui verifichiamo che l'addizione sia commutativa.
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
}
}
}Una proprietà di round trip
Un modello potente è il round trip: la codifica seguita dalla decodifica (o due inversioni successive) dovrebbe restituire il valore originale, per qualsiasi 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
}
}
}Generatori
ScalaCheck fornisce automaticamente generatori Gen per i tipi integrati. Puoi anche crearne di personalizzati, ad esempio Gen.choose(1, 100) per un intero entro un intervallo.
import org.scalacheck.Gen
val smallInt: Gen[Int] = Gen.choose(1, 100)
val nonEmpty: Gen[List[Int]] = Gen.nonEmptyListOf(Gen.choose(0, 9))Usare un generatore personalizzato
Passa un generatore a forAll per vincolare gli input, ad esempio ai soli numeri positivi.
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
}
}
}Riduzione
Quando una proprietà fallisce, ScalaCheck riduce l'input che ha causato il fallimento fino al più piccolo esempio che continua a fallire. Invece di una grande lista casuale, ottieni un controesempio minimo, facile da analizzare.
Proprietà condizionali
Usa whenever per limitare una proprietà agli input che soddisfano una precondizione. Gli input che non soddisfano la condizione vengono scartati.
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
}
}
}
}Proprietà utili da testare
Categorie di proprietà utili:
- Round trip: codifica/decodifica, inversione/inversione;
- invarianti: l'ordinamento mantiene la lunghezza;
- leggi algebriche: commutatività, associatività, identità.
Quando usarlo
Il property testing completa i test basati su esempi, ma non li sostituisce. Usalo per funzioni pure con regole matematiche o strutturali chiare. Mantieni test mirati basati su esempi per casi specifici già noti e regressioni.
Controllo rapido
Verifica la tua conoscenza del property-based testing.
Riepilogo
Hai imparato il property-based testing con ScalaCheck:
- esprimi proprietà vere per tutti gli input; il framework ne genera molti;
forAllgestisce la generazione;Gencrea input personalizzati;wheneveraggiunge precondizioni; i fallimenti vengono ridotti a esempi minimi;- è ideale per round trip, invarianti e leggi algebriche.
Domande Frequenti
La lezione «Test basati sulle proprietà» è gratuita?
Sì — il testo completo di «Test basati sulle proprietà» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Scala for Backend Engineering & Functional Programming, passa a CoddyKit PRO. Il corso Scala for Backend Engineering & Functional Programming include 4 lezioni in totale.
Cosa imparerò in «Test basati sulle proprietà»?
ScalaCheck Eserciti Scala for Backend Engineering & Functional Programming con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Scala for Backend Engineering & Functional Programming?
Non è richiesta alcuna esperienza precedente. Scala for Backend Engineering & Functional Programming su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Test basati sulle proprietà»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Scala for Backend Engineering & Functional Programming?
Sì. Ogni lezione Scala for Backend Engineering & Functional Programming include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Stili di ScalaTest
- Matcher
- Test basati sulle proprietà
- Mock e fixture