Dovrei interrompere intenzionalmente la build quando viene rilevato un bug in produzione?


410

Mi sembra ragionevole che se un utente rileva un bug grave nella produzione, un test unitario non funzionante dovrebbe essere aggiunto per coprire quel bug, interrompendo così intenzionalmente la build fino a quando il bug non viene risolto. La mia logica per questo è che la build avrebbe dovuto fallire da sempre , ma non era dovuta a una copertura dei test automatizzata inadeguata.

Molti dei miei colleghi non sono d'accordo sul dire che un test unitario fallito non dovrebbe essere verificato. Sono d'accordo con questo punto di vista in termini di normali pratiche TDD, ma penso che i bug di produzione dovrebbero essere gestiti in modo diverso - dopo tutto perché dovresti voler consentire una build per avere successo con difetti noti?

Qualcun altro ha dimostrato strategie per gestire questo scenario? Capisco che rompere intenzionalmente la build potrebbe essere dannoso per gli altri membri del team, ma ciò dipende interamente da come stai usando le filiali.


75
+1; una domanda molto provocatoria. Vedo entrambe le parti.
Carl Manaster,

28
Usi il termine "build" per includere "i test", che non è una comprensione universale.
Jay Bazuzi,

19
Se stai facendo TDD scriverai il test fallito, quindi aggiusterai il codice e poi fare il check-in . In questo modo eviti una build rotta.
dietbuddha,

7
Con la stessa logica è necessario chiudere le istanze live dei client fino a quando non si risolve il problema. No, non dovresti interrompere la build. Consenti allo sviluppatore che gestisce il bug di aggiungere il test unitario e il codice cambia insieme. Non è necessario arrestare l'intero processo.
Thanos Papathanasiou,

Risposte:


412

La nostra strategia è:

Controlla un test fallito, ma annotalo con @Ignore("fails because of Bug #1234").

In questo modo, il test è lì, ma la build non si interrompe.

Ovviamente si nota il test ignorato nel db bug, quindi @Ignoreviene rimosso una volta che il test è stato risolto. Questo serve anche come semplice controllo per la correzione dei bug.

Il punto di rompere la build in caso di test falliti non è in qualche modo mettere la squadra sotto pressione, ma avvisarli di un problema. Una volta che il problema è stato identificato e archiviato nel DB dei bug, non ha senso eseguire il test per ogni build: sai che fallirà.

Ovviamente, il bug dovrebbe essere comunque corretto. Ma programmare la correzione è una decisione commerciale, e quindi non è in realtà la preoccupazione del dev ... Per me, una volta che un bug è stato archiviato nel DB dei bug, non è più un mio problema, fino a quando il cliente / proprietario del prodotto non mi dice che lo vogliono corretto .


150
+1 Penso che tu abbia colto nel segno con "programmare la correzione è una decisione commerciale" - come sviluppatore non è il mio giudizio per decidere se un bug rompe la build.
MattDavey,

22
Penso che questa sia una soluzione molto sensata. Soprattutto se il prossimo a controllare un codice minore, improvvisamente riceve un avviso di "test fallito" e pensa che sia qualcosa che ha fatto.
Holger,

14
"Per me, una volta che un bug è stato archiviato nel DB bug, non è più un mio problema" ... +1
Jake Berger

20
@anon Exept presso Toyota. Un operatore di linea rileva un difetto, quindi tira il cavo andon e l'intero impianto si ferma e la gestione si interrompe e la linea non viene riavviata fino a quando il problema non viene risolto. Google Andon Cord. Non è un nuovo concetto. vedi: startuplessonslearned.com/2008/09/…
Christopher Mahan,

4
@AndresJaanTack: questo dipenderà ovviamente dalla tua metodologia, ma in generale non sarei d'accordo. Almeno in un contesto aziendale, la pianificazione del lavoro è una decisione aziendale, che include la correzione di errori . A volte, una nuova funzionalità (o il rilascio in una determinata data) può essere più utile della correzione di un bug (minore) - in tal caso la correzione del bug deve essere rinviata. "Risolvere il bug ora" sarebbe inappropriato in quella situazione, perché ritarda il lavoro più importante.
sleske,

106

Perché dovresti consentire a una build di avere successo con difetti noti?

Perché a volte hai vincoli di tempo. Oppure il bug è così piccolo che non vale davvero la pena di ritardare la spedizione del prodotto per alcuni giorni necessari per testare l'unità e risolverlo.

Inoltre, qual è il punto nel rompere intenzionalmente la build ogni volta che trovi un bug? Se l'hai trovato, correggilo (o assegnalo alla persona che lo riparerà), senza disturbare tutta la tua squadra. Se si desidera ricordare di correggere un bug, è necessario contrassegnarlo come molto importante nel sistema di tracciamento dei bug.


Vedo il tuo punto, e generalmente sono d'accordo - ma in questo caso stiamo parlando di un grave bug che lo ha reso in produzione ed è stato riscontrato dagli utenti finali: s
MattDavey,

3
Vedi il secondo paragrafo della mia risposta.
Arseni Mourzenko,

8
Capisco, penso che il punto sia riassunto nel tuo primo paragrafo: non spetta allo sviluppatore giudicare la gravità del bug o se si tratta di fermare lo spettacolo, questa è una decisione per il business in generale.
MattDavey,

4
La domanda è: qual è la priorità di questo bug? Potrebbe essere un OMG FIX IT ADESSO potrebbe essere Sì, è fastidioso che dovremmo risolverlo ad un certo punto potrebbe essere qualcosa nel mezzo. Ma non tutti i bug colpiranno nello stesso posto su quello spettro.
Zachary K,

55

I test sono lì per assicurarsi di non (ri) introdurre problemi. L'elenco dei test non riusciti non sostituisce un sistema di tracciamento dei bug. C'è una certa validità nel POV che i test falliti non sono solo un'indicazione di bug, ma sono anche un'indicazione del fallimento del processo di sviluppo (dalla disattenzione alla dipendenza mal identificata).


20
"elenco dei test falliti non sostituisce un sistema di tracciamento dei bug" +1, anche un ottimo punto :)
MattDavey,

1
Suggerirei di avere test unitari di regressione inserire la base di codice come parte del bugfix, non prima.
anno

6
@yarek: I test di regressione possono entrare nel codebase in qualsiasi momento, devono solo essere ignorati fino a quando il bug non viene corretto. Di solito li sviluppo durante la diagnosi del problema, perché possono quindi raddoppiare come aiuto per il debug.
sleske,

Questo è un buon esempio del perché "rompere l'edificio" diventa una parte tossica di un luogo di lavoro in cui CI si trasforma semplicemente in "Blame Driven Development". Mi sono seduto in molti incontri in cui il PHB inizia a lamentarsi della "disattenzione" come se fosse per questo che la build si è rotta. In un tale ambiente, difficilmente verificherebbe intenzionalmente qualcosa che ha rotto la build. Altrimenti il ​​PHB si arrabbierà. Rompi la costruzione, indossa il cono della vergogna. Che pratica schifosa.
Warren P

@ WarrenP, a volte ci sono altri problemi, ma siamo chiari, la disattenzione è il primo motivo per cui le build si rompono. Se sai che qualcosa rompe la build, perché registrarla?
Approgrammatore

23

"Break the build" significa impedire il completamento corretto di una build . Un test fallito non lo fa. Indica che la build presenta difetti noti, che è esattamente corretto.

La maggior parte dei server di build tiene traccia dello stato dei test nel tempo e assegnerà una classificazione diversa a un test che non ha funzionato da quando è stato aggiunto rispetto a una regressione (test che era solito superare e non funziona più) e rileva anche la revisione in cui il la regressione ebbe luogo.


12
Questo non è sempre corretto, spesso i team considerano un test fallito come una build fallita - in effetti la maggior parte dei team che ho visto di recente (è una pratica agile tipica). Con la maggior parte dei team agili, un test fallito è un caso in cui si interrompe la linea: l'intero team attacca il problema e lo risolve. Suppongo che potrei prendere il tuo post per indicare che la risposta deve essere basata sulle tue pratiche, nel qual caso è del tutto accurata.
Bill K,

2
Considero sempre un test non riuscito a significare che la build non è riuscita.
John Saunders,

@JohnSaunders: Ma non è quello che significa. Come ho detto nella mia risposta, significa "la build ha conosciuto difetti".
Ben Voigt,

1
@ho detto che non c'erano test? Dove lo prendi? Voglio dire che il mio primo passo dopo aver trovato il bug non è quello di impedire il successo della compilazione, ma piuttosto di creare un report dettagliato dei bug. Quando il bug viene corretto, dovrebbe esserci prima un test unitario fallito.
John Saunders,

1
Ho pochi problemi con la creazione immediata di un test non riuscito. Non voglio che sia registrato nel set di test che verranno eseguiti su build. Voglio anche che lo sviluppatore che corregge il bug sia in grado di ignorare quel test. Nella maggior parte dei posti in cui ho lavorato, le persone che creano la segnalazione di bug non creeranno test unitari.
John Saunders,

16

Direi che il test fallito dovrebbe essere aggiunto, ma non esplicitamente come "test fallito".

Come sottolinea @BenVoigt nella sua risposta , un test fallito non "interrompe necessariamente la costruzione". Immagino che la terminologia possa variare da squadra a squadra, ma il codice continua a essere compilato e il prodotto può ancora essere spedito con un test non riuscito.

Quello che dovresti chiederti in questa situazione è,

Quali sono i test che si intende realizzare?

Se i test sono lì solo per far sentire tutti bene con il codice, quindi aggiungere un test fallito solo per far sentire tutti male con il codice non sembra produttivo. Ma poi, quanto sono produttivi i test in primo luogo?

La mia affermazione è che i test dovrebbero riflettere i requisiti aziendali . Pertanto, se viene trovato un "bug" che indica che un requisito non è soddisfatto in modo adeguato, significa anche che i test non riflettono correttamente o pienamente i requisiti aziendali.

Questo è il bug da correggere per primo. Non stai "aggiungendo un test non riuscito". Stai correggendo i test per riflettere meglio i requisiti aziendali. Se il codice non riesce a superare questi test, è una buona cosa. Significa che i test stanno facendo il loro lavoro.

La priorità di fissare il codice deve essere determinata dall'azienda. Ma fino a quando i test non saranno fissi, tale priorità può essere veramente determinata? Il business dovrebbe essere armato con la conoscenza di cosa sta esattamente fallendo, come sta fallendo e perché sta fallendo al fine di prendere le loro decisioni in via prioritaria. I test dovrebbero indicare questo.

Avere test che non superano del tutto non è una brutta cosa. Crea un grande manufatto di problemi noti che devono essere prioritari e gestiti di conseguenza. Avere test che non testano completamente , tuttavia, è un problema. Mette in discussione il valore dei test stessi.

Per dirlo in un altro modo ... La build è già rotta. Tutto quello che stai decidendo è se richiamare l'attenzione su questo fatto.


1
La tua affermazione è errata, i test unitari non si associano necessariamente direttamente ai requisiti aziendali, mentre probabilmente i test funzionali o end-to-end lo fanno, ma l'OP parlava di unit test / TDD.
John Buchanan,

@JohnBuchanan: quali sono i test per convalidare, se non che il software sta facendo quello che dovrebbe fare? (Cioè, che soddisfa i requisiti.) Esistono, come dici tu, altre forme di test al di fuori dei test unitari. Ma non riesco a vedere il valore nei test unitari che non convalidano il fatto che quel software soddisfi le esigenze dell'azienda.
David

1
@JohnBuchanan - non ha detto "i test SONO un riflesso dei requisiti aziendali", ha detto "DOVREBBE ESSERE". Il che è vero, ma discutibile. Hai ragione nel sostenere che questo non è sempre il caso - alcune persone scrivono test unitari che non corrispondono ai requisiti aziendali - anche se (secondo me) hanno torto a farlo. Se vuoi affermare che l'affermazione di David è sbagliata, potresti dire qualcosa sul perché la pensi così.
Dawood ibn Kareem,

13

Nel nostro team di automazione dei test, controlliamo i test non riusciti a condizione che falliscano a causa di un difetto nel prodotto piuttosto che di un difetto nel test. In questo modo abbiamo la prova per il team di sviluppo che ehi, hanno rotto. La rottura della build è fortemente disapprovata, ma non è la stessa cosa del check in test perfettamente compilabili ma falliti.


4
Penso che l'idea di @ MattDavey sia eccellente, e in passato l'ho discusso. Ho sempre incontrato un muro di pietra di resistenza - "non dovresti mai rompere la costruzione!". L'idea che la build sia già rotta in questa situazione sembra impossibile da comprendere. Purtroppo, questo è solo un altro caso in cui una buona idea (test automatici e build pulite) si è trasformata in una pratica di culto del carico i cui aderenti conoscono la regola ma non la ragione.
Tom Anderson,

3
Un'idea che mi è venuta in mente è che al team di controllo qualità (se è abbastanza tecnico per scrivere test) dovrebbe essere permesso di scrivere test falliti per i bug e controllarli. L'ossessione degli sviluppatori per la barra verde porterebbe quindi assolutamente dare la priorità alla correzione dei bug rispetto all'aggiunta di funzionalità, che è il modo corretto di fare lo sviluppo.
Tom Anderson,

Ma questi non dovrebbero essere test unitari che verranno eseguiti durante la compilazione. Se il tuo ambiente contiene un sistema di gestione dei test per il QA (come Microsoft Test Manager), sicuramente uno o più casi di test dovrebbero essere aggiunti e collegati al bug, ma ciò non impedirebbe il successo della compilazione - sarebbe semplicemente un test il caso che deve passare prima che il bug sia considerato "Fatto".
John Saunders,

7

Scrivere un test che sai fallirà fino a quando il bug non sarà corretto è una buona idea, è la base di TDD.

Rompere la build è una cattiva idea. Perché? Perché significa che nulla può andare avanti fino a quando non viene risolto. In sostanza, blocca tutti gli altri aspetti dello sviluppo.

Esempio 1
Cosa succede se la tua applicazione è molto varia, con molti componenti? Cosa succede se quei componenti vengono elaborati da altri team con il proprio ciclo di rilascio? Difficile! Devono aspettare la tua correzione di bug!

Esempio 2
Cosa succede se il primo bug è difficile da risolvere e trovi un altro bug con una priorità più alta? Rompi anche la build per il secondo bug? Ora non puoi costruire finché entrambi non sono stati corretti. Hai creato una dipendenza artificiale.

Non esiste alcun motivo logico per cui il fallimento di un test dovrebbe interrompere una compilazione. Questa è una decisione che il team di sviluppo deve prendere (forse con una discussione di gestione) valutando i pro e i contro del rilascio di una build con bug noti. Questo è molto comune nello sviluppo del software, praticamente tutti i principali software vengono rilasciati con almeno alcuni problemi noti.


5

Dipende dal ruolo che dovrebbero svolgere i test e da come i loro risultati dovrebbero influenzare il sistema / processo di generazione adottato. La mia comprensione di infrangere la build è la stessa di Ben, e allo stesso tempo non dovremmo controllare consapevolmente il codice che rompe i test esistenti. Se questi test arrivassero "in seguito", potrebbe essere "ok" ignorarli solo per renderli meno inutilmente dannosi per gli altri, ma trovo questa pratica di ignorare i test falliti (in modo che sembrino passare) piuttosto inquietante (specialmente così per i test unitari), a meno che non esista un modo per indicare tali test come né rossi né verdi.


"a meno che non esista un modo per indicare test come né rossi né verdi" Solo per la cronaca: la maggior parte dei framework di unit test distinguono i test rosso, verde e ignorato. Almeno JUnit e TestNG lo fanno (riportano "test xx, x fallito, x ignorato").
sleske,

@sleske sarebbe l'ideale, voglio solo essere sicuro che ignorare i fallimenti non si trasformi automaticamente in un successo
prusswan

Non ci sono build GIALLO? (Rosso / Verde / Giallo) in Hudson / Jenkins, Cruise Control e tutti gli altri biggies?
Warren P

@Warren P funziona quando le persone ignorano correttamente i test, ma alcuni ignorano i test rendendoli verdi
prusswan

5

Dipende dal bug, ovviamente, ma in genere se qualcosa è andato storto e non è stato identificato durante i test manuali o automatici, ciò implica che c'è una lacuna nella copertura. Incoraggerei sicuramente a capire la causa principale e dare uno schiaffo a un caso di test unitario sul problema.

Se si tratta di un problema di produzione pianificato per una correzione rapida da un ramo di manutenzione, è inoltre necessario assicurarsi che la correzione funzioni sulla linea principale e che uno sviluppatore non possa eliminare erroneamente la correzione con una risoluzione del conflitto di unione troppo zelante .

Inoltre, a seconda della politica di rilascio, la presenza di test di unità appena aggiornati può aiutare a confermare che uno sviluppatore ha effettivamente risolto il problema, anziché semplicemente modificarlo [(il problema o i test?)], Sebbene ciò dipenda dal fatto di aver codificato il requisiti corretti nei nuovi test unitari.


5

Un problema con l'aggiunta di un test Know-to-Fail alla build è che il tuo team potrebbe prendere l'abitudine di ignorare i test non riusciti perché si aspettano che la build fallisca. Dipende dal tuo sistema di compilazione, ma se un test fallito non significa sempre "qualcosa si è appena rotto", è facile prestare meno attenzione ai test falliti.

Non vuoi aiutare la tua squadra a entrare in quella mentalità.

Quindi sono d'accordo con sleske che dovresti aggiungere il test, ma contrassegnalo come 'ignorato' ai fini della compilazione automatica, fino a quando il bug non viene corretto.


1
Il tuo software di test dovrebbe dirti quando qualcosa si è appena rotto, rispetto a un test che non ha funzionato prima.
Ben Voigt,

4

Mentre penso che dovresti in qualche modo 'controllare' il bug come test, in modo che quando lo risolvi non accada di nuovo, e in qualche modo dare la priorità, penso che sia meglio non rompere la build (/ i test) . Il motivo è che i commit successivi verranno nascosti dietro il test interrotto. Quindi, controllando un test interrotto per questo errore, chiedi a tutto il team di mettere da parte il proprio lavoro per correggere questo errore. Se ciò non dovesse accadere, si potrebbe finire con il rompere i commit che non sono rintracciabili come tali.

Pertanto direi che è meglio impegnarlo come test in sospeso e renderlo una priorità per il tuo team non avere test in sospeso.


4

Un'altra opzione è quella di controllare il test fallito in un ramo separato nel sistema di controllo del codice sorgente. A seconda delle tue pratiche, questo può essere fattibile o no. A volte apriamo una nuova filiale per il lavoro in corso, come correggere un bug che non è banale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.