Sollte der Integrationstest in die kontinuierliche Integration (CI) einbezogen werden?

11

Angenommen, wir entwickeln eine Webanwendung und Hudson führt typische Aufgaben wie Kompilieren, Komponententest und statische Code-Analyse aus.

Der schwierige Teil ist jedoch: Hudson stellt den Anwendungsserver bereit und startet ihn, um Integrationstests durchzuführen , sobald die vorherigen Aufgaben erledigt sind.

Das bedeutet einige schwierige Dinge, wie Datenbankverbindung, Anwendungsverbindung des dritten Teils, Abhören des Socket-Ports, Umgebungsvariablen, Übergabe von Serverstartfehlern usw. Wir müssen diese Dinge jedes Mal richtig einrichten und abbauen, es ist eine schwierige Sache. Schlimmer noch, die Integrationstests können den Integrationstest leicht unterbrechen.

Denken Sie, ob der Integrationstest in die fortgesetzte Integration (CI) aufgenommen werden sollte? Kann es manuell sein? Oder Integrationstest vereinfachen?

Gy 声 远 Shengyuan Lu
quelle
2
Ihr Problem liegt in der Qualität der Tests, nicht im CI-Teil. Beim Integrationstest ist es immer noch eine gute Praxis, Abhängigkeiten auszuspotten.
Luc Franken

Antworten:

8

Der Name Continuous Integration sagt viel aus. Gibt es einen besseren Ort für Integrationstests als den, an dem Sie bereits integrieren?
Natürlich sollte dies nicht der einzige Ort sein, an dem diese Tests stattfinden. Bei der Entwicklung sollten Sie sicherstellen, dass Sie doch keine Probleme haben und nicht nur, dass Ihre Änderungen isoliert funktionieren.
Letztendlich liegt es in der Verantwortung jedes Teammitglieds, dass die Dinge nicht kaputt gehen. Der Versuch, Schuldzuweisungen zu geben und Personen oder Phasen, auf die das Testen beschränkt ist, streng zu definieren, ist kontraproduktiv.

jwenting
quelle
4
Aber Continuous ist auch dabei. Wenn die Integrationstests Minuten oder Stunden dauern, sind sie nicht kontinuierlich.
U2EF1
@ U2EF1 richtet dann einen diskreten Integrationsserver ein.
Kayaman
1
@ Kayaman Ihr Kommentar ist das einzige Ergebnis im Internet für "diskreten Integrationsserver". Können Sie bitte klarstellen, was Sie meinen?
Stijn
3

Denken Sie, ob der Integrationstest in die fortgesetzte Integration (CI) aufgenommen werden sollte?

Wenn Sie Integrationstests haben, die bestanden werden, und nicht erfordern, dass jemand tatsächlich dort steht und Tasten drückt, dann ja - Sie sollten sie dem CI-System hinzufügen.

Da die Ausführung der Integrationstests jedoch sehr lange dauern kann, sollten Sie die Häufigkeit ihrer Ausführung begrenzen. Sie können während einer Nacht ausgeführt werden, wenn der CI-Server inaktiv ist.

BЈовић
quelle
3

Um Ihre Frage zuerst zu beantworten: Ja, sie sind definitiv Teil der kontinuierlichen Integration, wenn Sie mich fragen. Aber ich denke, wir müssen klären, was Integrationstests sind.

Martin Fowler sprach von einer kontinuierlichen Bereitstellung, um den gesamten Erstellungsprozess für eine schnelle Bereitstellung zu automatisieren. Dies erfordert, dass Entwickler schnelles Feedback vom Continuous Integration-Prozess erhalten. Also definiert er Phasen, die der Build durchlaufen soll :

  1. ein Commit Build
  2. gründliche Prüfung
  3. Einsatz

Der Commit-Build sollte aufgrund des schnellen Feedbacks für Entwickler nicht länger als 10 Minuten dauern.

So sehe ich die Dinge: Holen Sie sich im ersten Schritt das neueste Commit und erstellen Sie es. Wenn dies erfolgreich ist, führen Sie Ihre Komponententests durch, um herauszufinden, ob Ihre Klassen / Klassengruppen wie definiert und erwartet funktionieren.

Wenn dies erfolgreich ist, gelangen Sie zum Integrationstestteil. Hier testen Sie die Interaktion der gerade erfolgreich getesteten Einheiten. Dies beinhaltet das Füttern der Einheiten mit Eingabe und das Beobachten ihres Zustands / ihrer Interaktion / Ausgabe. Denken Sie daran, dass wir uns noch im Commit-Build befinden. Daher möchten wir, dass dies auch schnell geht. Daher müssen Interaktionen mit dem Dateisystem, einer Datenbank, Netzwerkkollegen und dergleichen für eine schnelle Ausführung gestoppt werden. Martin Fowler weist auch auf die Verwendung von In-Memory-Datenbanken hin, wenn Sie diese benötigen, um die Ausführung auf dem CI-Server schnell zu halten.

Nachdem Sie sichergestellt haben, dass die Einheiten wie erforderlich funktionieren und interagieren, möchten Sie in der Regel Informationen zur Testabdeckung erhalten (das Testen eines kleinen Subsystems reicht normalerweise nicht aus) und die getesteten Artefakte für Funktionstests / Qualitätssicherung / Bereitstellung verfügbar machen ( Lesen Sie: gründliche Tests), wenn Sie der Meinung sind, dass Ihre Tests genug von Ihrem Programm abdecken. In diesem Moment stellen Sie eine Testumgebung bereit, die die Produktionsumgebung widerspiegelt, auf die Sie abzielen, und führen Tests durch, die eine echte Datenbank, echte Dateien, echte Netzwerkkollegen usw. umfassen.

Bei Integrationstests geht es letztendlich um Codeänderungen. Sie möchten sicherstellen, dass die von Ihnen vorgenommenen Änderungen das aktuelle System nicht beschädigen, was bedeutet, dass sie sich gut integrieren lassen. Um herauszufinden, ob dies der Fall ist, müssen Sie sicherstellen, dass sie sich in sich selbst korrekt verhalten, ob sie mit ihren Abhängigkeiten korrekt interagieren und ob sie überhaupt getestet wurden. Nachdem Sie alle diese Tests bestanden haben, können Sie sich auf Ihr System verlassen.

Wenn in späteren Phasen Probleme mit Ihrem Programm auftreten (z. B. wenn Ihre Datenbank einen bestimmten Wert zurückgibt, wird Ihre Netzwerkverbindung unterbrochen), sollten Sie versuchen, diese Tests in den Integrationstests zu löschen. Der Commit-Build ist höchstwahrscheinlich schneller als die Qualitätssicherung;)

Hamster
quelle