Dans mes tests unitaires, je jette souvent des valeurs arbitraires sur mon code pour voir ce qu'il fait. Par exemple, si je sais que cela foo(1, 2, 3)
est censé renvoyer 17, je pourrais écrire ceci:
assertEqual(foo(1, 2, 3), 17)
Ces chiffres sont purement arbitraires et n’ont pas une signification plus large (ils ne sont pas, par exemple, des conditions aux limites, bien que je les vérifie également). J'aurais du mal à trouver de bons noms pour ces chiffres, et écrire quelque chose comme cela const int TWO = 2;
est évidemment inutile. Est-ce correct d'écrire les tests de cette manière, ou devrais-je factoriser les nombres en constantes?
Dans Tous les nombres magiques créés sont-ils les mêmes? , nous avons appris que les nombres magiques sont acceptables si la signification est évidente dans le contexte, mais dans ce cas, les nombres n’ont aucune signification.
const int TWO = 2;
est encore pire que de simplement utiliser 2
. C'est se conformer à la formulation de la règle avec l'intention de violer son esprit.
foo
, cela ne signifierait rien, et donc les paramètres. Mais en réalité, je suis assez sûr que la fonction n'a pas ce nom, et les paramètres n'ont pas les noms bar1
, bar2
et bar3
. Créez un exemple plus réaliste dans lequel les noms ont une signification. Par conséquent , il est beaucoup plus logique de déterminer si les valeurs des données de test nécessitent également un nom.
1, 2, 3
sont des indices de tableau 3D dans lesquels vous avez précédemment stocké la valeur17
, alors je pense que ce test serait dandy (tant que vous avez également des tests négatifs). Mais si elle est le résultat d'un calcul, vous devez vous assurer que toute personne lisant ce test comprendra pourquoifoo(1, 2, 3)
devrait être17
, et les nombres magiques ne sera probablement pas atteindre cet objectif.