Wie erstelle ich eine Umgebung, in der das Reparieren von Tests Priorität hat?

22

Ich bin Softwareingenieur bei einem mittelständischen Unternehmen. Wir haben eine ziemlich robuste Testplattform, die auf TeamCity läuft. Es führt Unit-Tests bei jedem Check-In und einen täglichen Unit-Test / BVT-Lauf durch.

Das Problem ist - wir haben viele defekte Komponententests.

Sehr oft spreche ich die Sinnlosigkeit von Komponententests an, wenn sie ständig brechen und nicht gewartet werden. Wenn Sie nicht sehen können, ob eine Änderung eine Regression verursacht hat, wird der größte Teil des Werts einer Unit-Testing-Plattform entfernt.

Ich würde gerne einen Samen anpflanzen lassen, der eine Kultur der guten Gewohnheiten schafft - Tests reparieren, wenn sie gebrochen sind, sie als wertvoll ansehen und die Festlegung von Tests zusammen mit anderen Arbeiten priorisieren.

Ich habe es mit Bestechung (Backwaren!) Versucht, einfach gefragt und mit Teamleitern gesprochen. Jeder sagt, dass es eine gute Idee ist, aber ich sehe, dass ich der einzige bin, der etwas dagegen unternimmt.

Was ist der beste Weg, um andere zu ermutigen, ihre Tests zu korrigieren, und Prioritäten für die Korrektur von Tests innerhalb ihrer Sprints zu setzen?

Wenn es einen weniger subjektiven Weg gibt, dies zu fragen, würde ich gerne irgendwelche Tipps annehmen.

Codeman
quelle
2
automatische Nerf-Waffe, die auf den Kerl gerichtet ist, der den Bau abbricht ...
Ratschenfreak
Wir haben tatsächlich eine automatische Nerf-Waffe ... aber der Build ist nicht kaputt, nur die Unit-Tests :)
Codeman
7
Das Unterbrechen der Komponententests sollte das Unterbrechen des Builds bedeuten. ;)
Jeroen Vannevel
2
@ ӍσӍ: Buy-in ist wichtig, aber Sie können kein Buy-in für die Lösung eines Problems erhalten, bis die Leute das Problem tatsächlich kennen . In diesem Fall kommt der Buy-In-Bedarf zunächst nur von Teamleitern und Managern. Das Entwickler-Buy-In kann später erfolgen, und dies ist im Allgemeinen natürlich der Fall, wenn das Build-System so eingerichtet wurde, dass einzelne Entwickler für ihre eigenen Fehler aufkommen.
Aaronaught
2
Wenn Donuts versagt haben, sind Sie Toast. :-)
Ross Patterson

Antworten:

28

Stellen Sie sicher, dass Sie nichts veröffentlichen können, ohne die Tests zu korrigieren.

  1. Schlagen Sie den Build fehl, wenn Tests fehlschlagen.
  2. Schlagen Sie den Build fehl, wenn Tests ignoriert werden.
  3. Fehlschlagen des Builds, wenn die Testabdeckung einen bestimmten Wert unterschreitet (daher können Benutzer Tests nicht einfach löschen, um dies zu umgehen).
  4. Verwenden Sie den CI-Server, um Ihre Release-Builds durchzuführen, und erlauben Sie nur, dass Builds aus dem Build-Drop des Servers in UAT / Staging / Production / whatever hochgestuft werden.

Die Tatsache ist, dass Sie keine kontinuierliche Integration durchführen, wenn Ihr Build mehr als 15 Minuten am Stück unterbrochen ist (und dies schließt auch fehlgeschlagene Tests ein) .

Die "nukleare Option" besteht darin, dass Ihr Quellcodeverwaltungsserver Commits / Checkins von anderen Benutzern als denen ablehnt, die den Build abgebrochen haben. Natürlich muss ein Administrator in der Lage sein, dies vorübergehend außer Kraft zu setzen, wenn die betreffende Person in den Urlaub fährt - aber wenn jeder weiß, dass das gesamte Team durchgedreht ist, bis sie ihre Tests repariert hat, wird dies verdammt schnell behoben.

Eine gute Richtlinie (die noch besser ist, wenn sie automatisiert ist) besteht darin, die Quelle nach 15 Minuten fehlgeschlagener Erstellung auf die letzte bekannte stabile Festschreibung zurückzusetzen. Mit anderen Worten, wenn Sie das Problem nicht beheben können oder nicht wissen, was den Build oder Test zum Absturz gebracht hat, setzen Sie es zurück und arbeiten Sie lokal, bis es behoben ist. Lassen Sie niemals andere Entwickler mit dem Daumen drehen, während Sie an einem schleifen Problem, das ihnen egal ist.

PS Wenn bereits viele Tests fehlgeschlagen sind, können Sie in CI einen "Trailing Threshold" verwenden. Richten Sie es so ein, dass der Build nur dann fehlschlägt, wenn mehr Testfehler als beim letzten Mal vorliegen. Zusammen mit einer Erfassungsregel wird dies die Entwickler zwingen, die Testsituation zu verbessern, wenn sie weiterarbeiten möchten.

PPS Mir ist klar, dass dies für manche drakonisch erscheint, aber es hängt alles von Ihrer Kultur ab. Wenn Sie zu einem Punkt kommen, an dem die Leute den Build einfach nicht kaputt lassen oder die Tests fehlschlagen (mein Team macht das fast nie, obwohl ich sie gelegentlich daran erinnern muss), müssen Sie nicht mit den strengsten Regeln fortfahren. Obwohl IMO sollten Sie immer den Build auf einem defekten Unit-Test scheitern. Integrationstests / Browsertests können manchmal fehlschlagen.

Aaronaught
quelle
1
Obwohl all Ihre technischen Hinweise nützlich sind, denke ich, ist der wertvollste Teil Ihrer Antwort, dass "Es ist alles Ihre Kultur", da es sich nicht nur um ein Disziplinproblem handelt, sondern auch um ein Problem, das den Nutzen des Tests ausmacht. Ich würde es lieber nach vorne stellen als in einem PPS
user40989 14.11.13
@ user40989: Ich höre dich. Kultur muss man allerdings pflegen. Wenn Sie möchten, dass die Leute verstehen, wie wichtig Tests sind, müssen Sie sie manchmal so einstellen, dass die Leute sie nicht ignorieren können. Sobald sich die Leute an eine hohe Codeabdeckung und an grüne Tests gewöhnt haben, werden sie nicht mehr zurückkehren wollen , und Ihre eigenen Entwickler werden dies für neue Mitarbeiter durchsetzen . Na hoffentlich. Ein anal-remanenter Teamleiter und / oder Build Master und / oder Manager hilft. :)
Aaronaught
FWIW: Unser gesamter Veröffentlichungsprozess ist jetzt automatisiert und die Leute würden nicht daran denken , gebrochene Tests zu haben. Der Teamleiter führt eine Zusammenführung zum Master durch, startet dann einen Release-Build und sendet eine Aufstiegsanfrage an die Systemadministratoren, die buchstäblich einen Knopf drücken, um die Build-Artefakte bereitzustellen und automatisierte Browser- und API-Tests auszuführen. Niemand beschwert sich jemals über diesen Prozess, weil er Zeit spart. Früher haben wir uns 2 Wochen lang um eine Veröffentlichung gekümmert, jetzt ist es im Grunde genommen eine Handwelle. Das ist es, was ich unter Kultivierung der Kultur verstehe - jeder weiß, dass die zusätzlichen 2 Minuten, um einen Test zu reparieren, 2 Stunden später einsparen werden.
Aaronaught
10

Fehlgeschlagene Komponententests sind nicht das Problem. Sie sind ein Symptom .

Das eigentliche Problem liegt in der Kultur. Du musst vorsichtig sein: hier sind Drachen . Sie können die Kultur nicht selbst ändern, und wenn Sie das quietschende Rad sind, werden Sie letztendlich zu Ausgestoßenen. Buchstäblich.

Ich schlage vor, wenn Sie versuchen, eine hochrangige Person zu finden, die sich für die Sache einsetzt und den Weg weist. Wenn dies fehlschlägt, versuchen Sie es in einer allgemeinen Entwicklerversammlung, ohne mit dem Finger zu zeigen oder Namen zu nennen. Eine andere Alternative besteht darin, die Verantwortung für die ordnungsgemäße Ausführung eines Auftrags selbst zu übernehmen: Legen Sie bei jedem Check-in weitere Tests fest. Behalten Sie ein Diagramm an der Wand, das zeigt, wie viele Tests im Laufe der Zeit fehlschlagen. Andere werden es sehen: Vielleicht werden sie sich dafür entscheiden.

Es gibt keine einfache Antwort.

andy256
quelle
Als quietschendes Rad führte mich das Team an. Vielleicht stimmte etwas mit deinem Quietschen nicht? Im Ernst, das spricht für ein ganz anderes Kulturproblem, nicht für das Entwicklerteam, sondern für das Management des Unternehmens. Wenn das Management auf ein brennendes Feuer reagiert, indem es eine Sonnenbrille aufsetzt, dann verschwinden Sie einfach. Aber wenn Sie tatsächlich ein Entwickler sind Shop , im Gegensatz zu einem Unternehmen IT - Abteilung am laufenden Band Software von einer Kostenstelle, ist es ziemlich wahrscheinlich , dass Manager kümmern sich um Dinge wie , wie oft und sicher können Sie auf dem Markt freigeben.
Aaronaught