Va bene evitare di testare le classi di base?


15

Ho una classe base con una buona dose di "meta programmazione" per dargli la flessibilità / astrazione di cui ha bisogno per essere piuttosto generica.

Ho molte sottoclassi che usano i metodi comuni nella classe base e ho test di unità orientati al comportamento che coprono tutti i casi in ciascuna sottoclasse.

Va bene saltare il test della classe base?


1
Una cosa che a volte faccio quando inizio a farmi questa domanda è cercare di violare il codice. Lancia un input non valido, specifica valori di configurazione errati, ecc.
Zymus

Risposte:


31

Per verificare se hai abbastanza test o meno, puoi controllare la copertura del tuo codice e la copertura del tuo ramo indotta dai test (magari usando uno strumento di copertura, magari manualmente rivedendo i percorsi del codice o usando un debugger).

Se arrivate alla conclusione, i test per le sottoclassi offrono una copertura sufficientemente elevata per il codice delle classi di base, quindi l'aggiunta di ulteriori test ovviamente non vi darà molti vantaggi. D'altra parte, se ci sono percorsi di codice che puoi testare solo aggiungendo test specifici usando direttamente la classe base, allora dovresti seguire questa strada.

Un altro possibile motivo per "testare direttamente la classe base" è che si desidera testare una funzione specifica di quella classe "in isolamento". A volte può essere più semplice progettare casi di test direttamente per un metodo specifico, invece di testarlo solo indirettamente chiamando i metodi delle sottoclassi che utilizzano quel metodo.

Si noti che quando si dispone di una classe di base generica per la quale lo scenario di utilizzo tipico è derivare una sottoclasse, la classe di base è probabilmente astratta. Quindi per testare una tale classe è necessario fare comunque una derivazione. Per questa situazione, testare "la classe base direttamente" potrebbe significare aggiungere una derivazione speciale solo a scopo di test, ovviamente.


Sì, sono d'accordo con i test unitari diretti sulla classe base per i metodi più tangibilmente definiti. Quello che non volevo fare è testare tutta la meta-programmazione poiché i test unitari sulle sottoclassi testano implicitamente quella roba.
Nathan,

4
Progettare una classe che estende la classe base / astratta che esiste solo all'interno della directory di test e serve solo per esporre / creare un'istanza della classe base è un approccio perfettamente legittimo e ragionevole per ottenere la copertura adeguata della classe base e garantire che i metodi sottostanti sono funziona correttamente isolando quelle classi più complesse che vengono utilizzate.

@MichaelT: sì. La mia risposta suona come se avessi un'opinione diversa a riguardo?
Doc Brown,

@DocBrown per niente - hai chiaramente articolato quel punto. Stavo solo aggiungendo ulteriori spiegazioni che avrei scritto nella mia risposta (se non l'avessi già detto). Non voglio scrivere una risposta che sarebbe iniziata "Sono d'accordo con tutto ciò che ha detto Doc, ma voglio specificamente chiamare e scrivere di più su ..."

2

Test automatici sono stati creati a vantaggio dei programmatori, i programmatori non sono stati creati per servire i test.

Abbiamo test per renderci più produttivi e per ridurre il numero di "problemi" di cui i clienti si lamentano.

Pertanto, poiché si dispone di unit test orientati al comportamento che coprono tutti i casi in ciascuna sottoclasse, non vi è alcun vantaggio per il cliente che verifica direttamente la classe base. Ciò può essere confermato cambiando un po 'di codice nella classe base e vedendo se un test fallisce, ad es. Se si ordina una riga di codice o si aggiunge un "non" a un'istruzione "if". (Il solo controllo che ogni riga di codice sia coperta dai test non è abbastanza buono.)

Ci viene quindi chiesto se il test ti renderebbe più produttivo . Questo può accadere in alcuni modi.

  • Lasciarti pensare più chiaramente al codice - poiché il codice è scritto, è improbabile in questo caso.
  • Permettendo di testare un po 'di codice nella classe base in isolamento, quindi esegui il debug più velocemente, ancora una volta improbabile nel caso in cui il codice sta già funzionando.
  • Permettendo di modificare il codice nella classe base senza dover comprendere i dettagli della logica nelle sottoclassi - forse se si sta eseguendo il refactoring del codice ???

Quindi, dato che le sottoclassi funzionano, non vedo alcun motivo nello scrivere test diretti per la classe base. Questo non è oggi, che non ci sarebbero stati benefici nello scrivere questi test in una fase precoce.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.