J'ai un collègue qui écrit des tests unitaires pour des objets qui remplissent leurs champs avec des données aléatoires. Sa raison est que cela donne un plus large éventail de tests, puisqu'il testera un grand nombre de valeurs différentes, alors qu'un test normal n'utilise qu'une seule valeur statique.
Je lui ai donné un certain nombre de raisons différentes contre cela, les principales étant :
- des valeurs aléatoires signifient que le test n'est pas vraiment répétable (ce qui signifie également que si le test peut échouer de manière aléatoire, il peut le faire sur le serveur de compilation et casser la compilation).
- si c'est une valeur aléatoire et que le test échoue, nous devons a) corriger l'objet et b) nous forcer à tester cette valeur à chaque fois, afin de savoir que cela fonctionne, mais comme c'est aléatoire, nous ne savons pas quelle était la valeur.
Un autre collègue de travail a ajouté :
- Si je teste une exception, des valeurs aléatoires ne garantiront pas que le test aboutisse à l'état attendu.
- les données aléatoires sont utilisées pour le nettoyage d'un système et les tests de charge, mais pas pour les tests unitaires.
Quelqu'un peut-il ajouter des raisons supplémentaires que je peux lui donner pour qu'il arrête de faire ça ?
(Ou alternativement, est-ce une méthode acceptable d'écrire des tests unitaires, et moi et mon autre collègue avons tort) ?
39 votes
"les valeurs aléatoires signifient que le test n'est pas vraiment répétable" pas vrai, puisque les tets utiliseront des nombres pseudo-aléatoires. Fournissez la même graine initiale, obtenez la même séquence de tests "aléatoires".
19 votes
Anecdote : J'ai un jour écrit une classe d'exportation CSV, et des tests aléatoires ont révélé un bogue lorsque des caractères de contrôle étaient placés à la fin d'une cellule. Sans les tests aléatoires, je n'aurais jamais pensé à ajouter ce cas de test. A-t-il toujours échoué ? Non. Est-ce un test parfait ? Non. Est-ce qu'il m'a aidé à détecter et à corriger un bug ? Oui.
3 votes
Les tests peuvent aussi servir de documentation, pour expliquer ce que le code attend en entrée et ce qu'il attend en sortie. Avoir un test avec des données arbitraires claires peut être plus simple et plus explicatif qu'un code qui génère des données aléatoires.
0 votes
Si votre test unitaire échoue à cause d'une valeur générée de manière aléatoire, et que cette valeur ne fait pas partie d'une assertion, bonne chance pour déboguer votre test unitaire.