the point of unit tests is to test units of code in isolation.
Martin Fowler su Test unitario
Unit testing is often talked about in software development, and is a term that I've been familiar with during my whole time writing programs. Like most software development terminology, however, it's very ill-defined, and I see confusion can often occur when people think that it's more tightly defined than it actually is.
Che Kent Beck ha scritto in Sviluppo guidato dal test, per esempio
I call them "unit tests", but they don't match the accepted definition of unit tests very well
Qualsiasi affermazione del "punto di test unitario" dipenderà in larga misura dalla definizione di "test unitario".
Se la tua prospettiva è che il tuo programma è composto da molte piccole unità che dipendono l'una dall'altra, e se ti limiti a uno stile che verifica ciascuna unità in modo isolato, allora un sacco di test doppi test è una conclusione inevitabile.
I consigli contraddittori che vedi provengono da persone che operano con un diverso insieme di ipotesi.
Ad esempio, se stai scrivendo test per supportare gli sviluppatori durante il processo di refactoring, e dividere una unità in due è un refactoring che dovrebbe essere supportato, quindi qualcosa deve dare. Forse questo tipo di test ha bisogno di un nome diverso? O forse abbiamo bisogno di una diversa comprensione di "unità".
Potresti voler confrontare:
Can a test that tests the Person.calculate method without mocking the Calculator dependency (given, that the Calculator is a lightweight class that does not access "the outside world") be considered a unit test?
Penso che sia la domanda sbagliata da porre; è ancora una discussione su labels , quando credo che ciò a cui teniamo veramente sono properties .
Quando introduco modifiche al codice, non mi interessa l'isolamento dei test: so già che "l'errore" è da qualche parte nel mio attuale stack di modifiche non verificate. Se eseguo spesso i test, limito la profondità di tale stack e trovando l'errore è banale (nel caso estremo, i test vengono eseguiti dopo ogni modifica - la profondità massima dello stack è uno). Ma eseguire i test non è l'obiettivo - è un'interruzione - quindi c'è un valore nel ridurre l'impatto dell'interruzione. Un modo per ridurre l'interruzione è garantire che i test siano rapidi ( Gary Bernhardt suggerisce 300 ms , ma non ho capito come farlo nelle mie circostanze).
Se invocare Calculator::add non aumenta significativamente il tempo richiesto per eseguire il test (o altre proprietà importanti per questo caso d'uso), allora non mi preoccuperei di usare un test double - non lo fa fornire benefici che vanno fuori dai costi.
Notate qui le due ipotesi: un essere umano come parte della valutazione dei costi e lo short stack di cambiamenti non verificati nella valutazione dei benefici. Nelle circostanze in cui tali condizioni non reggono, il valore di "isolamento" cambia un po '.
Vedi anche Hot Lava , di Harry Percival.