Credo che sia un malinteso qualunque sia il mio modo di pensare.
Il codice di test che testa 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 è 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 linee di codice efficaci. Invece si prova su una base per 'funzionalità':
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 for
loops. Questo perché ripetere alcune cose va bene. Quando avrei applicato loops il codice sarebbe molto più breve. Ma quando un'affermazione fallisce potrebbe offuscare l'output mostrando un messaggio ambiguo. Se questo si verifica, i tuoi test saranno meno utili e tu vorrà avere bisogno di un debugger per ispezionare dove le cose vanno male.