Credo che questo sia un malinteso in qualsiasi modo mi venga in mente.
Il codice di test che verifica il codice di produzione non è affatto simile. Dimostrerò in Python:
def multiply(a, b):
"""Multiply ``a`` by ``b``"""
return a*b
Quindi un semplice test sarebbe:
def test_multiply():
assert multiply(4, 5) == 20
Entrambe le funzioni hanno una definizione simile ma entrambe fanno cose molto diverse. Nessun codice duplicato qui. ;-)
Si verifica inoltre che le persone scrivano test duplicati essenzialmente con un'asserzione per funzione di test. Questa è follia e ho visto persone farlo. Questa è una cattiva pratica.
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
Immagina di farlo per oltre 1000 righe di codice efficaci. Al contrario, esegui il test in base alla "funzione":
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
Ora, quando le funzionalità vengono aggiunte / rimosse, devo solo considerare di aggiungere / rimuovere una funzione di test.
Potresti aver notato che non ho applicato i for
loop. Questo perché ripetere alcune cose è buono. Quando avrei applicato i loop, il codice sarebbe molto più breve. Ma quando un'asserzione fallisce potrebbe offuscare l'output mostrando un messaggio ambiguo. In questo caso, i test saranno meno utili e sarà necessario un debugger per verificare dove le cose vanno male.