{"id":3631,"date":"2022-07-26T11:02:35","date_gmt":"2022-07-26T11:02:35","guid":{"rendered":"http:\/\/the-codest.localhost\/blog\/test-containers-how-to-make-tests-easier\/"},"modified":"2026-03-11T06:00:15","modified_gmt":"2026-03-11T06:00:15","slug":"testcontainer-zur-vereinfachung-von-tests","status":"publish","type":"post","link":"https:\/\/thecodest.co\/de\/blog\/test-containers-how-to-make-tests-easier\/","title":{"rendered":"Testcontainer - Wie kann man Tests vereinfachen?"},"content":{"rendered":"<p>Die moderne Anwendungsentwicklung basiert auf einer einfachen Regel:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><b>Zusammensetzung verwenden<\/b><\/p>\n<\/blockquote>\n\n\n\n<p>Wir f\u00fcgen Klassen, Funktionen und Dienste zu gr\u00f6\u00dferen Teilen der Software zusammen. Dieses letzte Element ist die Grundlage von <a href=\"https:\/\/thecodest.co\/de\/dictionary\/microservices\/\">Microservices<\/a> und <a href=\"https:\/\/thecodest.co\/de\/blog\/the-power-of-hexagonal-architecture\/\">sechseckige Architektur<\/a>. Wir m\u00f6chten bestehende L\u00f6sungen nutzen, sie in unsere Software integrieren und direkt auf den Markt gehen. <a href=\"https:\/\/thecodest.co\/de\/dictionary\/what-is-the-size-of-your-potential-reachable-market\/\">Markt<\/a>.<\/p>\n\n\n\n<p>M\u00f6chten Sie die Kontoregistrierung und die Speicherung der Benutzer <a href=\"https:\/\/thecodest.co\/de\/blog\/app-data-collection-security-risks-value-and-types-explored\/\">Daten<\/a>? Sie k\u00f6nnen einen der OAuth-Dienste ausw\u00e4hlen. Vielleicht bietet Ihre Anwendung eine Art von Abonnement oder Zahlung an? Es gibt viele Dienste, die Ihnen dabei helfen k\u00f6nnen, dies zu handhaben. Ben\u00f6tigen Sie einige Analysen auf Ihrer Website, verstehen aber nicht <a href=\"https:\/\/thecodest.co\/de\/blog\/cyber-security-dilemmas-data-leaks\/\">GDPR<\/a>? F\u00fchlen Sie sich frei und nehmen Sie eine der sofort einsetzbaren L\u00f6sungen.<\/p>\n\n\n\n<p>Etwas, das die Entwicklung aus gesch\u00e4ftlicher Sicht so einfach macht, kann Ihnen Kopfschmerzen bereiten - n\u00e4mlich dann, wenn Sie einen einfachen Test schreiben m\u00fcssen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Die Phantastischen Tierwesen: Warteschlangen, Datenbanken und wie man sie testet<\/h2>\n\n\n\n<p>Unit-Tests sind ziemlich einfach. Wenn Sie nur die Regeln befolgen, dann werden Ihre Testumgebung und <a href=\"https:\/\/thecodest.co\/de\/dictionary\/what-is-code-refactoring\/\">Code<\/a> gesund sind. Welche Regeln sind das?<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><b>Leicht zu schreiben<\/b> - ein Unit-Test sollte einfach zu schreiben sein, weil man viele davon schreibt. Weniger Aufwand bedeutet, dass mehr Tests geschrieben werden.<\/li>\n\n\n\n<li><b>Lesbar<\/b> - der Testcode sollte leicht zu lesen sein. Der Test ist eine Geschichte. Er beschreibt das Verhalten der Software und kann als Abk\u00fcrzung f\u00fcr die Dokumentation verwendet werden. Ein guter Unit-Test hilft Ihnen, Fehler zu beheben, ohne den Code zu debuggen.<\/li>\n\n\n\n<li><b>Zuverl\u00e4ssig<\/b> - der Test sollte nur dann fehlschlagen, wenn das getestete System einen Fehler aufweist. Offensichtlich? Nicht immer. Manchmal bestehen Tests, wenn Sie sie einzeln ausf\u00fchren, aber sie schlagen fehl, wenn Sie sie als Gruppe ausf\u00fchren. Sie funktionieren auf Ihrem Rechner, aber nicht auf dem CI (<a href=\"https:\/\/blog.codinghorror.com\/the-works-on-my-machine-certification-program\/\">Funktioniert auf meinem Rechner<\/a>). Bei einem guten Einheitstest gibt es nur einen Grund f\u00fcr ein Scheitern.<\/li>\n\n\n\n<li><b>Schnell<\/b> - Tests sollten schnell sein. Die Vorbereitung, der Start und die Testausf\u00fchrung selbst sollten sehr schnell gehen. Andernfalls werden Sie sie zwar schreiben, aber nicht ausf\u00fchren. Langsame Tests bedeuten, dass man den Fokus verliert. Man wartet und schaut auf den Fortschrittsbalken.<\/li>\n\n\n\n<li><b>Unabh\u00e4ngig<\/b> - Schlie\u00dflich sollte der Test unabh\u00e4ngig sein. Diese Regel ergibt sich aus den vorangegangenen. Nur wirklich unabh\u00e4ngige Tests k\u00f6nnen eine Einheit bilden. Sie st\u00f6ren sich nicht gegenseitig, k\u00f6nnen in beliebiger Reihenfolge ausgef\u00fchrt werden und m\u00f6gliche Fehler h\u00e4ngen nicht von den Ergebnissen anderer Tests ab. Unabh\u00e4ngig bedeutet auch, dass sie nicht von externen Ressourcen wie Datenbanken, Nachrichtendiensten oder dem Dateisystem abh\u00e4ngig sind. Wenn Sie mit externen Ressourcen kommunizieren m\u00fcssen, k\u00f6nnen Sie Mocks, Stubs oder Dummys verwenden.<\/li>\n<\/ul>\n\n\n\n<p>Kompliziert wird es, wenn wir einige Integrationstests schreiben wollen. Es ist nicht schlimm, wenn wir ein paar Dienste zusammen testen wollen. Aber wenn wir Dienste testen m\u00fcssen, die externe Ressourcen wie Datenbanken oder Nachrichtendienste nutzen, dann ist das ein Problem.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Um den Test durchf\u00fchren zu k\u00f6nnen, m\u00fcssen Sie die...<\/h3>\n\n\n\n<p>Vor vielen Jahren, als wir Integrationstests durchf\u00fchren und z. B. Datenbanken verwenden wollten, hatten wir zwei M\u00f6glichkeiten:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Wir k\u00f6nnen eine Datenbank lokal installieren. Richten Sie ein Schema ein und verbinden Sie sich von unserem Test aus;<\/li>\n\n\n\n<li>Wir k\u00f6nnen eine Verbindung zu einer bestehenden Instanz \"irgendwo im Weltraum\" herstellen.<\/li>\n<\/ol>\n\n\n\n<p>Beide hatten Vor- und Nachteile. Aber beide f\u00fchren zus\u00e4tzliche Ebenen der Komplexit\u00e4t ein. Manchmal handelte es sich um technische Komplexit\u00e4t, die sich aus den Merkmalen bestimmter Tools ergab, z. B. die Installation und Verwaltung der Oracle-DB auf Ihrem lokalen Rechner. Manchmal war es eine Unannehmlichkeit im Prozess, z. B. m\u00fcssen Sie mit dem Test einverstanden sein <a href=\"https:\/\/thecodest.co\/de\/dictionary\/how-to-lead-software-development-team\/\">Team<\/a> \u00fcber die JMS-Nutzung... jedes Mal, wenn Sie Tests durchf\u00fchren wollen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Container als Retter in der Not<\/h3>\n\n\n\n<p>In den letzten 10 Jahren hat sich die Idee der Containerisierung in der Branche durchgesetzt. Daher war es naheliegend, die Container als L\u00f6sung f\u00fcr unser Integrationstestproblem zu w\u00e4hlen. Dies ist eine einfache, saubere L\u00f6sung. Sie f\u00fchren einfach Ihren Prozess-Build aus und alles funktioniert! Sie k\u00f6nnen es nicht glauben? Werfen Sie einen Blick auf diese einfache Konfiguration eines Maven-Builds:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"xml\" class=\"language-xml\">com.dkanejs.maven.plugins\n     docker-compose-maven-plugin\n     4.0.0\n     \n       \n         up\n         test-kompilieren\n         \n           auf\n         \n         \n           ${<a href=\"https:\/\/thecodest.co\/de\/dictionary\/why-do-projects-fail\/\">Projekt<\/a>.basedir}\/docker-compose.yml\n           true\n         \n       \n       \n         down\n         Post-Integrationstest\n         \n           abw\u00e4rts\n         \n         \n           ${project.basedir}\/docker-compose.yml\n           true<\/code><\/pre>\n\n\n\n<p>Und die <code>docker-compose.yml<\/code> Die Datei sieht auch ziemlich gut aus!<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">Version: \"3.5\"\n\nDienste:\n\n postgres:\n   container_name: reactivedb\n   Abbild: postgres:13.2\n   neustart: immer\n   Umgebung:\n     - POSTGRES_USER=admin\n     - POSTGRES_PASSWORD=Passwort\n     - POSTGRES_DB=St\u00e4dte\n   Ports:\n     - \"5432:5432\"\n   Volumes:\n     - postgres_data:\/data\/db\n\n pgadmin:\n   container_name: pgadmin4\n   Abbild: dpage\/pgadmin4\n   Neustart: immer\n   Umgebung:\n     PGADMIN_DEFAULT_EMAIL: admin@admin.com\n     PGADMIN_DEFAULT_PASSWORD: passwort\n   ports:\n     - \"15050:80\"\n   Volumes:\n     - pgadmin_data:\/data\/pgadmin\n\nVolumes:\n postgres_data:\n pgadmin_data:<\/code><\/pre>\n\n\n\n<p>Aber k\u00f6nnen Sie das Problem hier erkennen?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ein Frachtschiff, das alles blockiert<\/h3>\n\n\n\n<p>Das obige Beispiel ist sehr einfach. Nur eine Postgres-Datenbank, pgAdmin und das ist alles. Wenn Sie<\/p>\n\n\n\n<p><code>bash<br>\n$ mvn clean verify<br>\n<\/code><br>dann startet das Maven-Plugin die Container und schaltet sie nach den Tests wieder aus. Die Probleme beginnen, wenn das Projekt w\u00e4chst und unsere Compose-Datei ebenfalls w\u00e4chst. Jedes Mal m\u00fcssen Sie alle Container starten, und sie bleiben w\u00e4hrend des gesamten Builds aktiv. Sie k\u00f6nnen die Situation ein wenig verbessern, indem Sie die Konfiguration der Plugin-Ausf\u00fchrung \u00e4ndern, aber das reicht nicht aus. Im schlimmsten Fall ersch\u00f6pfen Ihre Container die Systemressourcen, bevor die Tests beginnen!<\/p>\n\n\n\n<p>Und das ist nicht das einzige Problem. Sie k\u00f6nnen nicht einen einzigen Integrationstest von Ihrer IDE aus durchf\u00fchren. Vorher m\u00fcssen Sie die Container von Hand starten. Dar\u00fcber hinaus wird der n\u00e4chste Maven-Lauf diese Container abbauen (sehen Sie sich <code>unten<\/code> Ausf\u00fchrung).<\/p>\n\n\n\n<p>Diese L\u00f6sung ist also wie ein gro\u00dfes Frachtschiff. Wenn alles gut funktioniert, dann ist es in Ordnung. Jedes unerwartete oder ungew\u00f6hnliche Verhalten f\u00fchrt zu <a href=\"https:\/\/thecodest.co\/de\/blog\/why-us-companies-are-opting-for-polish-developers\/\">us<\/a> zu irgendeiner Art von Katastrophe.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Testcontainer - Ausf\u00fchren von Containern aus Tests<\/h2>\n\n\n\n<p>Aber was w\u00e4re, wenn wir unsere Container von Tests aus starten k\u00f6nnten? Diese Idee sieht gut aus, und sie wird bereits umgesetzt. <a href=\"https:\/\/www.testcontainers.org\/\" rel=\"nofollow\">Testcontainer<\/a>Da wir gerade \u00fcber dieses Projekt sprechen, hier eine L\u00f6sung f\u00fcr unsere Probleme. Nicht ideal, aber niemand ist perfekt.<\/p>\n\n\n\n<p>Dies ist eine <strong><a href=\"https:\/\/thecodest.co\/de\/blog\/top-programming-languages-to-build-e-commerce\/\">Java<\/a><\/strong> Bibliothek, die JUnit- und Spock-Tests unterst\u00fctzt und eine einfache M\u00f6glichkeit bietet, die <a href=\"https:\/\/thecodest.co\/de\/dictionary\/docker-developer\/\">Docker<\/a> Container. Schauen wir es uns an und schreiben wir etwas Code!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Voraussetzungen und Konfiguration<\/h3>\n\n\n\n<p>Bevor wir beginnen, m\u00fcssen wir unsere Konfiguration \u00fcberpr\u00fcfen. <strong>Test-Container<\/strong> brauchen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Docker in Version v17.09,<\/li>\n\n\n\n<li>Java Mindestversion 1.8,<\/li>\n\n\n\n<li>Zugang zum Netzwerk, insbesondere zum docker.hub.<\/li>\n<\/ul>\n\n\n\n<p>Weitere Informationen \u00fcber die Anforderungen f\u00fcr bestimmte Betriebssysteme und CIs finden Sie unter<br>in <a href=\"https:\/\/www.testcontainers.org\/supported_docker_environment\/\" rel=\"nofollow\">Dokumentation<\/a>.<\/p>\n\n\n\n<p>Nun ist es an der Zeit, ein paar Zeilen zu <code>pom.xml<\/code>.<\/p>\n\n\n\n<aside>Ich verwende Spring Boot in dem Projekt, um Boilerplate zu reduzieren. <strong>Test-Container<\/strong> sind unabh\u00e4ngig vom Spring Framework und k\u00f6nnen auch ohne dieses verwendet werden.<\/aside>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"xml\" class=\"language-xml\">org.testcontainers\n       testcontainers-bom\n       ${testcontaines.version}\n       pom\n       import\n     \n   \n \n \n   \n     org.postgresql\n     postgresql\n     Laufzeit\n   \n   \n     org.testcontainers\n     postgresql\n     test\n   \n   \n     org.testcontainers\n     junit-jupiter\n     test<\/code><\/pre>\n\n\n\n<p>Ich benutze <strong>Test-Container<\/strong> Version <code>1.17.3<\/code>Sie k\u00f6nnen aber gerne die neueste Version verwenden.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Tests mit Postgres-Container<\/h3>\n\n\n\n<p>Der erste Schritt besteht darin, unsere Instanz eines Containers vorzubereiten. Sie k\u00f6nnen dies direkt im Test tun, aber eine unabh\u00e4ngige Klasse sieht besser aus.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">public class Postgres13TC extends PostgreSQLContainer {\n\n private static final Postgres13TC TC = new Postgres13TC();\n\n private Postgres13TC() {\n   super(\"postgres:13.2\");\n }\n\n public static Postgres13TC getInstance() {\n   return TC;\n }\n\n @Override\n public void start() {\n   super.start();\n   System.setProperty(\"DB_URL\", TC.getJdbcUrl());\n   System.setProperty(\"DB_USERNAME\", TC.getUsername());\n   System.setProperty(\"DB_PASSWORD\", TC.getPassword());\n }\n\n @Override\n public void stop() {\n   \/\/ nichts tun. Dies ist eine gemeinsam genutzte Instanz. Lassen Sie die JVM diese Operation durchf\u00fchren.\n }\n}\n<\/code><\/pre>\n\n\n\n<p>Zu Beginn der Tests erstellen wir eine Instanz von <code>Postgres13TC<\/code>. Diese Klasse kann Informationen \u00fcber unseren Container verwalten. Das Wichtigste sind hier die Datenbankverbindungszeichenfolgen und die Anmeldeinformationen. Nun ist es an der Zeit, einen sehr einfachen Test zu schreiben.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">@Testcontainer\nKlasse SimpleDbTest {\n\n @Container\n private static Postgres13TC = Postgres13TC.getInstance();\n\n @Test\n void testConnection() {\n   assumeThat(postgres13TC.isRunning());\n   var connectionProps = new Eigenschaften();\n   connectionProps.put(\"user\", postgres13TC.getUsername());\n   connectionProps.put(\"password\", postgres13TC.getPassword());\n\n   try (Verbindung = DriverManager.getConnection(postgres13TC.getJdbcUrl(),\n       connectionProps)) {\n     var resultSet = connection.prepareStatement(\"Select 1\").executeQuery();\n     resultSet.next();\n     assertThat(resultSet.getInt(1)).isEqualTo(1);\n   } catch (SQLException sqlException) {\n     assertThat((Exception) sqlException).doesNotThrowAnyException();\n   }\n }\n}<\/code><\/pre>\n\n\n\n<p>Ich verwende hier JUnit 5. Anmerkung <code>@Testcontainers<\/code> ist ein Teil der Erweiterungen, die Container in der Testumgebung kontrollieren. Sie finden alle Felder mit <code>@Container<\/code> und Start- bzw. Stopp-Container.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Tests mit Spring Boot<\/h3>\n\n\n\n<p>Wie ich bereits erw\u00e4hnt habe, verwende ich Spring Boot in diesem Projekt. In diesem Fall m\u00fcssen wir ein wenig mehr Code schreiben. Der erste Schritt besteht darin, eine zus\u00e4tzliche Konfigurationsklasse zu erstellen.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">@Slf4j\npublic class ContainerInit implementiert\n   ApplicationContextInitializer {\n\n public static Postgres13TC;\n\n static {\n   postgres13TC = Postgres13TC.getInstance();\n   postgres13TC.start();\n }\n\n @Override\n public void initialize(ConfigurableApplicationContext applicationContext) {\n   TestPropertySourceUtils.addInlinedPropertiesToEnvironment(\n       applicationContext,\n       \"spring.datasource.url=\" + postgres13TC.getJdbcUrl(),\n       \"spring.datasource.username=\" + postgres13TC.getUsername(),\n       \"spring.datasource.password=\" + postgres13TC.getPassword(),\n       \"db.host=\" + postgres13TC.getHost(),\n       \"db.port=\" + postgres13TC.getMappedPort(postgres13TC.POSTGRESQL_PORT),\n       \"db.name=\" + postgres13TC.getDatabaseName(),\n       \"db.username=\" + postgres13TC.getUsername(),\n       \"db.passwort=\" + postgres13TC.getPasswort()\n   );\n }\n}<\/code><\/pre>\n\n\n\n<p>Diese Klasse \u00fcberschreibt die vorhandenen Eigenschaften mit Werten aus der <strong>Pr\u00fcfbeh\u00e4lter<\/strong>. Die ersten drei Eigenschaften sind Standard-Spring-Eigenschaften. Die n\u00e4chsten f\u00fcnf sind zus\u00e4tzliche, benutzerdefinierte Eigenschaften, die verwendet werden k\u00f6nnen, um andere Ressourcen und Erweiterungen wie z.B. liquibase zu konfigurieren:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"properties\" class=\"language-properties\">spring.liquibase.change-log=classpath:\/db\/changelog\/dbchangelog.xml\nspring.liquibase.url=jdbc:postgresql:\/\/${db.host:localhost}:${db.port:5432}\/${db.name:cities}\nspring.liquibase.user=${db.username:admin}\nspring.liquibase.password=${db.password:password}\nspring.liquibase.enabled=true<\/code><\/pre>\n\n\n\n<p>Nun ist es an der Zeit, einen einfachen Integrationstest zu definieren.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">@SpringBootTest(webEnvironment = RANDOM_PORT)\n@AutoConfigureTestDatabase(replace = NONE)\n@KontextKonfiguration(initializers = ContainerInit.class)\n@Testcontainer\nKlasse DummyRepositoryTest {\n\n @Autowired\n private DummyRepository;\n\n @Test\n void shouldReturnDummy() {\n   var byId = dummyRepository.getById(10L);\n   var expected = new Dummy();\n   expected.setId(10L);\n   assertThat(byId).completes().emitsCount(1).emits(expected);\n }\n}<\/code><\/pre>\n\n\n\n<p>Wir haben hier einige zus\u00e4tzliche Anmerkungen.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>@SpringBootTest(webUmgebung = RANDOM_PORT)<\/code> - markiert den Test als Spring Boot-Test und startet den Spring-Kontext.<\/li>\n\n\n\n<li><code>@AutoConfigureTestDatabase(replace = NONE)<\/code> - Diese Anmerkungen besagen, dass die Spring-Test-Erweiterung die Postgres-Datenbankkonfiguration nicht durch H2 in der Speicherkonfiguration ersetzen soll.<\/li>\n\n\n\n<li><code>@Kontextkonfiguration(initializers = ContainerInit.class)<\/code> - einen zus\u00e4tzlichen Fr\u00fchlingskontext<br>Konfiguration, in der wir die Eigenschaften von <strong>Test-Container<\/strong>.<\/li>\n\n\n\n<li><code>@Testcontainers<\/code> - wie bereits erw\u00e4hnt, steuert dieser Vermerk den Lebenszyklus des Containers.<\/li>\n<\/ul>\n\n\n\n<p>In diesem Beispiel verwende ich reaktive Repositories, aber es funktioniert genauso mit g\u00e4ngigen JDBC- und JPA-Repositories.<\/p>\n\n\n\n<p>Jetzt k\u00f6nnen wir diesen Test ausf\u00fchren. Wenn es der erste Lauf ist, muss die Engine Images von docker.hub ziehen. Das kann einen Moment dauern. Danach werden wir sehen, dass zwei Container gelaufen sind. Einer ist Postgres und der andere ist Testcontainers Controller. Dieser zweite Container verwaltet die laufenden Container, und selbst wenn die JVM unerwartet stoppt, schaltet er die Container ab und r\u00e4umt die Umgebung auf.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wir fassen zusammen<\/h2>\n\n\n\n<p><strong>Test-Container<\/strong> sind sehr einfach zu bedienende Tools, die uns helfen, Integrationstests zu erstellen, die Docker-Container verwenden. Das gibt uns mehr Flexibilit\u00e4t und erh\u00f6ht die Entwicklungsgeschwindigkeit. Die ordnungsgem\u00e4\u00dfe Einrichtung der Testkonfiguration verringert den Zeitaufwand f\u00fcr die Einarbeitung neuer Entwickler. Sie m\u00fcssen nicht alle Abh\u00e4ngigkeiten einrichten, sondern nur die geschriebenen Tests mit ausgew\u00e4hlten Konfigurationsdateien ausf\u00fchren.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/thecodest.co\/contact\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/interested_in_cooperation_.png\" alt=\"Kooperationsbanner\"\/><\/a><\/figure>","protected":false},"excerpt":{"rendered":"<p>Suchen Sie nach einer M\u00f6glichkeit, Tests auf einfachere Weise zu erstellen? Wir haben Sie! Lesen Sie den folgenden Artikel und erfahren Sie, wie Sie es m\u00f6glich machen.<\/p>","protected":false},"author":2,"featured_media":3632,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[8],"tags":[],"class_list":["post-3631","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software-development"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.3 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Test Containers \u2013 How to Make Tests Easier? - The Codest<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/thecodest.co\/de\/blog\/testcontainer-zur-vereinfachung-von-tests\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Test Containers \u2013 How to Make Tests Easier?\" \/>\n<meta property=\"og:description\" content=\"Are you looking for a way to make tests in an easier way? We got you! Check the following article and learn how to make it possible.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/thecodest.co\/de\/blog\/testcontainer-zur-vereinfachung-von-tests\/\" \/>\n<meta property=\"og:site_name\" content=\"The Codest\" \/>\n<meta property=\"article:published_time\" content=\"2022-07-26T11:02:35+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-11T06:00:15+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/test_containers_-_how_to_make_tests_easier_.png\" \/>\n\t<meta property=\"og:image:width\" content=\"960\" \/>\n\t<meta property=\"og:image:height\" content=\"540\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"thecodest\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"thecodest\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/\"},\"author\":{\"name\":\"thecodest\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#\\\/schema\\\/person\\\/7e3fe41dfa4f4e41a7baad4c6e0d4f76\"},\"headline\":\"Test Containers \u2013 How to Make Tests Easier?\",\"datePublished\":\"2022-07-26T11:02:35+00:00\",\"dateModified\":\"2026-03-11T06:00:15+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/\"},\"wordCount\":1399,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/test_containers_-_how_to_make_tests_easier_.png\",\"articleSection\":[\"Software Development\"],\"inLanguage\":\"de-DE\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/\",\"url\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/\",\"name\":\"Test Containers \u2013 How to Make Tests Easier? - The Codest\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/test_containers_-_how_to_make_tests_easier_.png\",\"datePublished\":\"2022-07-26T11:02:35+00:00\",\"dateModified\":\"2026-03-11T06:00:15+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/#breadcrumb\"},\"inLanguage\":\"de-DE\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de-DE\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/#primaryimage\",\"url\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/test_containers_-_how_to_make_tests_easier_.png\",\"contentUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/test_containers_-_how_to_make_tests_easier_.png\",\"width\":960,\"height\":540},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/thecodest.co\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Test Containers \u2013 How to Make Tests Easier?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#website\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"name\":\"The Codest\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/thecodest.co\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de-DE\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\",\"name\":\"The Codest\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de-DE\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/03\\\/thecodest-logo.svg\",\"contentUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/03\\\/thecodest-logo.svg\",\"width\":144,\"height\":36,\"caption\":\"The Codest\"},\"image\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/pl.linkedin.com\\\/company\\\/codest\",\"https:\\\/\\\/clutch.co\\\/profile\\\/codest\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#\\\/schema\\\/person\\\/7e3fe41dfa4f4e41a7baad4c6e0d4f76\",\"name\":\"thecodest\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de-DE\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g\",\"caption\":\"thecodest\"},\"url\":\"https:\\\/\\\/thecodest.co\\\/de\\\/author\\\/thecodest\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Testcontainer - Wie kann man Tests vereinfachen? - The Codest","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/thecodest.co\/de\/blog\/testcontainer-zur-vereinfachung-von-tests\/","og_locale":"de_DE","og_type":"article","og_title":"Test Containers \u2013 How to Make Tests Easier?","og_description":"Are you looking for a way to make tests in an easier way? We got you! Check the following article and learn how to make it possible.","og_url":"https:\/\/thecodest.co\/de\/blog\/testcontainer-zur-vereinfachung-von-tests\/","og_site_name":"The Codest","article_published_time":"2022-07-26T11:02:35+00:00","article_modified_time":"2026-03-11T06:00:15+00:00","og_image":[{"width":960,"height":540,"url":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/test_containers_-_how_to_make_tests_easier_.png","type":"image\/png"}],"author":"thecodest","twitter_card":"summary_large_image","twitter_misc":{"Written by":"thecodest","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/#article","isPartOf":{"@id":"https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/"},"author":{"name":"thecodest","@id":"https:\/\/thecodest.co\/#\/schema\/person\/7e3fe41dfa4f4e41a7baad4c6e0d4f76"},"headline":"Test Containers \u2013 How to Make Tests Easier?","datePublished":"2022-07-26T11:02:35+00:00","dateModified":"2026-03-11T06:00:15+00:00","mainEntityOfPage":{"@id":"https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/"},"wordCount":1399,"commentCount":0,"publisher":{"@id":"https:\/\/thecodest.co\/#organization"},"image":{"@id":"https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/#primaryimage"},"thumbnailUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/test_containers_-_how_to_make_tests_easier_.png","articleSection":["Software Development"],"inLanguage":"de-DE","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/","url":"https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/","name":"Testcontainer - Wie kann man Tests vereinfachen? - The Codest","isPartOf":{"@id":"https:\/\/thecodest.co\/#website"},"primaryImageOfPage":{"@id":"https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/#primaryimage"},"image":{"@id":"https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/#primaryimage"},"thumbnailUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/test_containers_-_how_to_make_tests_easier_.png","datePublished":"2022-07-26T11:02:35+00:00","dateModified":"2026-03-11T06:00:15+00:00","breadcrumb":{"@id":"https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/#breadcrumb"},"inLanguage":"de-DE","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/"]}]},{"@type":"ImageObject","inLanguage":"de-DE","@id":"https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/#primaryimage","url":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/test_containers_-_how_to_make_tests_easier_.png","contentUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/test_containers_-_how_to_make_tests_easier_.png","width":960,"height":540},{"@type":"BreadcrumbList","@id":"https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/thecodest.co\/"},{"@type":"ListItem","position":2,"name":"Test Containers \u2013 How to Make Tests Easier?"}]},{"@type":"WebSite","@id":"https:\/\/thecodest.co\/#website","url":"https:\/\/thecodest.co\/","name":"Der Codest","description":"","publisher":{"@id":"https:\/\/thecodest.co\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/thecodest.co\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de-DE"},{"@type":"Organization","@id":"https:\/\/thecodest.co\/#organization","name":"Der Codest","url":"https:\/\/thecodest.co\/","logo":{"@type":"ImageObject","inLanguage":"de-DE","@id":"https:\/\/thecodest.co\/#\/schema\/logo\/image\/","url":"https:\/\/thecodest.co\/app\/uploads\/2024\/03\/thecodest-logo.svg","contentUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/03\/thecodest-logo.svg","width":144,"height":36,"caption":"The Codest"},"image":{"@id":"https:\/\/thecodest.co\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/pl.linkedin.com\/company\/codest","https:\/\/clutch.co\/profile\/codest"]},{"@type":"Person","@id":"https:\/\/thecodest.co\/#\/schema\/person\/7e3fe41dfa4f4e41a7baad4c6e0d4f76","name":"thecodest","image":{"@type":"ImageObject","inLanguage":"de-DE","@id":"https:\/\/secure.gravatar.com\/avatar\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g","caption":"thecodest"},"url":"https:\/\/thecodest.co\/de\/author\/thecodest\/"}]}},"_links":{"self":[{"href":"https:\/\/thecodest.co\/de\/wp-json\/wp\/v2\/posts\/3631","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thecodest.co\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thecodest.co\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thecodest.co\/de\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thecodest.co\/de\/wp-json\/wp\/v2\/comments?post=3631"}],"version-history":[{"count":9,"href":"https:\/\/thecodest.co\/de\/wp-json\/wp\/v2\/posts\/3631\/revisions"}],"predecessor-version":[{"id":8016,"href":"https:\/\/thecodest.co\/de\/wp-json\/wp\/v2\/posts\/3631\/revisions\/8016"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thecodest.co\/de\/wp-json\/wp\/v2\/media\/3632"}],"wp:attachment":[{"href":"https:\/\/thecodest.co\/de\/wp-json\/wp\/v2\/media?parent=3631"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thecodest.co\/de\/wp-json\/wp\/v2\/categories?post=3631"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thecodest.co\/de\/wp-json\/wp\/v2\/tags?post=3631"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}