Per prima cosa, non mi limito quasi mai a sedermi e a scrivere test di unità. I test unitari sono un mezzo per un fine, non un fine a se stessi. Sono un modo per rispondere "questo codice fa il compito di base che si suppone."
Ad esempio, alcune persone scriveranno una funzione, quindi apriranno una sessione interattiva per testarla su alcuni valori e assicurarsi che funzioni:
def fact x
if x == 0
1
else
x * fact(x-1)
end
end
>> fact 10
=> 3628800
>> fact 7
=> 5040
Ma ora scopri un bug:
>> fact -1
SystemStackError: stack level too deep
from (irb):2:in 'fact'
from (irb):5:in 'fact'
from (irb):10
Quindi lo aggiusti:
def fact x
if x < 0
raise "Can't take the factorial of a negative number"
elsif x == 0
1
else
x * fact(x-1)
end
end
>> fact -1
RuntimeError: Can't take the factorial of a negative number
from (irb):3:in 'fact'
from (irb):10
Ma ora dovresti testare per assicurarti che funzioni ancora:
>> fact 10
=> 3628800
>> fact 7
=> 5040
Come puoi vedere, continui a ripetere gli stessi test ... e devi confrontare i risultati visivamente. Il test unitario è un modo per evitare la ripetizione in questo caso; riduce il lavoro che devi fare. E mentre questo è un piccolo esempio stupido, nel mondo reale diventa sempre più importante e sempre più difficile da testare manualmente. Ciò significa, ovviamente, che le persone semplicemente non testano i singoli componenti; testano solo l'intero programma. Ma poi spuntano gli errori, e sono molto più difficili da trovare. O gli errori si verificano, e sono corretti, ma qualcuno introduce di nuovo lo stesso bug, perché nessuno ha aggiunto un caso di test per assicurarsi che ciò non accadesse. O qualcuno guarda un grande pezzo di codice e dice "Non ho idea di cosa dovrebbe fare, dal momento che non è documentato e non ha test ... se risolvo questo bug, non ho idea se romperò qualcos'altro a seconda, forse lo riscriverò da capo. "
I test unitari riducono tutto il lavoro extra in questi casi. Il modo migliore per renderli divertenti è assicurarsi che le persone capiscano tutto il lavoro che stanno sostituendo e la flessibilità extra derivante dalla conoscenza di ciò che ogni pezzo di codice dovrebbe fare. In una certa misura, le persone hanno bisogno di avere un po 'più di esperienza con la scrittura e di mantenere un ampio codice di base per capire quanto sia importante il test unitario; se tutto il loro codice è qualcosa che scrivono una volta e buttano via, non lo capiranno mai.
E i test unitari non dovrebbero essere scritti dopo il fatto, come un lavoro extra una volta che hai il codice che "sai" già funziona. I test unitari dovrebbero essere scritti prima, o per lo meno (dato che a volte si dimentica di scriverli prima) subito dopo aver scritto il codice in questione. Questo è chiamato sviluppo basato su test e può aiutare a migliorare le API; se scrivi i test che eseguono prima le API, imparerai dove le API sono difficili da usare prima ancora di scrivere il codice, e puoi riprogettare molto più facilmente rispetto a quando aggiungerai i test solo in seguito.