Il concetto di "porte di qualità" nei test del software

7

Usiamo SonarQube per il test della qualità del codice. Verifica la qualità del codice e non la funzione del codice. Ha il concetto di porte di qualità, quindi puoi impostare ad esempio un gate di qualità del 90%, il che significa che qualcosa di oltre il 90% di qualità è considerato un passaggio.

Alcuni qui amano questa idea e hanno deciso di applicarla ai test funzionali e unitari. Dopo aver eseguito i nostri test funzionali e unitari, controlliamo quale percentuale è passata e promuoviamo il codice nel prossimo ambiente se passa una percentuale sufficientemente alta di test. Affinché il codice venga promosso in produzione, la percentuale passata deve essere 100.

Per me, i test stessi sono la porta della qualità. I test non dovrebbero mai fallire. Se i test stanno fallendo, c'è un rischio introdotto nell'intera applicazione e deve essere risolto subito.

Sto facendo fatica a vedere un argomento valido per richiedere che solo una certa percentuale di test funzionali e di unità passi mentre il codice viaggia attraverso i nostri diversi ambienti sulla strada della produzione. Qualcuno può fornirne uno?

    
posta Fo. 14.03.2016 - 18:26
fonte

2 risposte

9

Una suite di test dovrebbe passare solo se tutti i test passano. Altrimenti, i test diventano inutili. Che cos'è un fallimento importante, che cos'è un errore che può essere ignorato? Il risultato sarebbe che tutti i fallimenti del test verrebbero ignorati dopo un po '. Bad.

C'è un'eccezione a questa: una suite di test può contenere test che notoriamente falliscono, poiché la funzionalità necessaria deve ancora essere implementata o il bug deve ancora essere corretto. Tali test sono preziosi perché documentano chiaramente un bug. Ma poiché il loro fallimento non sarebbe una regressione, il loro fallimento non dovrebbe fallire nell'intera suite di test (al contrario, se iniziano a passare ciò significherebbe che la tua suite di test non è aggiornata con il tuo codice). Idealmente, il tuo framework di test ha un concetto di tali "test TODO".

Le metriche di qualità sono una bestia diversa. Se una metrica di qualità supera una soglia, ciò indica che qualcosa è probabilmente ma non necessariamente maturo per un refactoring. Ma alcune "violazioni" potrebbero andare bene nel contesto di quel codice. Finché alcune regioni di codice possono essere escluse da specifici strumenti di analisi, la verifica di tale metrica di qualità è OK. Ovviamente, qualsiasi esclusione esplicita sarebbe una bandiera rossa in una revisione del codice e soggetta a un controllo più approfondito, ma mantenere un tale portello di fuga aperto per circostanze eccezionali è importante.

In particolare, l'idea di richiedere una qualità crescente come artefatto viaggia attraverso la pipeline di rilascio non è necessariamente buona. Da dove viene l'incremento qualitativo necessario? Dagli sviluppatori che migliorano il codice e reinviano un nuovo artefatto nella pipeline. Poiché la metrica di qualità necessaria per attraversare l'intera pipeline è conosciuta in anticipo, la presentazione di qualsiasi artefatto senza questa qualità è una perdita di tempo. Allora perché lo stai facendo? Probabilmente, le fasi della pipeline forniscono un feedback sul programma che è utile prima della versione principale. Per ottenere questo feedback, devi inviare il codice anche quando non hai intenzione di farlo attraverso la pipeline. Di nuovo, i falsi negativi sono cattivi. Tale flusso di lavoro non è adatto per un modello di pipeline e il feedback dovrebbe essere disponibile indipendentemente.

Questo non significa che dovresti rinunciare al gating di qualità. Ma se il tuo obiettivo è una metrica al 100% per un rilascio, la metrica di qualità corrente diventa un indicatore di progresso per il tuo progetto, come un grafico di burn down per il debito tecnico.

    
risposta data 14.03.2016 - 18:55
fonte
1

Vorrei aggiungere qualcosa alla buona risposta di amon:

...the tests themselves are the quality gate.

Sono a gate del tuo codice di produzione, ma i test stessi possono avere le proprie (potenziali) misure di qualità, tra cui:

  • Il codice di installazione / rimozione comune è clonato in ciascun test? O è posizionato correttamente in qualsiasi metodo di installazione / ClassInitialize / TestInitialize, ecc. Supportato dalla tua suite di test?
    • Se il codice in prova non utilizza in modo sufficiente i contratti, il test copre un intervallo accettabile di parametri ove necessario? I valori dei bordi vengono testati? Collezioni Null? Collezioni vuote? ecc. Anche con percentuali di copertura elevate, potresti non esercitare il codice sufficientemente.
    • I test impiegano troppo tempo per essere eseguiti?
    • Stanno anche correndo? Oppure qualcuno ha causato il passaggio della suite contrassegnando molti test con @Ignore ?
    • Naturalmente, la percentuale di copertura è accettabile?

Questi attributi, e molti altri ancora, sono cose che potresti decidere di misurare sulle tue suite di test (alcune delle quali sono supportate da SonarQube) per avere la certezza che non stai solo testando, ma testando in modo efficace.

    
risposta data 14.03.2016 - 22:07
fonte