-- Vrai pour TOUT a, b : aucune valeur n'est échantillonnée
-- la preuve est vérifiée à la compilation
theorem add_comm (a b : Nat) : a + b = b + a := by
omega
Pas de cas d'essai : le compilateur vérifie la preuve, ou refuse de compiler.
Property-based testing
Vous écrivez des propriétés (comme le formel)
+ la machine génère & réduit les entrées (comme le fuzzing)
« du fuzzing qui sait ce qui est correct »
Tests classiques
Fuzzing
PBT
Formel
Entrées
valeurs idéalement en dur
machine
machine (stratégies)
toutes (symbolique)
Oracle
assertions précises
crash only
propriétés
spécification
Domaine
partout
parsers, sécu
libs, data, métier
aéro, crypto
Coût
faible
moyen
faible–moyen
élevé
ROI
?
?
?
?
Hypothesis
from hypothesis import given, strategies as st
@given(st.integers(), st.integers())
def test_addition_commutative(a, b):
assert add(a, b) == add(b, a)
Pas un tirage uniforme
@given(st.integers())
def test_p(n):
...
# Vise les bornes de l'intervalle, et injecte des constantes "SWE" :
# 2**31 - 1, 2**63 - 1 # overflow signé 32 / 64 bits
# 2**16, 10**9, 20! # puissances de 2, de 10, factorielles
# 510510, 6469693230 # primorielles (codées en dur !)
« Haskell programmers are willing to put up with a lot of suffering for correctness.
If Python programmers were willing to put up with suffering to achieve correctness,
they'd not be writing Python in the first place! »