Strumenti che possono catturare "copertura falsa"?

5

Scenario ipotetico: il codebase viene esercitato da test unitari eseguiti da un build-bot TeamCity, che utilizza anche lo strumento dotCover incorporato per fornire le metriche di copertura. La compilazione fallirà se viene coperto meno del X% del codice.

Uno sviluppatore senza scrupoli che esegue NCrunch (o un commit pre-testato in TC) vede che il prossimo check-in ridurrà la percentuale di copertura sotto la soglia e interromperà la build, perché non ha scritto buoni test unitari (TDD o altro). Quindi, scrive un nuovo test che esegue alcune righe di codice che gli spettacoli NCrunch non sono coperti, ma non fa affermazioni sul loro comportamento. I test passano per impostazione predefinita (poiché il codice eseguito non fa eccezioni), la copertura rimane al di sopra del X% e per trovare il problema, qualcuno deve scoprire il test, ispezionarlo e vedere che non ci sono asserzioni (o asserzioni significative) fatte durante la sua esecuzione .

Poiché al momento non abbiamo un processo di revisione del codice e sarebbe dannoso per la produttività eseguire revisioni prima di ogni commit, voglio che questo comportamento interrompa la creazione. Se il test runner esegue un metodo contrassegnato con un attributo [Test] (stiamo usando NUnit) e, al completamento, vede che il codice non ha effettuato chiamate ai metodi Assert di NUnit, né ha lanciato ExpectedException, TC dovrebbe aumentare Cain. Idealmente, lo strumento sarebbe abbastanza intelligente da scoprire anche che tutte le asserzioni sono vere per definizione, come Assert.AreEqual(1,1); , e falliscono la costruzione in un modo simile.

C'è qualcosa di "preconfezionato" che posso collegare a TeamCity, o un modo in cui posso configurare le sue metriche di copertura / copertura integrate per trovare questo tipo di comportamento scorretto, a meno di eseguire un'analisi del codice statico personalizzata ? Ovviamente lo troveremo alla fine , ma nel nostro ambiente (piccolo team di sviluppo interno) potrebbero esserci solo uno o due sviluppatori che hanno familiarità con l'intera base di codice di una determinata applicazione, e quindi questo palese terminare i controlli di qualità dei test non può accadere fino a quando il responsabile non è più da tempo e qualcun altro assume la proprietà primaria del codebase.

    
posta KeithS 10.07.2013 - 19:19
fonte

2 risposte

8

IMHO Se questo accade abbastanza da essere alla ricerca di uno strumento:

  • necessità di rivalutare la tua politica (stai chiedendo test su qualcosa che resiste ai test o che i test forniscono poco valore o su un ramo che è troppo presto nel processo per avere sempre le cose a posto per scrivere buoni cablaggi di test, dummys and mocks)
  • o rivaluta la composizione della tua squadra (i test sono appropriati qui, ma i tuoi colleghi non sono molto bravi / onesti / qualunque cosa)

Personalmente ho sperimentato molto più del primo caso rispetto al secondo caso, quindi in genere guardo solo la copertura del codice quando un ramo di funzionalità sta per essere unito al master / main.

Ci sono molti altri modi per sconfiggere la copertura del codice di quanti siano gli strumenti per calcolarlo o applicarlo, quindi questo è il momento che sceglierei di spendere altrove.

    
risposta data 10.07.2013 - 19:34
fonte
13

Solo un umano sarà in grado di distinguere tra un "buon test" e un " tautologia test ".

Anche se le asserzioni sono incluse nel test, cosa significa che sono significative? Verifica che il valore restituito non sia abbastanza nullo? O il test deve verificare particolari valori del risultato? Anche se la cosa giusta è testata, il test stesso è scritto in modo orribile / confuso / non mantenibile? E come è possibile ottenere uno strumento automatico per catturarlo?

Ho eseguito un progetto di più di 30 anni per anni e eseguiamo la revisione del codice per ogni completamento di attività. Un'attività può essere costituita da più commit, ma un compito è quasi sempre solo pochi giorni di lavoro. Non c'è modo che la revisione del codice "ci abbia rallentato".

    
risposta data 10.07.2013 - 19:35
fonte

Leggi altre domande sui tag