Lo è.
Anche se si eseguono solo test delle unità, non è insolito avere più codice all'interno dei test rispetto al codice effettivamente testato. Non c'è niente di sbagliato in questo.
Considera un semplice codice:
public void SayHello(string personName)
{
if (personName == null) throw new NullArgumentException("personName");
Console.WriteLine("Hello, {0}!", personName);
}
Quali sarebbero i test? Ci sono almeno quattro semplici casi da testare qui:
-
Il nome della persona è null
. L'eccezione è effettivamente lanciata? Sono almeno tre righe di codice di test da scrivere.
-
Il nome della persona è "Jeff"
. Riceviamo "Hello, Jeff!"
in risposta? Ecco quattro righe di codice di test.
-
Il nome della persona è una stringa vuota. Quale output ci aspettiamo? Qual è l'uscita effettiva? Domanda laterale: soddisfa i requisiti funzionali? Ciò significa altre quattro righe di codice per il test dell'unità.
-
Il nome della persona è abbastanza corto per una stringa, ma troppo lungo per essere combinato con "Hello, "
e il punto esclamativo. Cosa succede? ¹
Questo richiede molto codice di test. Inoltre, i pezzi più elementari di codice spesso richiedono un codice di configurazione che inizializza gli oggetti necessari per il codice in prova, che spesso porta anche a scrivere stub e mock, ecc.
Se il rapporto è molto grande, nel qual caso puoi verificare alcune cose:
-
Esiste la duplicazione del codice tra i test? Il fatto che si tratti di un codice di prova non significa che il codice debba essere duplicato (incollato) tra test simili: tale duplicazione renderà difficile il mantenimento di tali test.
-
Ci sono test ridondanti? Come regola generale, se si rimuove un test unitario, la copertura del ramo dovrebbe diminuire. In caso contrario, potrebbe indicare che il test non è necessario, poiché i percorsi sono già coperti da altri test.
-
Stai testando solo il codice che dovresti testare? Non ci si aspetta che test il framework sottostante delle librerie di terze parti, ma esclusivamente il codice del progetto stesso .
Con test fumo, test di integrazione e di sistema, test funzionali e di accettazione e prove di stress e carico, aggiungi ancora più codice di test, quindi avere quattro o cinque LOC di test per ogni LOC del codice reale non è qualcosa che dovresti preoccuparti circa.
Una nota su TDD
Se sei preoccupato per il tempo necessario per testare il tuo codice, potrebbe essere che tu stia sbagliando, cioè prima il codice, i test più tardi. In questo caso, TDD può aiutarti incoraggiandoti a lavorare in iterazioni di 15-45 secondi, passando da codice a test. Secondo i sostenitori di TDD, accelera il processo di sviluppo riducendo sia il numero di test che devi fare e, soprattutto, la quantità di codice aziendale da scrivere e specialmente riscrivi per i test.
¹ Lascia n essere la lunghezza massima di una stringa . Possiamo chiamare SayHello
e passare per riferimento una stringa di lunghezza n - 1 che dovrebbe funzionare bene. Ora, al passo Console.WriteLine
, la formattazione dovrebbe finire con una stringa di lunghezza n + 8, che si tradurrà in un'eccezione. Probabilmente, a causa dei limiti di memoria, anche una stringa contenente n / 2 caratteri causerà un'eccezione. La domanda che dovremmo porre è se questo quarto test sia un test unitario (sembra uno, ma può avere un impatto molto più alto in termini di risorse rispetto ai test unitari medi) e se verifica il codice effettivo o il framework sottostante.