Je crois que c'est une idée fausse de toute façon à laquelle je peux penser.
Le code de test qui teste le code de production n'est pas du tout similaire. Je vais démontrer en python:
def multiply(a, b):
"""Multiply ``a`` by ``b``"""
return a*b
Un test simple serait alors:
def test_multiply():
assert multiply(4, 5) == 20
Les deux fonctions ont une définition similaire mais les deux font des choses très différentes. Pas de code en double ici. ;-)
Il arrive également que des personnes écrivent des tests en double ayant essentiellement une assertion par fonction de test. C'est de la folie et j'ai vu des gens faire ça. C'est une mauvaise pratique.
def test_multiply_1_and_3():
"""Assert that a multiplication of 1 and 3 is 3."""
assert multiply(1, 3) == 3
def test_multiply_1_and_7():
"""Assert that a multiplication of 1 and 7 is 7."""
assert multiply(1, 7) == 7
def test_multiply_3_and_4():
"""Assert that a multiplication of 3 and 4 is 12."""
assert multiply(3, 4) == 12
Imaginez faire cela pour plus de 1000 lignes de code efficaces. Au lieu de cela, vous testez par «fonctionnalité»:
def test_multiply_positive():
"""Assert that positive numbers can be multiplied."""
assert multiply(1, 3) == 3
assert multiply(1, 7) == 7
assert multiply(3, 4) == 12
def test_multiply_negative():
"""Assert that negative numbers can be multiplied."""
assert multiply(1, -3) == -3
assert multiply(-1, -7) == 7
assert multiply(-3, 4) == -12
Maintenant, lorsque des fonctionnalités sont ajoutées / supprimées, je n'ai plus qu'à envisager d'ajouter / supprimer une fonction de test.
Vous avez peut-être remarqué que je n'ai pas appliqué de for
boucles. C'est parce que répéter certaines choses est bon. Quand j'aurais appliqué des boucles, le code serait beaucoup plus court. Mais lorsqu'une assertion échoue, elle peut masquer la sortie affichant un message ambigu. Si cela se produit, vos tests seront moins utiles et vous aurez besoin d'un débogueur pour inspecter les problèmes.