Va bene evitare di testare le classi di base?

15

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

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

Va bene saltare la prova della classe base?

    
posta Nathan 29.07.2015 - 18:24
fonte

2 risposte

31

Per verificare se si dispone di test sufficienti o meno, è possibile verificare la copertura del codice e la copertura della filiale indotta dai test (magari utilizzando uno strumento di copertura, magari manualmente rivedendo i percorsi del codice o utilizzando un debugger).

Se si arriva alla conclusione, i test per le sottoclassi offrono una copertura sufficientemente alta per il codice delle classi di base, quindi aggiungere ulteriori test ovviamente non porterà 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 tua classe base" è che vuoi testare una funzione specifica di quella classe "in isolamento". A volte può essere più semplice progettare i casi di test direttamente per un metodo specifico, invece di testare solo quel metodo indirettamente chiamando i metodi delle sottoclassi che usano quel metodo.

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

    
risposta data 29.07.2015 - 18:44
fonte
2

Automated test were created for the programmers benefit, programmers were not created to serve the tests.

Abbiamo test per renderci più produttivi e ridurre il numero di "problemi" lamentati dai clienti.

Quindi, dato che si hanno test unitari orientati al comportamento che coprono tutti i casi in ciascuna sottoclasse, non c'è alcun vantaggio per il cliente di testare direttamente la classe base. Questo può essere confermato modificando un codice nella classe base e verificando se un test fallisce, ad es. diffondere una riga di codice o aggiungere un "non" a una "istruzione if". (Basta controllare che ogni riga di codice sia coperta dai test non è abbastanza buona.)

Ci rimane quindi la domanda se il test ti renderebbe più produttivo . Questo può accadere in alcuni modi.

  • Se pensi che il codice sia più chiaro, poiché il codice è scritto, in questo caso è improbabile.
  • Permettendo di testare alcuni codici nella classe base in isolamento, quindi esegui il debug in modo più rapido, ancora una volta improbabile nel caso in cui il codice funzioni già.
  • Permettendo di cambiare il codice nella classe base senza dover comprendere i dettagli della logica nelle sottoclassi - forse se stai refactoring il codice ???

Quindi dato che le sottoclassi stanno funzionando, non vedo alcun punto nello scrivere test diretti per la classe base. Non è così, non ci sarebbero stati benefici nello scrivere questi test in uno stato precoce.

    
risposta data 30.07.2015 - 00:23
fonte

Leggi altre domande sui tag