Sollte ich Tests in das Docker-Image aufnehmen?


17

Wenn es um Tests geht, kann ich mir zwei Möglichkeiten vorstellen:

  1. Führen Sie Test und Anwendung in einem Bild durch.
  2. Fügen Sie nur den Anwendungscode in das Bild ein. Erstellen Sie einen testspezifischen Container, der nach dem Hauptbild erstellt wird und dem einige Ebenen (Testcode, Abhängigkeiten usw.) hinzugefügt werden.

Mit der ersten Option kann ich den Container testen und genau so versenden, wie er getestet wurde. Ein offensichtlicher Nachteil ist, dass unnötiger Code (und möglicherweise Testdaten) im Bild enthalten sind.

Bei der zweiten Option stimmt das ausgelieferte Image nicht mit dem getesteten überein.

Beides sieht nach schlechten Strategien aus. Gibt es eine dritte, bessere Strategie?


1
Sie haben im Grunde selbst geantwortet. Beides ist eine schlechte Idee. Sie versenden bereits getestete ablauffähige Prozesse in einen Container, der so dimensioniert und angepasst ist, dass er den Anforderungen entspricht. Sie wollen weder Dev-Abhängigkeiten noch Quellcode. In der Produktion wird es als Risiko angesehen.
Laiv

1
Testen vor der Containerisierung bedeutet, dass die Umgebung nicht getestet wird, sondern nur der Code. Sie haben nur einen Teil von dem getestet, was Sie versenden, nicht alles.
lfk

Antworten:


10

Für die Ausführung von Build-Zeit-Tests ist die Verwendung eines mehrstufigen Builds die bevorzugte Methode . Mehrstufige Docker-Dateien ermöglichen es Ihnen, eine größere Bühne mit allen Abhängigkeiten für das Erstellen und Testen zu haben und dann die exakten Artefakte, die Sie getestet haben, in eine andere Bühne zu kopieren, um ein kleineres Laufzeit-Image zu erhalten.

Sie möchten auch Tests auf Systemebene für mehrere Container durchführen, indem Sie deren externe Schnittstellen verwenden, anstatt sie innerhalb des Containers auszuführen. Da diese Tests die Koordination zwischen Diensten beinhalten, unterschiedliche Abhängigkeiten wie den Zugriff auf Ihre Orchestrierung erfordern, nicht so gründlich wie Build-Time-Tests sind und häufig ohnehin in völlig verschiedenen Sprachen geschrieben werden, ist es keine große Sache, sie von einem separaten Docker aus auszuführen Container, der nur für Systemtests vorgesehen ist.


1
Das ist also ziemlich genau Option 2 - Ich führe die Tests in einer Umgebung / einem Container durch, die der Produktion sehr ähnlich ist, aber nicht ganz gleich. Ist das richtig?
lfk

9

Es gibt einen dritten Weg, wie Sie selbst sagten. Ich denke, Sie vermischen Entwicklung, Test und Bereitstellung. Ich schlage vor, den gesamten SDLC als Ganzes zu betrachten, um zu verstehen, was Sie erreichen wollen. Dies ist ein großes Thema, aber ich werde mein Bestes geben, um es zusammenzufassen.

TL; DR;

Kurz gesagt, müssen Sie Folgendes trennen:

  • Ihr Code, von
  • die Anwendungskonfiguration von
  • die Konfiguration der Systemumgebung.

Jeder muss unabhängig voneinander und angemessen sein:

  • versiongesteuert
  • geprüft
  • einsetzbar

Längere Version

Zunächst haben Sie eine Anwendung, die aus Code und (separaten) Konfigurationssätzen besteht. Dies muss sowohl für die Erstellung als auch für die absichtliche Funktion getestet werden - dies wird als kontinuierliche Integration (Continuous Integration, CI) bezeichnet. Es gibt viele Anbieter dieses Dienstes sowohl online als auch lokal - zum Beispiel CircleCI für einen Cloud-Anbieter, der eine Verknüpfung zu Ihrem Repository herstellt und bei jedem Commit erstellt und testet. Wenn Ihr Repository vor Ort ist und keinen Cloud-Anbieter verwenden kann, etwa Jenkinswäre ein Äquivalent. Wenn es sich bei Ihrer Anwendung um eine Standardanwendung handelt, ist möglicherweise ein Docker-Image vorhanden, das der CI-Dienst verwenden kann. Andernfalls müssen Sie einen oder einen Cluster erstellen, in dem der Anwendungscode und die Konfiguration bereitgestellt werden können. Bei richtiger Konfiguration erhalten Sie eine Fülle von Statistiken zur Qualität Ihres Anwendungscodes.

Sobald Sie mit der Funktionalität und Richtigkeit Ihrer Anwendung zufrieden sind, sollte die Codebasis für eine bestimmte Version entsprechend gekennzeichnet werden. Dieser Build sollte dann in einer Testumgebung bereitgestellt werden. Beachten Sie, dass der Code mit dem Code übereinstimmt, der in Ihrem CI getestet wurde (dies ist nachweislich der Fall, wenn Sie dies korrekt durchgeführt haben), Ihre Konfiguration jedoch möglicherweise davon abweicht. Wieder können einige CI-Anbieter diesen Schritt anbieten, damit Sie die Bereitstellung einer gepackten Anwendung und eine diskrete Konfiguration testen können. Diese Phase umfasst in der Regel Benutzerfunktionstests (für neue Funktionen) sowie automatisierte Tests (für bekannte Funktionen). Wenn die Freigabe diese Phase besteht, haben Sie einen Freigabekandidaten für den Integrationstest. Sie können die Automatisierungstests von einem anderen Docker-Container aus ausführen.Einige Metriken besagen, dass der Testaufwand 1: 1 für den Codierungsaufwand ist (obwohl ich mir selbst nicht sicher bin).

Im nächsten Schritt erstellen Sie Ihre (System-) Umgebung so, als wäre es die Produktion. Wenn Sie Docker in der Produktion verwenden, denken Sie hier an die Sicherheitshärtung, Netzwerk- und Serveroptimierung usw. Ihre Docker-Images basieren möglicherweise auf denen, die Sie in der Entwicklung verwendet haben (im Idealfall), es können jedoch Änderungen in Bezug auf Skalierung und Sicherheit auftreten , wie ich sagte. Bis jetzt sollte der Funktionstest der Anwendung abgeschlossen sein, Sie sind mehr auf Sicherheit und Leistung bedacht. Gemäß den Funktionstests können Ihre Tests hier von anderen Docker-Images aus entwickelt, bereitgestellt und ausgeführt werden. Dieser Schritt war früher furchtbar teuer und wurde nur selten ausgeführt. Dafür war dedizierte Hardware erforderlich, mit der die Produktion reproduziert werden konnte. Heutzutage ist dies völlig realisierbar, da Sie bei Bedarf die gesamte Umgebung in nahezu jeder Größenordnung auf- und abbauen können.

Schließlich haben Sie eine Version, die mit nur wenigen Konfigurationsdeltas aus Ihren Integrationstests (IP-Adressen, Datenbank-URIs, Kennwörter usw.) produktionsbereit sein sollte. Ihre Codebasis wurde dabei mindestens in drei verschiedenen Umgebungen getestet Punkt und die Mehrheit der Systemkonfiguration mindestens einmal.


Bedeutet das, dass Ihr CI Ihre Dockerdateien überhaupt nicht testet? Wenn in Ihrer Docker-Datei beispielsweise eine Abhängigkeit fehlt, bestehen die Tests trotzdem?
lfk

1
Überhaupt nicht. Testen Sie zuerst den Code, dann die App-Konfiguration und dann das System. Was ich sage ist, dass dies diskrete Aktivitäten sind. Das Tolle an der Containerisierung ist, dass der Traum von der Entwicklung in einem Umfeld, das dem von prod gleicht, sehr nahe ist. Aber das Aushärten würde die Entwicklung zu hart machen.
Avastmick
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.