Wir haben drei Testsuiten:
- Eine "kleine" Suite, deren Betrieb nur ein paar Stunden dauert
- Eine "mittlere" Suite, die mehrere Stunden dauert und normalerweise jede Nacht (jede Nacht) ausgeführt wird.
- Eine "große" Suite, deren Ausführung eine Woche + dauert
Wir haben auch einige kürzere Testsuiten, aber ich konzentriere mich hier nicht darauf.
Die aktuelle Methode besteht darin, die kleine Suite vor jedem Commit für den Trunk auszuführen. Dann wird die mittlere Suite jede Nacht ausgeführt, und wenn sich am Morgen herausstellte, dass sie fehlgeschlagen ist, versuchen wir zu isolieren, welche der gestrigen Commits schuld waren, diese Commits zurückzusetzen und die Tests erneut zu versuchen. Ein ähnlicher Vorgang wird für die große Suite nur wöchentlich statt nachts durchgeführt.
Leider fällt die Medium Suite ziemlich häufig aus. Das bedeutet, dass der Kofferraum oft instabil ist, was äußerst ärgerlich ist, wenn Sie Änderungen vornehmen und testen möchten. Es ist ärgerlich, denn wenn ich aus dem Kofferraum auschecke, kann ich nicht sicher wissen, ob es stabil ist, und wenn ein Test fehlschlägt, kann ich nicht sicher wissen, ob es meine Schuld ist oder nicht.
Meine Frage ist, gibt es eine bekannte Methode, um mit solchen Situationen so umzugehen, dass der Kofferraum immer in Topform bleibt? zB "Commit in einen speziellen Precommit-Zweig, der dann den Trunk jedes Mal regelmäßig aktualisiert, wenn die Nacht vergeht".
Und spielt es eine Rolle, ob es sich um ein zentrales Versionsverwaltungssystem wie SVN oder ein verteiltes wie git handelt?
Übrigens bin ich ein Junior-Entwickler mit einer eingeschränkten Fähigkeit, Dinge zu ändern. Ich versuche nur zu verstehen, ob es einen Weg gibt, mit diesen Schmerzen umzugehen, die ich erlebe.
Antworten:
Die einzige Möglichkeit, die Grundursache für die Instabilität zu beheben, besteht darin, den Code zu entkoppeln, damit Änderungen isolierter sind, wie andere Antworten vorgeschlagen haben.
Wenn Sie als einzelner Entwickler jedoch einen stabileren Build für Ihre persönliche Arbeit wünschen, ist dies relativ einfach zu lösen. Anstatt an der Spitze zu arbeiten, ziehen Sie nur den letzten Build, der die Testsuite über Nacht bestanden hat, in Ihren Arbeitsbaum. Wenn Sie für jede Änderung Feature-Zweige erstellen können, verzweigen Sie vom letzten stabilen Build.
Ja, Ihr Baum wird ein paar Tage zurückliegen, aber die meiste Zeit spielt das keine Rolle. Führen Sie Ihre Arbeit gegen den stabilen Build durch, damit Sie wissen, dass Ihre Änderungen alle Tests abgebrochen haben. Aktualisieren Sie dann vor dem Einchecken auf den neuesten Stand und führen Sie Ihre normale Integration durch. Nachdem Sie eingecheckt haben, kehren Sie zum letzten stabilen Build zurück.
Sie müssen immer noch die unordentliche Integrationsarbeit erledigen, aber was mir an dieser Methode gefällt, ist, dass sie die Integrationsarbeit auf eine für mich günstigere Zeit isoliert und mir eine stabile Codebasis für die Entwicklung bietet, wenn sie nicht bequem ist. Ich habe eine viel bessere Idee, wenn es meine Änderungen sind, die wahrscheinlich den Build im Vergleich zu denen anderer gebrochen haben.
quelle
Ich weiß, dass Sie versuchen, dies zu vermeiden, aber die wirkliche Erkenntnis besteht darin, dass etwas ernsthaft mit Ihrer Codebasis nicht stimmt: Sie müssen eine vollständige Testsuite ausführen, die eine Woche dauert, um sicherzugehen, dass Ihr Code stabil ist!
Der vorteilhafteste Weg, um dieses Problem zu beheben, besteht darin, Ihre Codebasis und Tests in (unabhängige) Untereinheiten aufzuteilen.
Dies hat enorme Vorteile:
Auf der anderen Seite wird die Verwaltung Ihrer VCS-Struktur komplizierter, aber nach einer vollen Woche für Ihren vollständigen Test können Sie den Schmerz ertragen!
Ich empfehle weiterhin, in irgendeiner Form eine Strategie für "stabile" und "Entwicklungs" -Zweige zu verwenden, aber es gibt viele Möglichkeiten, dies zu tun, und Sie können diejenige auswählen, die für Ihr Unternehmen am besten geeignet ist (Meta-Repositorys mit festen Revisionen, auf die verwiesen wird) separate Repositorys für jede Einheit, ein stabiler Zweig und ein Entwicklungszweig, Feature-Zweige ....)
quelle
Für SVN weiß ich nichts über so etwas wie "Pre-Commit". Ich denke, es ist wahrscheinlich, dass Commits und Rollbacks erzeugt werden, wenn der Test fehlschlägt. Wie doc-brown sagt, besteht die einzige Möglichkeit darin, einen temporären Zweig festzuschreiben und ihn später mit dem Trunk zusammenzuführen.
Mit einem verteilten wie git oder mercurial denke ich, dass es möglich wäre. Verwenden eines "Test" -Repositorys und eines "stabilen" Repositorys. Sie drücken auf den Testvertreter, testen ihn jeden Abend und wenn alles gut läuft, drücken Sie vom Test in den Stall. Andernfalls setzen Sie den Testmitarbeiter zurück. Ich bin mir ein bisschen unsicher, wie der Versionsverlauf aussehen würde, wenn Sie vom Testen zum Stall wechseln, aber ich denke, es ist möglich, das kaputte Rollback-Zeug dabei auszuschließen. Ein bisschen experimentieren wäre am sichersten.
Eine Alternative wäre auch, jeden Abend den lokalen Kofferraum jeder Person zu testen. Dann dürfen die Personen mit bestandenen Tests es am Morgen auf den zentralen Server übertragen.
quelle
IMHO hat dies nichts mit dem von Ihnen verwendeten VCS zu tun. Die Verwendung eines "zu testenden" Zweigs kann eine Lösung sein, die auch mit zentralisiertem oder verteiltem VCS realisiert werden kann. Aber ehrlich gesagt denke ich, dass das Beste in Ihrer Situation darin besteht, die mittlere Testsuite so zu optimieren (anscheinend enthält sie die wichtigsten Tests), dass sie viel schneller ausgeführt wird, sodass Sie sie für das Pre-Commit-to-Trunk verwenden können Tests, so wie Sie es jetzt mit Ihrer "kleinen Suite" tun.
quelle
Die fehlgeschlagenen Medientests: Stimmt es, dass meistens dieselben Tests fehlschlagen?
Wenn es einen Fehler gibt, gibt es immer die gleichen verwandten Tests, die fehlschlagen?
Wenn dies zutrifft: Möglicherweise können Sie einige häufig fehlgeschlagene mittlere Tests (ein Test für jede Fehlerklasse) selektiv auswählen und innerhalb des kleinen Satzes ausführen.
Sind die meisten Tests Integrationstests, die eine echte Datenbank verwenden? Wenn ja, ist es möglich, sie durch eine Unittest zu ersetzen, die eine verspottete Datenbank hat?
quelle
Sie müssen Ihre Tests beschleunigen, es gibt keine andere Möglichkeit, diesen Kreis zu quadrieren.
Betrachten Sie das Problem: Sie möchten sicher sein, dass Sie beim Auschecken über Arbeitscode verfügen. Natürlich können Sie Commits verzögern und Verzweigungen bis vor der Veröffentlichung durchführen, aber dies verzögert nur den Beginn des Problems bis zur Integration. Müssen Sie die einwöchige Suite nach jeder Zusammenführung wie in ausführen? Methodik ist nicht die Lösung, die Lösung ist rein technisch.
Folgendes schlage ich vor:
1) Machen Sie die Tests so atmosphärisch wie möglich und maximieren Sie die Wiederverwendung in der Umgebung.
2) Holen Sie sich eine Testsuite-Farm, um sie auszuführen. Wenn Sie anstelle von 8 großen Modulen 50 haben, können Sie eine Reihe von Amazon EC2-Spotinstanzen hochfahren und die gesamte Suite parallel ausführen. Ich bin mir sicher, dass dies etwas Geld kosten wird, aber es wird enorm viel Entwicklerzeit sparen.
quelle
Das Wichtigste, was Sie in Ihrer Frage für selbstverständlich halten, ist, dass alle Commits Tests bestehen müssen. Dies ist zwar eine nette Regel und scheint sinnvoll zu sein, aber manchmal ist sie nicht praktikabel. Ihr Fall ist ein Beispiel (obwohl MadKeithV einen Punkt macht), und ich kann mir vorstellen, einen VCS-Zweig so makellos zu halten, dass es schwierig sein könnte, wenn die Entwickler nicht ausreichend zusammenarbeiten.
In Wirklichkeit möchten Sie irgendwie wissen, welche Commits bestanden oder nicht bestanden wurden. Ein "Pre-Commit-Zweig", wie Sie vorgeschlagen haben, würde funktionieren, aber dies erfordert möglicherweise zusätzlichen Aufwand von Entwicklern, wenn sie Commits durchführen, die möglicherweise schwer zu verkaufen sind.
Ein ähnlicher Ansatz, der einfacher sein könnte, besteht darin, den Kofferraum zu verlassen, damit die Leute nach Belieben brechen können, und einen Zweig für Commits zu haben, die nicht kaputt sind. Ein automatisiertes Skript kann Commits durchlaufen, wenn sie an den Trunk gesendet werden, die Tests für sie ausführen und sie dem Zweig hinzufügen, wenn sie erfolgreich sind.
Oder Sie könnten absurd simpel sein und ein Skript haben, das die übergebenen Commits in einer Textdatei auflistet (die möglicherweise selbst versioniert ist oder nicht).
Oder Sie haben ein Batch-System, das Anforderungen für zu testende Zweige / Revisionen (von einer beliebigen Stelle im Baum) akzeptiert, diese testet und an den Trunk (oder einen anderen Zweig) festschreibt, wenn sie erfolgreich sind.
quelle