Tests fondés sur les propriétés
ScalaCheck
Tests fondés sur les propriétés est une leçon Scala for Backend Engineering & Functional Programming gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Scala for Backend Engineering & Functional Programming, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Scala for Backend Engineering & Functional Programming comprend 4 leçons au total.
Qu’est-ce que le test fondé sur les propriétés ?
Dans un test fondé sur les propriétés, vous énoncez une propriété générale qui doit être vraie pour toutes les entrées, puis le framework génère de nombreuses entrées aléatoires pour tenter de la réfuter. Cette approche trouve des cas limites que les exemples écrits manuellement ne détectent pas.
Exemple ou propriété
Un test par exemple vérifie un seul cas : reverse(List(1,2,3)) == List(3,2,1). Une propriété énonce une règle : inverser deux fois produit la liste d’origine, quelle que soit la liste. Le framework vérifie cette règle sur des centaines de listes générées.
ScalaCheck
ScalaCheck est la bibliothèque de test de propriétés pour Scala. Ajoutez-la comme dépendance de test ; elle s’intègre à ScalaTest.
libraryDependencies += "org.scalatestplus" %% "scalacheck-1-17" % "3.2.18.0" % TestforAll
La construction centrale est forAll : elle génère des valeurs aléatoires et vérifie le corps de la propriété pour chacune d’elles. Ici, nous vérifions que l’addition est commutative.
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
}
}
}Une propriété aller-retour
Un schéma puissant est l’aller-retour : encoder puis décoder (ou inverser deux fois) doit restituer la valeur d’origine, quelle que soit l’entrée.
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
}
}
}Générateurs
ScalaCheck fournit automatiquement des générateurs Gen pour les types intégrés. Vous pouvez aussi créer des générateurs personnalisés, par exemple Gen.choose(1, 100) pour obtenir un entier borné.
import org.scalacheck.Gen
val smallInt: Gen[Int] = Gen.choose(1, 100)
val nonEmpty: Gen[List[Int]] = Gen.nonEmptyListOf(Gen.choose(0, 9))Utiliser un générateur personnalisé
Passez un générateur à forAll pour restreindre les entrées, par exemple aux seuls nombres positifs.
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
}
}
}Réduction
Lorsqu’une propriété échoue, ScalaCheck réduit l’entrée fautive au plus petit exemple qui échoue encore. Au lieu d’obtenir une immense liste aléatoire, vous obtenez un contre-exemple minimal, facile à déboguer.
Propriétés conditionnelles
Utilisez whenever pour limiter une propriété aux entrées qui respectent une précondition. Les entrées qui ne respectent pas la condition sont ignorées.
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
}
}
}
}Bonnes propriétés à tester
Catégories de propriétés utiles :
- Allers-retours : encoder/décoder, inverser/inverser.
- Invariants : le tri conserve la longueur.
- Lois algébriques : commutativité, associativité, élément neutre.
Quand l’utiliser
Les tests de propriétés complètent les tests par exemples ; ils ne les remplacent pas. Utilisez-les pour les fonctions pures qui obéissent à des règles mathématiques ou structurelles claires. Conservez des tests par exemples ciblés pour les cas connus et les régressions.
Vérification rapide
Vérifiez vos connaissances sur les tests fondés sur les propriétés.
Récapitulatif
Vous avez découvert les tests fondés sur les propriétés avec ScalaCheck :
- Énoncez des propriétés vraies pour toutes les entrées ; le framework en génère de nombreuses.
forAllpilote la génération ;Gencrée des entrées personnalisées.wheneverajoute des préconditions ; les échecs sont réduits à des exemples minimaux.- Cette approche convient parfaitement aux allers-retours, aux invariants et aux lois algébriques.
Questions Fréquemment Posées
La leçon « Tests fondés sur les propriétés » est-elle gratuite ?
Oui — le texte complet de « Tests fondés sur les propriétés » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Scala for Backend Engineering & Functional Programming, passe à CoddyKit PRO. Le cours Scala for Backend Engineering & Functional Programming comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Tests fondés sur les propriétés » ?
ScalaCheck Tu pratiques Scala for Backend Engineering & Functional Programming avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Scala for Backend Engineering & Functional Programming ?
Aucune expérience préalable n'est requise. Scala for Backend Engineering & Functional Programming sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « Tests fondés sur les propriétés » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Scala for Backend Engineering & Functional Programming ?
Oui. Chaque leçon Scala for Backend Engineering & Functional Programming inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Styles de ScalaTest
- Matchers
- Tests fondés sur les propriétés
- Simulations et appareils de test