Stellen Sie sicher, dass Sie nichts veröffentlichen können, ohne die Tests zu korrigieren.
- Schlagen Sie den Build fehl, wenn Tests fehlschlagen.
- Schlagen Sie den Build fehl, wenn Tests ignoriert werden.
- Fehlschlagen des Builds, wenn die Testabdeckung einen bestimmten Wert unterschreitet (daher können Benutzer Tests nicht einfach löschen, um dies zu umgehen).
- 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.