Quando si verificano importanti modifiche al codice (nuova serie di POJO, refactoring delle applicazioni principali, ecc.), I test unitari tendono a essere commentati anziché rielaborati.
Cerco sempre di mantenere separati il refactoring e il cambio di funzionalità. Quando devo fare entrambe le cose, di solito commetto prima il refactoring.
Quando si effettua il refactoring senza modificare la funzionalità, si suppone che i test unitari esistenti contribuiscano a garantire che il refactoring non interrompa accidentalmente la funzionalità. Quindi per un tale impegno considererei la disabilitazione o la rimozione dei test unitari come un segnale di avvertimento importante. A qualsiasi sviluppatore che lo fa dovrebbe essere detto di non farlo quando il codice viene rivisto.
È possibile che i cambiamenti che non cambiano la funzionalità causino il fallimento dei test unitari a causa di test unitari difettosi. Se si capisce il codice che si sta modificando, la causa di tali guasti ai test unitari è di solito immediatamente ovvia e facile da risolvere.
Ad esempio, se una funzione accetta tre argomenti, un unit test che copre l'interazione tra i primi due argomenti per la funzione potrebbe non aver avuto cura di fornire un valore valido per il terzo argomento. Questo difetto nel test unitario può essere esposto da un refactoring del codice testato, ma è facile da risolvere se si capisce che cosa deve fare il codice e cosa sta testando il test unitario.
Quando si modificano le funzionalità esistenti, di solito sarà necessario modificare anche alcuni test unitari. In questo caso i test unitari aiutano a garantire che il codice cambi la funzionalità come previsto e che non abbia effetti collaterali indesiderati.
Quando si correggono i bug o si aggiungono nuove funzionalità, di solito è necessario aggiungere più unit test. Per quelli può essere utile eseguire prima i test unitari e successivamente la correzione dei bug o le nuove funzionalità. Ciò semplifica la verifica che i nuovi test unitari non siano stati superati con il codice precedente ma siano passati con il codice più recente. Questo approccio non è del tutto privo di inconvenienti, quindi esistono anche argomenti a favore del commit simultaneo di nuovi test unitari e aggiornamenti del codice.
È meglio dedicare tempo ai test di integrazione relativi ai casi d'uso, che rendono i test di portata minore meno / per niente importanti.
C'è qualche elemento di verità in questo. Se è possibile ottenere una copertura degli strati inferiori dello stack software con test mirati agli strati superiori dello stack software, i test potrebbero essere più utili durante il refactoring del codice.
Non credo che troverai un accordo sull'esatta distinzione tra un test unitario e un test di integrazione. E non mi preoccuperei se hai un caso di test che uno sviluppatore chiama un unit test e un altro chiama un test di integrazione, purché possano concordare che si tratta di un utile test case.