Écrire des tests automatisés
Dans son essai de 1972 “The Humble Programmer”, Edsger W. Dijkstra a dit que “les tests de programmes peuvent être un moyen très efficace de montrer la présence de bogues, mais ils sont desespérement insuffisants pour prouver leur absence.” Cela ne signifie pas que nous ne devrions pas essayer de tester autant que possible !
La correction de nos programmes correspond à la mesure dans laquelle notre code fait ce que nous voulons qu’il fasse. Rust est concu avec un souci eleve de la correction des programmes, mais la correction est complexe et difficile a prouver. Le système de types de Rust prend en charge une grande partie de ce fardeau, mais le système de types ne peut pas tout détecter. C’est pourquoi Rust inclut la possibilité d’écrire des tests logiciels automatises.
Imaginons que nous ecrivions une fonction add_two qui ajouté 2 a n’importe quel nombre qui lui est passe. La signature de cette fonction accepte un entier en paramètre et retourné un entier en résultat. Quand nous implementons et compilons cette fonction, Rust effectue toutes les vérifications de types et d’emprunts que vous avez apprises jusqu’ici pour s’assurer que, par exemple, nous ne passons pas une valeur String ou une référence invalide à cette fonction. Mais Rust ne peut pas vérifier que cette fonction fera précisément ce que nous voulons, c’est-a-dire retourner le paramètre plus 2 plutot que, disons, le paramètre plus 10 ou le paramètre moins 50 ! C’est la que les tests entrent en jeu.
Nous pouvons écrire des tests qui vérifient, par exemple, que lorsque nous passons 3 à la fonction add_two, la valeur retournée est 5. Nous pouvons exécuter ces tests chaque fois que nous modifions notre code pour nous assurer que tout comportement correct existant n’a pas change.
Tester est une competence complexe : bien que nous ne puissions pas couvrir dans un seul chapitre chaque détail sur la maniere d’écrire de bons tests, dans ce chapitre nous aborderons les mecanismes des outils de test de Rust. Nous parlerons des annotations et des macros disponibles lors de l’écriture de vos tests, du comportement par défaut et des options fournies pour l’exécution de vos tests, et de la façon d’organiser les tests en tests unitaires et tests d’intégration.