Testcontainers

Integrationstesten mit Docker leicht gemacht

Stefan Hildebrandt / @hildebrandttk

Wer bin ich

  • Lebe in Oldenburg (Oldb) mit Frau und drei Kindern
  • Agiler Software Entwickler
    • Business Analyst
    • Entwickler
    • Tester
    • Betrieb
  • Mehr als 10 Jahre in der IT
  • Mitorganisator der JUG Bremen-Oldenburg
Portrait von Stefan Hildebrandt
Umfrage

Ohne Testcontainers

Ohne Testcontainers

docker(compose)

  • Manueller Start
  • Kann auch in Laufzeitprofile eingebunden werden
Ohne Testcontainers

Maven (fabric8 Plugin)

  • Maven startet Container
  • Sicherstellung laufender Container vor Integration-Test-Phase
  • Einbindung in die IDE zur Testausführung
  • Übergabe von Ports als System-Properties bei Failsave/Surefire-Plugin
Ohne Testcontainers

Gradle

  • Analog zu maven

Testcontainers

Testcontainers (java)

Überblick

  • Library zum Starten von Dockercontainern im Testkontext
  • Nutzt das Docker-Java-Binding
  • Erleichtert die Einbindung in gängige Testframeworks
  • Bietet Wrapper um typische Container
  • Konzeptioneller Vorgänger
Testcontainers

Weitere unterstützte Sprachen

Code diving

Beispiele auf Github

Testcontainers

Grundlagen

  • GenericContainer
    • Start
    • Environment
    • Ports / Port-Mapping
    • Environment-Variablen
    • Output
    • Stop
Testcontainers

Ryuk

  • Sidecar-Container
    • Läuft weiter falls Test nicht graceful beendet wird
  • Sicherstellung
    • Stoppen von Container
    • Löschen von Container
    • Löschen von temporären Images

Einbindung in Tests

Einbindung in Tests

Testframeworks

  • JUnit 4 ist die Basis
  • JUnit 5
  • Spock
Einbindung in Tests

Code diving

Beispiele auf Github

Einbindung in Tests

Laufzeit Container

  • Container per Test
  • Container per TestClass
  • Container per TestSuite

Infrastruktur-Container

Infrastruktur-Container

JDBC Container

  • DB / Username / Password
    • Defaults
  • Ready-Check
  • getJdbcUrl
  • Setup-Scripts
Infrastruktur-Container

RDBMSs

  • db2
  • dynalite
  • influxdb
  • mariadb
  • mssqlserver
  • mysql
  • oracle-xe
  • postgresql
Infrastruktur-Container

Andere Datenbanken

  • cassandra
  • clickhouse
  • couchbase
  • elasticsearch
  • neo4j
Infrastruktur-Container

Infrastruktur

  • kafka
  • localstack
  • mockserver
  • nginx
  • rabbitmq
  • toxiproxy
Infrastruktur-Container

Docker-Compose

  • Nutzung bestehender Setups
    • Insbesondere komplexe Netzwerk-Topologien
  • Zentrales Update von Images

Images erstellen

Images erstellen

Motivation

  • Aktuelles Projekt (Project under Test)
    • Einfacheres Setup
    • Schnellerer Roundtrip
  • Vorbereitete Datenbank
    • Test-Laufzeit
    • Test-Stabilität
  • ...
Images erstellen

Code diving

Beispiele auf Github

Spring Boot

Spring Boot

Code diving

Beispiele auf Github

Spring Boot

Optionen

Selenium

Selenium

Bereitstellung von Browsern

  • Auf Headless-CI-Servern nicht einfach
  • Ungeplante Updates erzeugen Testfehler
  • Lokal Störung des Tests bei Benutzung des Rechners möglich
Selenium

Code diving

Beispiele auf Github

Selenium

Video Support

Selenium

Testen von Services auf Localhost

Cucumber

Cucumber

Code diving

Beispiele auf Github

Cucumber

Generische Container-Stepdefinitions

  • Meist nicht sinnvoll
    • zu kleinteilig
    • fachlich nicht lesbar
Cucumber

Abdeckungstest mit Infrastruktur

  • Datenbanken
  • Application Server
  • JDKs
  • Betriebsysteme
Cucumber

Netzwerk

  • Mehrere Container in einem Netzwerk
    • Alias-Suppport
  • Mehrere Netzwerke

Letzte Worte

Letzte Worte

Was geht sonst noch:

  • execInContainer(String command)
  • copyFileFromContainer(String command)
  • copyFileToContainer(String command)
  • ...
Letzte Worte

Was fehlt noch

  • Commit-On-Failure für Docker-Container
  • Bauen von Maven/Gradle-Projekte

Slides

https://h9t.eu/s/tc

Weitere Links

Stefan Hildebrandt - consulting.hildebrandt.tk

  • Beratung, Coaching und Projektunterstützung
  • Java EE
  • Buildsysteme gradle und maven/ant-Migration
  • Testautomatisierung
  • Coach in agilen Projekten
  • DevOps
Datenschutz Impressum