Innanzitutto, siamo d'accordo sul fatto che "unit test" è spesso usato per coprire tutti i test automatici scritti da un programmatore, e che è inutile discutere su quale dovrebbe essere chiamato ogni test ....
Ho lavorato su un sistema in cui il software richiedeva molti input e ha elaborato una "soluzione" che doveva soddisfare alcuni vincoli, ottimizzando al contempo altri numeri. Non c'erano risposte giuste, quindi il software doveva solo dare una risposta ragionevole.
Lo ha fatto usando un sacco di numeri casuali per ottenere un punto di partenza, quindi usando un "alpinista" per migliorare il risultato. Questo è stato eseguito molte volte, scegliendo il miglior risultato. Un generatore di numeri casuali può essere seminato, in modo che fornisca sempre gli stessi numeri nello stesso ordine, quindi se il test ha impostato un seme, sappiamo che il risultato sarebbe lo stesso in ogni esecuzione.
Abbiamo fatto molti test che hanno fatto quanto sopra e verificato che i risultati fossero gli stessi, questo ci ha detto che non avevamo cambiato ciò che quella parte del sistema ha fatto per errore durante il refactoring ecc. Non ci ha detto nulla sulla correttezza di ciò che faceva quella parte del sistema.
Questi test erano costosi da mantenere, poiché ogni modifica al codice di ottimizzazione avrebbe interrotto i test, ma hanno anche trovato alcuni bug nel codice molto più grande che pre-elaborava i dati e post-elaborava i risultati.
Dato che abbiamo "deriso" il database, potremmo chiamare questi test "unit test", ma "l'unità" era piuttosto grande.
Spesso quando lavori su un sistema senza test, fai qualcosa di simile a quanto sopra, in modo che tu possa confermare che il tuo refactoring non cambi l'output; speriamo che migliori test vengano scritti per il nuovo codice!