Mi piace molto la risposta di @RobBingo perché suggerisce che la lotta verso il 100% può farti pulire o eliminare il codice inutilizzato. Quello che non ho visto nelle altre risposte è il senso di quando hai bisogno di una copertura elevata e quando non lo fai. Ho preso una pugnalata all'inizio di questo. Penso che l'aggiunta di dettagli a un grafico come questo sarebbe una ricerca più utile rispetto alla ricerca di un numero di copertura di prova corretto per tutto il codice.
100%
Per un'API pubblica, come le raccolte java.util, che non è accoppiata a un database e non restituisce HTML, penso che la copertura al 100% sia un obiettivo di partenza nobile, anche se ti accontenti del 90-95% a causa di tempo o altri vincoli. Aumentare la copertura del test dopo aver completato la funzione impone un esame più dettagliato rispetto ad altri tipi di revisione del codice. Se la tua API è molto popolare, la gente la userà, la sottoclusterà, la deserializzerà, ecc. In modi che non puoi aspettarti. Non vuoi che la loro prima esperienza sia trovare un bug o una supervisione del design!
90%
Per il codice dell'infrastruttura aziendale, che accetta strutture dati e restituisce strutture dati, il 100% è ancora probabilmente un buon obiettivo iniziale, ma se questo codice non è abbastanza pubblico da invitare un sacco di abusi, forse l'85% è ancora accettabile ?
75%
Per il codice che accetta e restituisce Stringhe, penso che il test delle unità sia molto più fragile, ma può essere comunque utile in molte situazioni.
50% o meno
Odio scrivere test per funzioni che restituiscono HTML perché è così fragile. Cosa succede se qualcuno cambia il CSS, il JavaScript o l'intero blob di HTML e l'inglese che si restituisce non ha senso per gli utenti umani umani? Se è possibile trovare una funzione che utilizza un sacco di logica aziendale per produrre un po 'di HTML, questo potrebbe valere la pena di testare. Ma la situazione inversa potrebbe non valere la pena di testare affatto.
Vicino allo 0%
Per alcuni codici, la definizione di "corretto" è "ha senso per l'utente finale". Esistono test non tradizionali che è possibile eseguire su questo codice, ad esempio il controllo automatico della grammatica o la convalida HTML dell'output. Ho persino impostato le istruzioni grep per le piccole incongruenze che comunemente cadono in preda al lavoro, come dire "Login" quando il resto del sistema lo chiama "Accedi". Quest'uomo non è strettamente un test unitario, ma un modo utile per individuare i problemi senza aspettarsi output specifici.
In definitiva, però, solo un umano può giudicare ciò che è sensibile agli umani. I test unitari non possono aiutarti. A volte ci vogliono diversi umani per giudicare in modo accurato.
Assoluto 0%
Questa è una categoria triste e mi sento meno di una persona per averlo scritto. Ma in qualsiasi progetto sufficientemente ampio ci sono buchi di coniglio che possono succhiare persone-settimane senza fornire alcun vantaggio economico.
Ho acquistato un libro perché ha affermato di mostrare come eseguire automaticamente il mocking dei dati per testare Hibernate. Ma ha testato solo Hibernate HQL e query SQL. Se devi fare un sacco di HQL e SQL, non hai davvero il vantaggio di Hibernate. C'è una forma di database in memoria di Hibernate, ma non ho investito il tempo per capire come usarlo efficacemente nei test. Se dovessi farlo funzionare, vorrei avere una copertura di prova elevata (50% -100%) per qualsiasi logica di business che calcola la roba navigando in un grafo di oggetti che fa in modo che Hibernate esegua alcune query. La mia capacità di testare questo codice è vicina allo 0% in questo momento e questo è un problema. Quindi migliorano la copertura dei test in altre aree del progetto e cerco di preferire le funzioni pure rispetto a quelle che accedono al database, in gran parte perché è più facile scrivere test per tali funzioni. Tuttavia, alcune cose non possono, o non dovrebbero essere testate.