Warum sollten Sie Komponententests auf einem CI-Server durchführen?
Zu dem Zeitpunkt, an dem sich etwas für den Master engagiert, hat ein Entwickler sicherlich bereits alle Komponententests durchgeführt und alle Fehler behoben, die möglicherweise bei seinem neuen Code aufgetreten sind. Ist das nicht der Sinn von Unit-Tests? Ansonsten haben sie nur fehlerhaften Code geschrieben.
master
sollte immer vernünftig sein und vorzugsweise automatisch bei jeder Zusammenführung in eine Staging-Umgebung für interne QS und Tests bereitgestellt werden.Antworten:
Oder nicht. Dafür kann es viele Gründe geben:
Der eigentliche Punkt ist jedoch, die Tests auf einem Computer auszuführen, der nicht der Entwicklercomputer ist. Eine, die anders konfiguriert ist.
Dies hilft dabei, Probleme zu beheben, bei denen Tests und / oder Code von etwas abhängig sind, das für eine Entwickler-Box spezifisch ist (Konfiguration, Daten, Zeitzone, Gebietsschema usw.).
Weitere gute Gründe für CI-Builds, Tests durchzuführen:
quelle
Als Entwickler, der nicht alle Integrations- und Komponententests durchführt, bevor er sich zur Quellcodeverwaltung verpflichtet, werde ich hier meine Verteidigung anbieten.
Ich müsste erstellen, testen und überprüfen, ob eine Anwendung korrekt ausgeführt wird:
Fügen Sie Fortran (mit Intel- und GNU-Compilern), Python (und je nach Betriebssystem verschiedene Versionen) und Bash / Bat-Skriptkomponenten hinzu
Das sind also 16 Maschinen, die ich haben müsste, nur um ein paar Tests mehrmals am Tag durchzuführen. Es wäre fast eine Vollzeitbeschäftigung, nur die Infrastruktur dafür zu verwalten. Ich denke, fast jeder würde zustimmen, dass das unvernünftig ist, besonders wenn man es mit der Anzahl der Leute im Projekt multipliziert. Wir überlassen es unseren CI-Servern, die Arbeit zu erledigen.
Unit-Tests halten Sie nicht davon ab, defekten Code zu schreiben. Sie informieren Sie, wenn Sie wissen, dass Sie etwas kaputt gemacht haben. Die Leute können sagen, "Unit-Tests sollten schnell sein", und fahren mit Prinzipien und Entwurfsmustern und -methoden fort, aber in der Realität ist es manchmal besser, die Computer, die wir für sich wiederholende, monotone Aufgaben entwickelt haben, diese ausführen zu lassen und sich nur dann daran zu beteiligen, wenn sie beteiligt sind Sagen Sie uns, dass sie etwas gefunden haben.
quelle
Abgesehen von der ausgezeichneten Oded-Antwort:
Ich habe einmal an einer Firma gearbeitet, die aufgrund des Zusammenführungs- und Bereitstellungsprozesses viele Fehler bei der Bereitstellung hatte. Dies wurde durch ein seltsames Propietary-Framework verursacht, das das Testen und CI erschwerte. Es war keine erfreuliche Erfahrung, festzustellen, dass Code, der bei der Entwicklung perfekt funktioniert, nicht direkt in der Produktion ankam.
quelle
Das würde man denken, nicht wahr? Aber Entwickler sind Menschen, und manchmal vergessen sie es.
Außerdem können Entwickler häufig nicht den neuesten Code abrufen. Ihre letzten Tests könnten dann beim Einchecken gut verlaufen, wenn jemand anderes eine Änderung vornimmt.
Ihre Tests basieren möglicherweise auch auf einer lokalen (nicht aktivierten) Ressource. Etwas, das Ihre lokalen Unit-Tests nicht erfassen würden.
Wenn Sie der Meinung sind, dass all das phantastisch ist, gibt es eine Ebene über CI (mindestens auf TFS) mit dem Namen Gated, in der Builds mit fehlgeschlagenen Tests zurückgestellt und nicht für die Codebasis festgeschrieben werden.
quelle
Normalerweise richte ich mein CI so ein, dass es bei jedem einzelnen Commit ausgeführt wird. Zweige werden erst mit dem Master zusammengeführt, wenn der Zweig getestet wurde. Wenn Sie Tests auf dem Master ausführen möchten, wird ein Fenster geöffnet, in dem der Build unterbrochen werden kann.
Bei der Ausführung der Tests auf einem CI-Computer geht es um reproduzierbare Ergebnisse. Da der CI-Server eine bekannte saubere Umgebung aufweist, die von Ihrem VCS abgerufen wurde, wissen Sie, dass die Testergebnisse korrekt sind. Bei lokaler Ausführung können Sie möglicherweise vergessen, den für die Übergabe erforderlichen Code festzuschreiben, oder nicht festgeschriebenen Code, der die Übergabe veranlasst, wenn sie fehlschlagen sollten.
Außerdem können die Entwickler Zeit sparen, indem verschiedene Suites parallel ausgeführt werden, insbesondere wenn es sich um langsame, mehrminütige Tests handelt, die nach jeder Änderung wahrscheinlich nicht lokal ausgeführt werden.
Bei meiner aktuellen Arbeit wird unser Produktionseinsatz darauf ausgerichtet, dass CI alle Tests besteht. Die Bereitstellungsskripts verhindern die Bereitstellung, sofern sie nicht übergeben werden. Dies macht es unmöglich, versehentlich zu vergessen, sie auszuführen.
Da ich Teil des Workflows bin, werden auch die Entwickler entlastet. Führen Sie als Entwickler in der Regel bei jeder Änderung einen Linter-, Static-Analyzer-, Unit-Test-, Code-Coverage- und Integrationstest durch? Ich kann, ganz automatisch und ohne darüber nachdenken zu müssen - das reduziert die Entscheidungsermüdung.
quelle
Durch die Zeit , etwas zu meistern wird verpflichtet, ein Entwickler sollten bereits alle Unit - Tests laufen ... aber was ist, wenn sie nicht haben? Wenn Sie die Komponententests nicht auf dem CI-Server ausführen, werden Sie es erst erfahren, wenn eine andere Person die Änderungen auf ihren Computer überträgt und feststellt, dass die Tests nur für sie durchgeführt wurden.
Darüber hinaus hat der Entwickler möglicherweise einen Fehler gemacht und auf eine lokale Ressource verwiesen, die für seinen Computer spezifisch ist. Wenn sie den Code einchecken und der CI-Lauf fehlschlägt, wird das Problem sofort erkannt und kann behoben werden.
quelle
Unter der Annahme, dass Entwickler (im Gegensatz zu anderen Antworten) sehr diszipliniert sind und Unit-Tests durchführen, bevor sie sich verpflichten, kann dies mehrere Gründe haben:
quelle
Es ist möglich, sich Fälle vorzustellen, in denen die Änderung A den Test nicht unterbricht und die Änderung B den Test nicht unterbricht, A und B jedoch zusammen . Wenn A und B von verschiedenen Entwicklern erstellt wurden, erkennt nur der CI-Server den neuen Fehler. A und B können sogar zwei Teile desselben längeren Satzes sein.
Stellen Sie sich einen Zug vor, der von den beiden Lokomotiven A und B gefahren wird. Vielleicht ist einer mehr als genug, und dies ist die Lösung, die angewendet werden muss. Wenn jedoch die beiden "Korrekturen" angewendet werden, um beide zu entfernen, bewegt sich der Zug nicht.
Außerdem führen nicht alle Entwickler alle Unit-Tests durch, während die meisten guten Entwickler dies tun.
quelle
Stellen wir eine äquivalente Frage:
Für CI gibt es mehrere Gründe, aber der Hauptpunkt von CI besteht darin, eine Vorstellung davon zu bekommen, wie der Status des Codes im Laufe der Zeit aussieht. Der Hauptvorteil (von mehreren), den dies bietet, ist, dass wir herausfinden können, wann der Build abbricht, herausfinden, was ihn gebrochen hat, und ihn dann reparieren können.
Warum verwenden wir überhaupt CI, wenn der Code nie kaputt ist? Um Builds zum Testen bereitzustellen, sind nächtliche Builds ausreichend.
quelle