Nos meus testes de unidade, geralmente jogo valores arbitrários no meu código para ver o que ele faz. Por exemplo, se eu souber que foo(1, 2, 3)
deve retornar 17, eu poderia escrever o seguinte:
assertEqual(foo(1, 2, 3), 17)
Esses números são puramente arbitrários e não têm um significado mais amplo (eles não são, por exemplo, condições de contorno, embora eu também teste neles). Eu lutaria para criar bons nomes para esses números, e escrever algo como const int TWO = 2;
é obviamente inútil. Tudo bem escrever os testes assim ou devo fatorar os números em constantes?
Em Todos os números mágicos são criados da mesma forma? , aprendemos que os números mágicos são bons se o significado for óbvio no contexto, mas, nesse caso, os números realmente não têm significado algum.
const int TWO = 2;
é ainda pior do que apenas usar 2
. Está em conformidade com a redação da regra com a intenção de violar seu espírito.
foo
, não significaria nada e, portanto, os parâmetros. Mas, na realidade, eu tenho certeza que a função não tem esse nome, e os parâmetros não têm nomes bar1
, bar2
e bar3
. Faça um exemplo mais realista em que os nomes tenham significado e faça muito mais sentido discutir se os valores dos dados de teste também precisam de um nome.
1, 2, 3
forem índices de matriz 3D em que você armazenou anteriormente o valor17
, acho que esse teste seria dândi (desde que você também tenha alguns testes negativos). Mas se é o resultado de um cálculo, você deve se certificar de que quem lê este teste vai entender por quefoo(1, 2, 3)
deve ser17
, e números mágicos provavelmente não vai alcançar essa meta.