Soll ich den Build absichtlich abbrechen, wenn ein Fehler in der Produktion gefunden wird?

410

Wenn Endbenutzer in der Produktion einen schwerwiegenden Fehler feststellen, erscheint es mir vernünftig, einen fehlgeschlagenen Komponententest hinzuzufügen, um diesen Fehler zu beheben. Auf diese Weise wird der Build absichtlich abgebrochen, bis der Fehler behoben ist. Mein Grund dafür ist, dass der Build die ganze Zeit fehlschlagen sollte , aber nicht aufgrund einer unzureichenden automatisierten Testabdeckung.

Einige meiner Kollegen waren sich nicht einig, dass ein fehlgeschlagener Unit-Test nicht eingecheckt werden sollte. Ich stimme dieser Sichtweise in Bezug auf normale TDD-Praktiken zu, aber ich denke, dass Produktionsfehler anders gehandhabt werden sollten - schließlich, warum sollten Sie dies zulassen wollen ein Build, um mit bekannten Fehlern erfolgreich zu sein?

Hat jemand andere bewährte Strategien für den Umgang mit diesem Szenario? Ich verstehe, dass das absichtliche Unterbrechen des Builds andere Teammitglieder stören kann, aber das hängt ganz davon ab, wie Sie Zweige verwenden.

MattDavey
quelle
75
+1; eine sehr provokative frage. Ich kann beide Seiten sehen.
Carl Manaster
28
Sie verwenden den Begriff "der Build", um "die Tests" einzuschließen, was kein universelles Verständnis ist.
Jay Bazuzi
19
Wenn Sie TDD durchführen, schreiben Sie den fehlgeschlagenen Test, korrigieren Sie den Code und checken Sie ein . So vermeiden Sie einen Buildbruch.
Dietbuddha
7
Nach der gleichen Logik sollten Sie die Live-Instanzen der Clients herunterfahren, bis Sie das Problem behoben haben. Nein, du solltest den Build nicht abbrechen. Lassen Sie den Entwickler, der den Fehler behandelt, den Komponententest hinzufügen, und der Code ändert sich zusammen. Es ist nicht nötig, den gesamten Prozess abzuschalten.
Thanos Papathanasiou

Antworten:

412

Unsere Strategie ist:

Checken Sie einen fehlgeschlagenen Test ein, kommentieren Sie ihn jedoch mit @Ignore("fails because of Bug #1234").

Auf diese Weise ist der Test vorhanden, der Build wird jedoch nicht unterbrochen.

Natürlich vermerkt man den ignorierten Test in der Bug-Datenbank, also @Ignorewird der entfernt, sobald der Test behoben ist. Dies dient auch als einfache Überprüfung der Fehlerbehebung.

Der Zweck, die Grundlage für fehlgeschlagene Tests zu brechen, besteht nicht darin, das Team unter Druck zu setzen, sondern es auf ein Problem aufmerksam zu machen. Sobald das Problem identifiziert und in der Fehlerdatenbank abgelegt wurde, macht es keinen Sinn, den Test für jeden Build ausführen zu lassen - Sie wissen, dass dies fehlschlagen wird.

Natürlich sollte der Fehler immer noch behoben sein. Die Planung der Fehlerbehebung ist jedoch eine geschäftliche Entscheidung und daher nicht das eigentliche Anliegen des Entwicklers. Sobald ein Fehler in der Fehlerdatenbank abgelegt wurde, ist dies für mich kein Problem mehr, bis der Kunde / Product Owner mir mitteilt, dass er die Fehlerbehebung wünscht .

sleske
quelle
150
+1 Ich denke, Sie haben den Nagel auf den Kopf getroffen, als Sie sagten, dass "das Planen des Fixes eine Geschäftsentscheidung ist" - als Entwickler ist es nicht meine Entscheidung, ob ein Fehler den Build bricht.
MattDavey
22
Ich halte das für eine sehr vernünftige Lösung. Vor allem, wenn der nächste, der einen kleinen Code eincheckt, plötzlich eine Meldung über einen fehlgeschlagenen Test erhält und denkt, dass er dies getan hat.
Holger
14
"Für mich ist es nicht mehr mein Problem, wenn ein Fehler in der Fehlerdatenbank abgelegt wurde" ... +1
Jake Berger
20
@anon Außer bei Toyota. Ein Linienarbeiter erkennt einen Defekt, zieht dann am Andon-Kabel und die gesamte Anlage kommt zum Stillstand. Das Management kommt zum Stillstand und die Linie wird nicht neu gestartet, bis das Problem behoben ist. Google Andon Cord. Es ist kein neues Konzept. Siehe: startuplessonslearned.com/2008/09/…
Christopher Mahan
4
@AndresJaanTack: Dies hängt natürlich von Ihrer Methodik ab, aber im Allgemeinen würde ich dem nicht zustimmen. Zumindest in einem Geschäftsumfeld ist die Arbeitsplanung eine Geschäftsentscheidung - und dazu gehört auch die Behebung von Fehlern . Manchmal ist eine neue Funktion (oder die Veröffentlichung an einem bestimmten Datum) wertvoller als die Behebung eines (geringfügigen) Fehlers. In diesem Fall muss die Fehlerbehebung verschoben werden. "Fixing the Bug now" wäre in dieser Situation ungeeignet, weil es wichtigere Arbeiten verzögert.
sleske
106

Warum sollten Sie zulassen, dass ein Build bei bekannten Fehlern erfolgreich ist?

Denn manchmal haben Sie zeitliche Einschränkungen. Oder der Fehler ist so geringfügig, dass es sich nicht wirklich lohnt, den Versand des Produkts um ein paar Tage zu verzögern, die für den Komponententest und die Fehlerbehebung erforderlich sind.

Und warum sollte der Build jedes Mal absichtlich abgebrochen werden, wenn ein Fehler auftritt? Wenn Sie es gefunden haben, reparieren Sie es (oder weisen Sie es der Person zu, die es reparieren wird), ohne Ihr gesamtes Team zu stören. Wenn Sie daran denken möchten, einen Fehler zu beheben, müssen Sie ihn in Ihrem Fehlerverfolgungssystem als sehr wichtig markieren.

Arseni Mourzenko
quelle
Ich verstehe Ihren Standpunkt und stimme im Allgemeinen zu - aber in diesem Fall sprechen wir über einen schwerwiegenden Fehler, der es in die Produktion geschafft hat und auf den Endbenutzer gestoßen ist: s
MattDavey,
3
Siehe den zweiten Absatz meiner Antwort.
Arseni Mourzenko
8
Ich verstehe, ich denke, der Punkt wird in Ihrem ersten Absatz zusammengefasst - es ist nicht Sache des Entwicklers, die Schwere des Fehlers zu beurteilen, oder ob es sich um einen Show-Stopper handelt, das ist eine Entscheidung für das gesamte Unternehmen.
MattDavey
4
Die Frage ist, welche Priorität dieser Fehler hat. Es könnte ein OMG FIX IT NOW sein, es könnte ja ärgerlich sein, dass wir es irgendwann reparieren sollten, es könnte etwas in der Mitte sein. Aber nicht alle Bugs werden an der gleichen Stelle in diesem Spektrum auftreten.
Zachary K
55

Tests sollen sicherstellen, dass Sie keine Probleme (erneut) einführen. Die Liste der fehlgeschlagenen Tests ist kein Ersatz für ein Fehlerverfolgungssystem. Es gibt eine gewisse Gültigkeit im POV, dass nicht bestandene Tests nicht nur auf Fehler hinweisen, sondern auch auf ein Versagen des Entwicklungsprozesses (von Unachtsamkeit bis zu einer schlecht identifizierten Abhängigkeit).

Ein Programmierer
quelle
20
"Liste der fehlgeschlagenen Tests ist kein Ersatz für ein Bug-Tracking-System" +1, auch ein sehr guter Punkt :)
MattDavey
1
Ich würde vorschlagen, dass Regressionstests die Codebasis nicht früher als Teil des Bugfixes eingeben.
20.
6
@yarek: Die Regressionstests können jederzeit in die Codebasis aufgenommen werden. Sie müssen nur ignoriert werden, bis der Fehler behoben ist. Normalerweise entwickle ich sie, während ich das Problem diagnostiziere, weil sie dann als Debugging-Hilfe dienen können.
sleske 20.01.12
Dies ist ein gutes Beispiel dafür, warum "Breaking the Build" zu einem toxischen Teil eines Arbeitsplatzes wird, an dem sich CI lediglich in "Blame Driven Development" verwandelt. Ich habe in vielen Meetings gesessen, in denen der PHB anfing, über "Nachlässigkeit" zu jammern, als ob das der Grund wäre, warum der Build gebrochen ist. In einer solchen Umgebung würden Sie kaum absichtlich etwas einchecken, das den Build beschädigt hat. Andernfalls wird der PHB verärgert. Brechen Sie den Bau, tragen Sie den Kegel der Schande. Was für eine beschissene Praxis.
Warren P
@WarrenP, es gibt manchmal andere Probleme, aber lassen Sie uns klar sein, Nachlässigkeit ist der erste Grund, warum Builds brechen. Wenn Sie wissen, dass etwas den Build kaputt macht, warum sollten Sie es dann einchecken?
AProgrammer
23

"Build abbrechen" bedeutet , dass ein Build nicht erfolgreich abgeschlossen werden kann . Ein nicht bestandener Test macht das nicht. Dies ist ein Hinweis darauf, dass der Build bekannte Fehler aufweist, was genau richtig ist.

Die meisten Build-Server verfolgen den Status von Tests im Laufe der Zeit und weisen einem Test, der seit dem Hinzufügen fehlgeschlagen ist, eine andere Klassifizierung zu als einer Regression (ein Test, der früher bestanden hat und nicht mehr besteht) Regression fand statt.

Ben Voigt
quelle
12
Dies ist nicht immer richtig. Oft betrachten Teams einen fehlgeschlagenen Test als einen fehlerhaften Build. Tatsächlich haben die meisten Teams, die ich in letzter Zeit gesehen habe, dies getan (dies ist eine typische agile Praxis). Bei den meisten agilen Teams ist ein fehlgeschlagener Test ein Fall, bei dem Sie die Leitung anhalten - das gesamte Team greift das Problem an und löst es. Ich nehme an, ich könnte Ihren Beitrag so verstehen, dass die Antwort auf Ihren Praktiken basieren muss. In diesem Fall ist sie absolut korrekt.
Bill K
2
Ich betrachte einen fehlgeschlagenen Test immer als fehlgeschlagen.
John Saunders
@ JohnSaunders: Aber das bedeutet es nicht. Wie ich in meiner Antwort sagte, bedeutet dies "Der Build hat bekannte Fehler".
Ben Voigt
1
@ho sagte, es gab keine Tests? Woher bekommst du das? Ich meine, dass mein erster Schritt nach dem Auffinden des Fehlers nicht darin besteht, den Erfolg des Builds zu verhindern, sondern vielmehr darin, einen detaillierten Fehlerbericht zu erstellen. Wenn der Fehler behoben wird, sollte es zuerst einen fehlgeschlagenen Unit-Test geben.
John Saunders
1
Ich habe wenig Probleme mit der sofortigen Erstellung eines fehlerhaften Tests. Ich möchte nur nicht, dass es in die Testreihe eingecheckt wird, die beim Erstellen ausgeführt wird. Ich möchte auch, dass der Entwickler, der den Fehler behebt, diesen Test ignorieren kann. An den meisten Orten, an denen ich gearbeitet habe, werden die Personen, die den Fehlerbericht erstellt haben, keine Komponententests erstellen.
John Saunders
16

Ich würde argumentieren, dass der fehlerhafte Test hinzugefügt werden sollte, aber nicht explizit als "fehlerhafter Test".

Wie @BenVoigt in seiner Antwort hervorhebt , muss ein fehlgeschlagener Test nicht unbedingt "den Build brechen". Ich denke, die Terminologie kann von Team zu Team variieren, aber der Code wird immer noch kompiliert und das Produkt kann immer noch mit einem fehlerhaften Test ausgeliefert werden.

Was Sie sich in dieser Situation fragen sollten, ist,

Was sollen die Tests leisten?

Wenn die Tests nur dazu dienen, dass sich alle im Hinblick auf den Code wohl fühlen, ist das Hinzufügen eines fehlgeschlagenen Tests, damit sich alle im Hinblick auf den Code schlecht fühlen, nicht produktiv. Aber wie produktiv sind die Tests überhaupt?

Ich behaupte, dass die Tests die geschäftlichen Anforderungen widerspiegeln sollten . Wenn also ein "Fehler" gefunden wurde, der darauf hinweist, dass eine Anforderung nicht ordnungsgemäß erfüllt wurde, ist dies auch ein Hinweis darauf, dass die Tests die Geschäftsanforderungen nicht ordnungsgemäß oder nicht vollständig widerspiegeln.

Das ist der Fehler, der zuerst behoben werden muss. Sie "fügen keinen fehlgeschlagenen Test hinzu". Sie korrigieren die Tests, um die Geschäftsanforderungen genauer widerzuspiegeln. Wenn der Code diese Tests dann nicht besteht, ist das eine gute Sache. Es bedeutet, dass die Tests ihren Job machen.

Die Priorität bei der Festlegung des Codes ist vom Unternehmen zu bestimmen. Aber kann diese Priorität wirklich bestimmt werden, bis die Tests festgelegt sind? Das Unternehmen sollte mit dem Wissen ausgestattet sein, was genau scheitert, wie es scheitert und warum es scheitert, um Prioritätsentscheidungen zu treffen. Die Tests sollten dies anzeigen.

Tests zu haben, die nicht vollständig bestanden werden, ist keine schlechte Sache. Es wird ein großes Artefakt bekannter Probleme erstellt, das priorisiert und entsprechend behandelt werden muss. Es ist jedoch ein Problem, Tests zu haben, die nicht vollständig getestet werden . Es stellt den Wert der Tests selbst in Frage.

Um es anders auszudrücken ... Der Build ist bereits kaputt. Sie entscheiden lediglich, ob Sie auf diese Tatsache aufmerksam machen möchten oder nicht.

David
quelle
1
Ihre Behauptung ist falsch. Unit-Tests werden nicht unbedingt direkt auf die Geschäftsanforderungen abgebildet, wohingegen funktionale oder End-to-End-Tests dies wahrscheinlich tun, aber das OP sprach von Unit-Tests / TDD.
John Buchanan
@ JohnBuchanan: Was sollen die Tests bestätigen, wenn nicht, dass die Software das tut, was sie tun soll? (Das heißt, dass es die Anforderungen erfüllt.) Es gibt, wie Sie sagen, andere Formen von Tests als Unit-Tests. Aber ich kann den Wert in Komponententests nicht erkennen, die nicht bestätigen, dass diese Software die Anforderungen des Unternehmens erfüllt.
David
1
@JohnBuchanan - er hat nicht gesagt, "die Tests spiegeln die geschäftlichen Anforderungen wider", er sagte "SOLLTE SEIN". Welches ist wahr, aber umstritten. Sie haben Recht, wenn Sie behaupten, dass dies nicht immer der Fall ist - einige Leute schreiben Unit-Tests, die nicht den Geschäftsanforderungen entsprechen - obwohl sie (meiner Meinung nach) falsch sind. Wenn Sie behaupten möchten, dass Davids Behauptung falsch ist, könnten Sie etwas darüber sagen, warum Sie das glauben.
Dawood ibn Kareem
13

In unserem Testautomatisierungsteam checken wir nicht bestandene Tests ein, solange diese aufgrund eines Produktfehlers und nicht aufgrund eines Testfehlers fehlschlagen. Auf diese Weise haben wir für das Entwicklerteam den Beweis, dass sie es kaputt gemacht haben. Das Brechen des Builds ist hoch verpönt, aber das ist nicht dasselbe wie das Einchecken perfekt kompilierbarer, aber fehlgeschlagener Tests.

Yamikuronue
quelle
4
Ich denke, @ MattDaveys Idee ist ausgezeichnet und ich habe in der Vergangenheit dafür gestritten. Ich bin immer auf eine Steinmauer des Widerstands gestoßen - "Sie sollten den Bau niemals brechen!". Die Vorstellung, dass der Build in dieser Situation bereits gebrochen ist , scheint für die Menschen unmöglich zu begreifen. Leider ist dies nur ein weiterer Fall, in dem eine gute Idee (automatische Tests und saubere Builds) in eine Frachtkultpraxis übergegangen ist, deren Anhänger die Regel kennen, aber nicht den Grund.
Tom Anderson
3
Eine Idee, die ich mir ausgedacht habe, ist, dass das QA-Team (wenn es technisch genug ist, um Tests zu schreiben) fehlerhafte Tests für Fehler schreiben und diese einchecken darf. Die Besessenheit der Entwickler von der grünen Leiste würde dann absolut dazu führen Die Behebung von Fehlern hat Vorrang vor dem Hinzufügen von Funktionen. Dies ist die richtige Methode für die Entwicklung.
Tom Anderson
Dies sollten jedoch keine Komponententests sein, die während des Builds ausgeführt werden. Wenn Ihre Umgebung ein Testverwaltungssystem für die Qualitätssicherung enthält (wie Microsoft Test Manager), sollten ein oder mehrere Testfälle hinzugefügt und mit dem Fehler verknüpft werden. Dies würde jedoch den Erfolg des Builds nicht verhindern - es wäre lediglich ein Test Fall, der vergehen muss, bevor der Fehler als "Fertig" betrachtet wird.
John Saunders
7

Es ist eine gute Idee, einen Test zu schreiben, von dem Sie wissen, dass er fehlschlägt, bis der Fehler behoben ist. Es ist die Basis von TDD.

Den Build zu brechen ist eine schlechte Idee. Warum? Weil es bedeutet, dass sich nichts weiter bewegen kann, bis es behoben ist. Es blockiert im Wesentlichen alle anderen Aspekte der Entwicklung.

Beispiel 1
Was passiert, wenn Ihre Anwendung sehr unterschiedlich ist und viele Komponenten enthält? Was ist, wenn diese Komponenten von anderen Teams mit einem eigenen Release-Zyklus bearbeitet werden? Zäh! Sie müssen auf Ihre Fehlerbehebung warten!

Beispiel 2
Was passiert, wenn der erste Fehler schwer zu beheben ist und Sie einen anderen Fehler mit höherer Priorität finden? Brichst du auch den Build für den zweiten Bug? Jetzt können Sie erst bauen, wenn beide behoben sind. Sie haben eine künstliche Abhängigkeit erstellt.

Es gibt keinen logischen Grund, warum ein fehlgeschlagener Test einen Build stoppen sollte. Dies ist eine Entscheidung, die das Entwicklerteam treffen muss (möglicherweise im Rahmen einer Managementdiskussion), um die Vor- und Nachteile der Veröffentlichung eines Builds mit bekannten Fehlern abzuwägen. Dies ist sehr häufig in der Softwareentwicklung der Fall, da praktisch alle wichtigen Softwareprodukte mit zumindest einigen bekannten Problemen veröffentlicht werden.

Qwerky
quelle
5

Dies hängt von der Rolle ab, die die Tests spielen sollen, und davon, wie sich ihre Ergebnisse auf das angewendete Build-System / den angewendeten Build-Prozess auswirken sollen. Ich verstehe das Brechen des Builds genauso wie Ben, und gleichzeitig sollten wir nicht wissentlich Code einchecken, der vorhandene Tests bricht. Wenn diese Tests "später" eingingen, kann es "in Ordnung" sein, sie zu ignorieren, um andere nicht unnötig zu stören, aber ich finde diese Praxis, fehlgeschlagene Tests zu ignorieren (so dass sie zu bestehen scheinen), eher beunruhigend (besonders so) für Komponententests), es sei denn, es gibt eine Möglichkeit, solche Tests als weder rot noch grün anzuzeigen.

prusswan
quelle
"es sei denn, es gibt eine Möglichkeit, solche Tests als weder rot noch grün anzuzeigen" Nur zur Veranschaulichung: Die meisten Unit-Test-Frameworks unterscheiden rote, grüne und ignorierte Tests. Zumindest tun dies JUnit und TestNG (sie melden "xx test, x failed, x ignored").
sleske
@sleske das wäre ideal, ich möchte nur sichergehen, dass das ignorieren von
fehlschlägen
Gibt es keine GELBEN Builds? (Rot / Grün / Gelb) in Hudson / Jenkins, Cruise Control und all den anderen Biggies?
Warren P
@Warren P es funktioniert, wenn Leute Tests richtig ignorieren, aber einige Tests ignorieren, indem sie grün gemacht werden
prusswan
5

Das hängt natürlich vom Fehler ab. Wenn jedoch im Allgemeinen ein Fehler aufgetreten ist, der beim manuellen oder automatischen Testen nicht festgestellt wurde, bedeutet dies, dass Ihre Berichterstattung lückenhaft ist. Ich würde auf jeden Fall dazu ermutigen, die Ursache herauszufinden und einen Unit-Test-Fall auf das Problem zu setzen.

Wenn es sich um ein Produktionsproblem handelt, das für einen Hotfix aus einem Wartungszweig geplant ist, müssen Sie außerdem sicherstellen, dass der Fix auf der Hauptlinie funktioniert und dass ein Entwickler den Fix nicht irrtümlicherweise mit einer zu eifrigen Lösung von Zusammenführungskonflikten wegblasen kann .

Abhängig von Ihrer Veröffentlichungsrichtlinie kann das Vorhandensein neu aktualisierter Komponententests außerdem dazu beitragen, zu bestätigen, dass ein Entwickler das Problem tatsächlich behoben hat, anstatt es lediglich zu ändern (das Problem oder die Tests?) korrekte Anforderungen in den neuen Unit-Tests.

Keith Brings
quelle
5

Ein Problem beim Hinzufügen eines Know-to-Fail-Tests zum Build besteht darin, dass Ihr Team die Gewohnheit hat, fehlgeschlagene Tests zu ignorieren, da erwartet wird, dass der Build fehlschlägt. Es hängt von Ihrem Build-System ab, aber wenn ein fehlgeschlagener Test nicht immer bedeutet, dass "etwas gerade kaputt ist", ist es einfach, fehlgeschlagenen Tests weniger Aufmerksamkeit zu schenken.

Sie möchten Ihrem Team nicht dabei helfen, sich auf diese Denkweise einzulassen.

Daher stimme ich sleske zu, dass Sie den Test hinzufügen sollten , ihn jedoch für den Zweck des automatischen Builds als "ignoriert" markieren , bis der Fehler behoben ist.

Wilka
quelle
1
Ihre Testsoftware sollte Ihnen mitteilen, wenn etwas neu defekt ist, im Vergleich zu einem Test, der zuvor fehlgeschlagen ist.
Ben Voigt
4

Obwohl ich denke, dass Sie den Fehler in irgendeiner Weise als Test "einchecken" sollten, damit er nicht erneut auftritt, wenn Sie ihn beheben, und in gewisser Weise Prioritäten setzen, ist es meines Erachtens am besten, den Build (/ die Tests) nicht zu unterbrechen. . Der Grund dafür ist, dass später bahnbrechende Commits hinter Ihrem kaputten Test verborgen bleiben. Wenn Sie also einen fehlerhaften Test für diesen Fehler einchecken, müssen Sie das gesamte Team mit der Behebung dieses Fehlers beauftragen. Wenn dies nicht der Fall ist, brechen Sie möglicherweise Commits, die als solche nicht nachvollziehbar sind.

Daher würde ich sagen, dass es besser ist, diesen Test als ausstehenden Test festzulegen und ihn in Ihrem Team als vorrangig zu betrachten, wenn keine Tests ausstehen.

markijbema
quelle
4

Eine andere Möglichkeit besteht darin, den fehlgeschlagenen Test in einem separaten Zweig Ihres Versionsverwaltungssystems einzuchecken. Abhängig von Ihren Praktiken kann dies durchführbar sein oder nicht. Manchmal eröffnen wir eine neue Filiale für die laufende Arbeit, zum Beispiel um einen Fehler zu beheben, der nicht trivial ist.

Ola Eldøy
quelle