When major code changes occur (new set of POJOs, major application refactoring, etc.), unit tests tend to be commented out rather than reworked.
Cerco sempre di mantenere separato il refactoring e il cambio di funzionalità. Quando ho bisogno di fare entrambe le cose, di solito commetto il refactoring per primo.
Quando si refactoring il codice senza modificare la funzionalità, i test di unità esistenti dovrebbero contribuire a garantire che il refactoring non rotti accidentalmente la funzionalità. Quindi, per un tale impegno, ritengo che disabilitare o rimuovere i test unitari sia un segnale di avvertimento importante. Ad ogni sviluppatore che fa ciò dovrebbe essere detto di non farlo quando il codice è in fase di revisione.
È possibile che le modifiche che non cambiano la funzionalità causino comunque il fallimento dei test unitari a causa di test unitari difettosi. Se comprendi il codice che stai modificando, la causa di tali errori di test unitari è di solito immediatamente evidente e facile da risolvere.
Ad esempio, se una funzione accetta tre argomenti, un test unitario 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 dell'unità può essere esposto da un refactoring del codice testato, ma è facile da risolvere se si capisce cosa deve fare il codice e cosa sta testando il test unitario.
Quando si cambiano le funzionalità esistenti, di solito sarà necessario anche cambiare alcuni test unitari. In questo caso i test unitari aiutano a garantire che il codice modifichi la funzionalità come previsto e non abbia effetti collaterali indesiderati.
Quando si risolvono bug o si aggiungono nuove funzionalità, in genere è necessario aggiungere più test unitari. Per quelli può essere utile impegnare prima i test unitari e commettere la correzione di bug o nuove funzionalità successivamente. Ciò rende più semplice verificare che i nuovi test di unità non siano passati con il codice precedente ma passino con il codice più recente. Questo approccio non è del tutto privo di inconvenienti, quindi esistono anche argomenti a favore del commit simultaneo sia di nuovi test di unità che di aggiornamenti di codice.
Time is better spent on integration tests covering use cases, which make the smaller-scoped tests less/not-at-all important.
C'è qualche elemento di verità in questo. Se riesci a ottenere la copertura dei livelli inferiori dello stack software con test rivolti ai livelli superiori dello stack software, i test potrebbero essere più utili durante il refactoring del codice.
Non penso che troverai un accordo sulla distinzione esatta tra un test unitario e un test di integrazione. E non mi preoccuperei se hai un caso di test che uno sviluppatore chiama un test unitario e un altro chiama un test di integrazione, purché sia d'accordo sul fatto che sia un caso di test utile.