In che misura testate i componenti interni / privati di una classe / modulo / pacchetto / ecc? Li provi o provi semplicemente l'interfaccia con il mondo esterno? Un esempio di questi metodi interni è privato.
Ad esempio, immagina un parser di discesa ricorsivo , che ha diverse procedure interne (funzioni / metodi) chiamate da una procedura centrale. L'unica interfaccia con il mondo esterno è la procedura centrale, che prende una stringa e restituisce le informazioni analizzate. Le altre procedure analizzano parti diverse della stringa e vengono chiamate dalla procedura centrale o da altre procedure.
Naturalmente, è necessario testare l'interfaccia esterna chiamandola con stringhe di esempio e confrontandola con l'output analizzato a mano. Ma per quanto riguarda le altre procedure? Li testeresti individualmente per verificare che analizzino correttamente le loro sottostringhe?
Mi vengono in mente alcuni argomenti:
Pro :
- Più test è sempre meglio e questo può aiutare ad aumentare la copertura del codice
- Alcuni componenti interni potrebbero essere difficili da fornire input specifici (ad esempio casi limite) fornendo input all'interfaccia esterna
- Test più chiari. Se un componente interno ha un bug (risolto), un caso di test per quel componente chiarisce che il bug era in quel componente specifico
Contro :
- Il refactoring diventa troppo doloroso e richiede tempo. Per modificare qualsiasi cosa, è necessario riscrivere i test unitari, anche se gli utenti dell'interfaccia esterna non sono interessati
- Alcuni linguaggi e framework di test non lo consentono
Quali sono le tue opinioni?