4 Punkte von GN⁺ 2024-02-28 | 1 Kommentare | Auf WhatsApp teilen
  • Open-Source-Framework, das Datenbanken, Message Broker, Webbrowser und mehr bereitstellt, die in Docker-Containern ausgeführt werden können
  • Keine komplexe Umgebungs-Konfiguration oder Mock-Objekte erforderlich; Test-Abhängigkeiten werden im Code definiert, und beim Ausführen der Tests werden Container erstellt und wieder entfernt
  • Unterstützt verschiedene Sprachen und Test-Frameworks; mit Docker kann man sofort loslegen
  • Module: Alles testen, was sich containerisieren lässt
    • Mit mehr als 50 Modulen lassen sich verschiedenste Komponenten wie Datenbanken, Message Broker und mehr testen.
  • Unterstützte Sprachen: Es gibt Testcontainers-Implementierungen für viele populäre Sprachen wie Java, Go, .NET, Node.js, Python, Rust, Haskell, Ruby, Clojure und Elixir.

Anwendungsfälle: Wie Testcontainers helfen kann

  • Integrationstests der Datenzugriffsschicht: Testen von Code der Datenzugriffsschicht mit containerisierten Datenbankinstanzen
  • UI-/Akzeptanztests: Ausführen automatisierter UI-Tests mit containerisierten, zu Selenium kompatiblen Webbrowsern
  • Anwendungs-Integrationstests: Ausführen der Anwendung in einem kurzlebigen Testmodus mit Abhängigkeiten wie Datenbanken, Message Queues und Webservern, um eine reichhaltige Umgebung für Interaktion und exploratives Testen bereitzustellen

Meinung von GN⁺

  • Testcontainers ermöglicht es Entwicklern, Tests unter Bedingungen durchzuführen, die der realen Umgebung ähneln, und trägt so zur Verbesserung der Softwarequalität bei.
  • Tests mit echten Abhängigkeiten können präzisere Ergebnisse liefern als der Einsatz von Mock-Objekten, in komplexen Systemen können Einrichtung und Verwaltung jedoch schwierig sein.
  • Andere Projekte mit ähnlichen Funktionen wie Testcontainers sind Docker Compose und Kubernetes Minikube; auch sie können als Werkzeuge für Tests in Entwicklungsumgebungen genutzt werden.
  • Für die Einführung von Testcontainers ist ein Verständnis von Docker erforderlich; zudem kann technisches Wissen zu Container-Management und Netzwerkkonfiguration nötig sein.
  • Vorteile dieser Technologie sind die Konsistenz zwischen Entwicklungs- und Testumgebung sowie eine höhere Zuverlässigkeit der Tests; als Nachteil können die Abhängigkeit von der Docker-Umgebung und die damit verbundene Komplexität wirken.

1 Kommentare

 
GN⁺ 2024-02-28
Hacker News-Kommentare
  • Zusammenfassung des ersten Kommentars:

    • Das große Lob für Testcontainers kam unerwartet.
    • Wenn man aus einer Umgebung kommt, in der Docker nicht verwendet wurde, kann es attraktiv wirken.
    • Es ist in vielen Anwendungsfällen nützlich, aber schwer gut mit anderen containerisierten Workflows zusammenzubringen.
    • Testcontainers ist eine Bibliothek, die für ihre Kernfunktionen benutzerdefinierte Shell-Aufrufe an die Docker-CLI nutzt, was bei der Einführung anderer containerisierter Workflows Probleme und Komplexität verursacht.
    • Es neigt dazu anzunehmen, dass es nur auf dem Host-Rechner läuft und keine anderen Docker-bezogenen Aufgaben existieren, weshalb es oft genauso schlecht oder schlechter sein kann als Bibliotheken für Nicht-Docker-Umgebungen.
  • Zusammenfassung des zweiten Kommentars:

    • Testcontainers ist ein Gamechanger für Integrationstests.
    • Es stellt sprachspezifische Docker-APIs bereit, mit denen sich Container einfach starten lassen und ihre Verbindungsbereitschaft geprüft werden kann.
    • Für alle neuen Projekte wird Testcontainers für Integrationstests verwendet.
    • Die CI-Konfiguration umfasst Linting, Build, Unit-Tests und Integrationstests mit Testcontainers.
    • Die Sprach-Bindings bieten Hilfsfunktionen, die bei der Arbeit mit Datenbanken nützlich sind.
  • Zusammenfassung des dritten Kommentars:

    • Es ist unklar, warum die Verwendung von docker-compose.yml nicht besser sein sollte.
    • Bei komplexen Abhängigkeiten zwischen benötigten Containern ist Testcontainers vergleichsweise schwach.
    • Die Erfahrung damit liegt zwar fünf Jahre zurück, aber inzwischen könnte sich die Lage deutlich verbessert haben.
  • Zusammenfassung des vierten Kommentars:

    • Integrationstests mit echten Datenbanken/Elasticsearch/Redis/Varnish usw. werden als sehr wertvoll angesehen.
    • Testcontainers übernimmt Aufgaben wie das Erstellen eines neuen Elasticsearch-Index und dessen Aufräumen während der Test-Suite.
    • Bevorzugt wird eine Strategie, die möglichst viele Anwendungsfunktionen mit End-to-End-artigen Integrationstests abdeckt.
    • Unit-Tests werden nur für Codeteile mit klaren Ein-/Ausgabe-Paaren verwendet, während für unkontrollierbare externe API-Aufrufe usw. Mocks eingesetzt werden.
  • Zusammenfassung des fünften Kommentars:

    • Vor etwa sieben Jahren wurde mit conex eine Testcontainers-Variante für Go geschrieben.
    • Sie bietet eine erstklassige Integration in das offizielle Test-Framework von Go.
  • Zusammenfassung des sechsten Kommentars:

    • Es gibt die Ansicht, dass es langsam ist, für jeden Test eine neue, saubere Browser-Instanz bereitzustellen.
    • Wenn man bereits stark in die Container-Welt investiert hat, spricht nichts gegen ein paar zusätzliche Container.
    • Andernfalls gibt es kaum Vorteile gegenüber zusätzlicher Komplexität oder mehr Ballast.
  • Zusammenfassung des siebten Kommentars:

    • Testcontainers wurde untersucht und dann eine eigene Version gebaut.
    • Docker ist eine undichte Abstraktion, und Tests müssen in unterschiedlichen Umgebungen laufen.
    • Das Networking ist völlig unterschiedlich auf dem Mac, in einer Linux-VM und in einem Docker-Container innerhalb einer Linux-VM mit eingehängtem Docker-Socket.
    • Tests sollen parallel laufen und jeweils die passenden Logs ausgeben.
    • Es ist unklar, ob Testcontainers diese Probleme gelöst hat, aber die Erfahrung zeigt, dass der Teufel im Detail steckt.
  • Zusammenfassung des achten Kommentars:

    • Die lokale Testumgebung wird mit docker-compose erstellt.
    • Testcontainers wirkt wie eine Programmiersprachen-Abstraktion, mit der sich eine Docker-Umgebung definieren lässt, ohne die Syntax von Docker Compose lernen zu müssen.
    • Um zu wissen, ob die Testumgebung einsatzbereit ist, braucht man aber weiterhin Verständnis für Docker-Networking, Abhängigkeiten und Healthchecks.
  • Zusammenfassung des neunten Kommentars:

    • Es braucht weder Mocks noch eine komplexe Umgebungs-Konfiguration.
    • Die Test-Abhängigkeiten werden im Code definiert; beim Ausführen der Tests werden Container erstellt und wieder gelöscht.
    • Zu glauben, dass Unit-Tests überflüssig seien, nur weil sich Integrationstests mit Containern ausführen lassen, ist ein Missverständnis.
    • Docker-Container zu konfigurieren ist einfach, aber sie zu starten ist schmerzhaft und langsam.
  • Zusammenfassung des zehnten Kommentars:

    • Es wird gefragt, warum in Java Duke als Logo verwendet wird.