0Pricing
Scala for Backend Engineering & Functional Programming · Lezione

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

forAll

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;
  • forAll gestisce la generazione; Gen crea input personalizzati;
  • whenever aggiunge 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

  1. Stili di ScalaTest
  2. Matcher
  3. Test basati sulle proprietà
  4. Mock e fixture
← Torna a Scala for Backend Engineering & Functional Programming