Le brouillard s'épaissit autour de la ligne « def max(a: Int, b: Int): Int ». Que fait-elle ? Elle retourne le plus grand de deux nombres, mais comment le vérifier ? On peut écrire une dizaine de tests avec des paires concrètes : max(2,3)=3, max(5,5)=5, max(-1,0)=0. Et pourtant, une inquiétude demeure : et si, pour un million et moins un million, elle se cassait ? Au lieu de scruter le brouillard, le développeur peut prendre une boussole, et cette boussole s'appelle une propriété.
Une propriété est une affirmation sur le programme qui doit être vraie pour toutes les entrées. Pas « pour 2 et 3, elle retourne 3 », mais « pour tout a et b, le résultat n'est inférieur à aucun des deux ». Une telle affirmation peut être écrite non seulement sur papier, mais aussi dans le code. La bibliothèque ScalaCheck sait générer des centaines de valeurs aléatoires, les substituer dans la propriété et signaler si au moins une est violée. C'est cela, le test basé sur les propriétés : au lieu d'énumérer manuellement des exemples, on vérifie automatiquement une loi.
Mais les propriétés ne servent pas seulement à vérifier du code existant, elles aident à l'écrire. Prenons la fonction sum, qui additionne une liste de nombres. Une propriété est la monotonie : si on prend une liste et qu'on y ajoute un nombre positif, la somme augmente. Cela semble évident. Mais ScalaCheck trouve un contre-exemple : pour la liste [65536] et l'ajout de 1, la somme n'augmente pas, elle reste à 65537, à cause du dépassement d'entier dans certains langages. La boussole a indiqué un écueil que les tests ordinaires ne voyaient pas.
Et voici le tournant : le programme lui-même est aussi une propriété. Si une fonction retourne toujours 42, on peut la décrire par la propriété « pour toute entrée, le résultat est 42 ». La frontière entre spécification (ce que l'on veut) et implémentation (comment on le fait) s'estompe. La programmation précise est une approche où le développeur garde en tête non seulement le code, mais aussi les propriétés que ce code doit satisfaire. C'est un pont entre le test et la vérification formelle : on ne prouve pas le programme entièrement, mais on obtient la plupart des garanties pour une fraction du coût.
Le brouillard se dissipe. La ligne « def max » n'est plus une énigme : elle a trois propriétés-boussoles, et chacune peut être vérifiée automatiquement. La programmation cesse d'être une devinette et devient une navigation sur une carte que l'on dessine soi-même.
Le nom de la bibliothèque ScalaCheck fait référence à l'idée de vérification automatique de propriétés, et non à une « vérification de Scala » : c'est un outil pour vérifier des propriétés en Scala.
Dans la série « Westworld », le comportement des robots est déterminé par des règles complexes, mais leur correction n'est pas garantie. La programmation précise pourrait aider à formuler et vérifier des propriétés de comportement, évitant ainsi des défaillances inattendues.