{"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":"conteneurs-de-test-comment-faciliter-les-tests","status":"publish","type":"post","link":"https:\/\/thecodest.co\/fr\/blog\/test-containers-how-to-make-tests-easier\/","title":{"rendered":"Conteneurs de test - Comment faciliter les tests ?"},"content":{"rendered":"<p>Le d\u00e9veloppement d'applications modernes repose sur une r\u00e8gle simple :<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><b>Utiliser la composition<\/b><\/p>\n<\/blockquote>\n\n\n\n<p>Nous composons des classes, des fonctions et des services pour en faire des logiciels plus importants. Ce dernier \u00e9l\u00e9ment est le fondement de <a href=\"https:\/\/thecodest.co\/fr\/dictionary\/microservices\/\">microservices<\/a> et <a href=\"https:\/\/thecodest.co\/fr\/blog\/the-power-of-hexagonal-architecture\/\">architecture hexagonale<\/a>. Nous aimerions utiliser des solutions existantes, les int\u00e9grer \u00e0 notre logiciel et passer directement \u00e0 l'\u00e9tape de la mise en \u0153uvre. <a href=\"https:\/\/thecodest.co\/fr\/dictionary\/what-is-the-size-of-your-potential-reachable-market\/\">march\u00e9<\/a>.<\/p>\n\n\n\n<p>Voulez-vous g\u00e9rer l'enregistrement des comptes et stocker les donn\u00e9es des utilisateurs ? <a href=\"https:\/\/thecodest.co\/fr\/blog\/app-data-collection-security-risks-value-and-types-explored\/\">donn\u00e9es<\/a>? Vous pouvez choisir l'un des services OAuth. Votre application propose peut-\u00eatre une forme d'abonnement ou de paiement ? Il existe de nombreux services qui peuvent vous aider \u00e0 g\u00e9rer cela. Vous avez besoin d'analyses sur votre site web, mais vous ne comprenez pas ce qu'est l'analyse. <a href=\"https:\/\/thecodest.co\/fr\/blog\/cyber-security-dilemmas-data-leaks\/\">GDPR<\/a>? N'h\u00e9sitez pas \u00e0 opter pour l'une des solutions pr\u00eates \u00e0 l'emploi.<\/p>\n\n\n\n<p>Quelque chose qui rend le d\u00e9veloppement si facile du point de vue de l'entreprise peut vous donner des maux de t\u00eate - au moment o\u00f9 vous devez \u00e9crire un simple test.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Les b\u00eates fantastiques : Files d'attente, bases de donn\u00e9es et comment les tester<\/h2>\n\n\n\n<p>Les tests unitaires sont assez simples. Si vous vous contentez de suivre les r\u00e8gles, votre environnement de test et votre syst\u00e8me de gestion de l'information ne seront pas perturb\u00e9s. <a href=\"https:\/\/thecodest.co\/fr\/dictionary\/what-is-code-refactoring\/\">code<\/a> sont saines. Quelles sont ces r\u00e8gles ?<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><b>Facile \u00e0 \u00e9crire<\/b> - un test unitaire doit \u00eatre facile \u00e0 \u00e9crire car on en \u00e9crit beaucoup. Moins d'efforts signifient que plus de tests sont \u00e9crits.<\/li>\n\n\n\n<li><b>Lisible<\/b> - le code de test doit \u00eatre facile \u00e0 lire. Le test est une histoire. Il d\u00e9crit le comportement du logiciel et peut \u00eatre utilis\u00e9 comme raccourci de documentation. Un bon test unitaire vous aide \u00e0 corriger les bogues sans d\u00e9boguer le code.<\/li>\n\n\n\n<li><b>Fiable<\/b> - le test ne doit \u00e9chouer que s'il y a un bogue dans le syst\u00e8me test\u00e9. C'est \u00e9vident ? Pas toujours. Parfois, les tests r\u00e9ussissent si vous les ex\u00e9cutez un par un, mais \u00e9chouent lorsque vous les ex\u00e9cutez en tant qu'ensemble. Ils r\u00e9ussissent sur votre machine, mais \u00e9chouent sur CI (<a href=\"https:\/\/blog.codinghorror.com\/the-works-on-my-machine-certification-program\/\">Fonctionne sur ma machine<\/a>). Un bon test unitaire n'a qu'une seule raison d'\u00e9chouer.<\/li>\n\n\n\n<li><b>Rapide<\/b> - Les tests doivent \u00eatre rapides. La pr\u00e9paration de l'ex\u00e9cution, le d\u00e9marrage et l'ex\u00e9cution du test lui-m\u00eame doivent \u00eatre tr\u00e8s rapides. Sinon, vous les \u00e9crirez, mais ne les ex\u00e9cuterez pas. Des tests lents sont synonymes de perte de concentration. Vous attendez et regardez la barre de progression.<\/li>\n\n\n\n<li><b>Ind\u00e9pendants<\/b> - enfin, le test doit \u00eatre ind\u00e9pendant. Cette r\u00e8gle d\u00e9coule des pr\u00e9c\u00e9dentes. Seuls des tests r\u00e9ellement ind\u00e9pendants peuvent constituer une unit\u00e9. Ils n'interf\u00e8rent pas les uns avec les autres, peuvent \u00eatre ex\u00e9cut\u00e9s dans n'importe quel ordre et les \u00e9checs potentiels ne d\u00e9pendent pas des r\u00e9sultats des autres tests. Ind\u00e9pendants signifie \u00e9galement qu'ils ne d\u00e9pendent pas de ressources externes telles que des bases de donn\u00e9es, des services de messagerie ou des syst\u00e8mes de fichiers. Si vous avez besoin de communiquer avec des ressources externes, vous pouvez utiliser des mocks, des stubs ou des dummies.<\/li>\n<\/ul>\n\n\n\n<p>Tout se complique lorsque nous voulons \u00e9crire des tests d'int\u00e9gration. Ce n'est pas grave si nous voulons tester quelques services ensemble. Mais lorsque nous devons tester des services qui utilisent des ressources externes comme des bases de donn\u00e9es ou des services de messagerie, nous nous exposons \u00e0 des probl\u00e8mes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Pour effectuer le test, vous devez installer...<\/h3>\n\n\n\n<p>Il y a de nombreuses ann\u00e9es, lorsque nous voulions r\u00e9aliser des tests d'int\u00e9gration et utiliser, par exemple, des bases de donn\u00e9es, nous avions deux options :<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Nous pouvons installer une base de donn\u00e9es localement. Configurez un sch\u00e9ma et connectez-vous \u00e0 partir de notre test ;<\/li>\n\n\n\n<li>Nous pouvons nous connecter \u00e0 une instance existante \"quelque part dans l'espace\".<\/li>\n<\/ol>\n\n\n\n<p>Les deux ont des avantages et des inconv\u00e9nients. Mais tous deux introduisent des niveaux de complexit\u00e9 suppl\u00e9mentaires. Parfois, il s'agissait d'une complexit\u00e9 technique d\u00e9coulant des caract\u00e9ristiques de certains outils, par exemple l'installation et la gestion d'une base de donn\u00e9es Oracle sur votre h\u00f4te local. Parfois, il s'agissait d'un inconv\u00e9nient dans le processus, par exemple, vous devez \u00eatre d'accord avec le test. <a href=\"https:\/\/thecodest.co\/fr\/dictionary\/how-to-lead-software-development-team\/\">\u00e9quipe<\/a> sur l'utilisation de JMS... \u00e0 chaque fois que vous voulez ex\u00e9cuter des tests.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Les conteneurs \u00e0 la rescousse<\/h3>\n\n\n\n<p>Au cours des dix derni\u00e8res ann\u00e9es, l'id\u00e9e de la conteneurisation a gagn\u00e9 en reconnaissance dans l'industrie. Il est donc naturel de choisir les conteneurs comme solution \u00e0 notre probl\u00e8me de test d'int\u00e9gration. Il s'agit d'une solution simple et propre. Il suffit d'ex\u00e9cuter le processus de construction et tout fonctionne ! Vous n'arrivez pas \u00e0 y croire ? Jetez un coup d'\u0153il \u00e0 cette configuration simple d'un build maven :<\/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-compile\n         \n           up\n         \n         \n           ${<a href=\"https:\/\/thecodest.co\/fr\/dictionary\/why-do-projects-fail\/\">projet<\/a>.basedir}\/docker-compose.yml\n           true\n         \n       \n       \n         down\n         post-int\u00e9gration-test\n         \n           down\n         \n         \n           ${projet.basedir}\/docker-compose.yml\n           true<\/code><\/pre>\n\n\n\n<p>Et le <code>docker-compose.yml<\/code> Le dossier a l'air plut\u00f4t bien, lui aussi !<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">version : \"3.5\"\n\nservices :\n\n postgres :\n   nom_du_conteneur : reactivedb\n   image : postgres:13.2\n   restart : always\n   environnement :\n     - POSTGRES_USER=admin\n     - POSTGRES_PASSWORD=motdepasse\n     - POSTGRES_DB=cities\n   ports :\n     - \"5432:5432\"\n   volumes :\n     - postgres_data:\/data\/db\n\n pgadmin :\n   nom_du_conteneur : pgadmin4\n   image : dpage\/pgadmin4\n   restart : always\n   environnement :\n     PGADMIN_DEFAULT_EMAIL : admin@admin.com\n     PGADMIN_DEFAULT_PASSWORD : mot de passe\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>Mais voyez-vous le probl\u00e8me ici ?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Un cargo qui bloque tout<\/h3>\n\n\n\n<p>L'exemple ci-dessus est tr\u00e8s simple. Une base de donn\u00e9es postgres, pgAdmin et c'est tout. Lorsque vous ex\u00e9cutez<\/p>\n\n\n\n<p><code>bash<br>\n$ mvn clean verify<br>\n<\/code><br>puis le plugin maven d\u00e9marre les conteneurs et les d\u00e9sactive apr\u00e8s les tests. Les probl\u00e8mes commencent lorsque le projet grandit et que notre fichier de composition grandit aussi. \u00c0 chaque fois, vous devrez d\u00e9marrer tous les conteneurs, et ils resteront en vie pendant toute la dur\u00e9e de la construction. Vous pouvez am\u00e9liorer un peu la situation en changeant la configuration de l'ex\u00e9cution du plugin, mais ce n'est pas suffisant. Dans le pire des cas, vos conteneurs \u00e9puisent les ressources du syst\u00e8me avant que les tests ne commencent !<\/p>\n\n\n\n<p>Et ce n'est pas le seul probl\u00e8me. Vous ne pouvez pas ex\u00e9cuter un seul test d'int\u00e9gration \u00e0 partir de votre IDE. Avant cela, vous devez d\u00e9marrer les conteneurs \u00e0 la main. De plus, la prochaine ex\u00e9cution de maven d\u00e9molira ces conteneurs (jetez un coup d'\u0153il \u00e0 <code>vers le bas<\/code> ex\u00e9cution).<\/p>\n\n\n\n<p>Cette solution est donc comme un gros cargo. Si tout fonctionne bien, tout va bien. Tout comportement inattendu ou inhabituel entra\u00eene <a href=\"https:\/\/thecodest.co\/fr\/blog\/why-us-companies-are-opting-for-polish-developers\/\">nous<\/a> \u00e0 une catastrophe quelconque.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conteneurs de test - ex\u00e9cuter des conteneurs \u00e0 partir de tests<\/h2>\n\n\n\n<p>Mais que se passerait-il si nous pouvions faire fonctionner nos conteneurs \u00e0 partir de tests ? L'id\u00e9e semble bonne, et elle est d\u00e9j\u00e0 en cours de mise en \u0153uvre. <a href=\"https:\/\/www.testcontainers.org\/\" rel=\"nofollow\">Conteneurs d'essai<\/a>Puisque nous parlons de ce projet, voici une solution \u00e0 nos probl\u00e8mes. Elle n'est pas id\u00e9ale, mais personne n'est parfait.<\/p>\n\n\n\n<p>Il s'agit d'un <strong><a href=\"https:\/\/thecodest.co\/fr\/blog\/top-programming-languages-to-build-e-commerce\/\">Java<\/a><\/strong> qui prend en charge les tests JUnit et Spock, offrant ainsi des moyens l\u00e9gers et faciles d'ex\u00e9cuter le programme <a href=\"https:\/\/thecodest.co\/fr\/dictionary\/docker-developer\/\">Docker<\/a> conteneur. Jetons-y un coup d'\u0153il et \u00e9crivons un peu de code !<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Conditions pr\u00e9alables et configuration<\/h3>\n\n\n\n<p>Avant de commencer, nous devons v\u00e9rifier notre configuration. <strong>Conteneurs d'essai<\/strong> besoin :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Docker dans la version v17.09,<\/li>\n\n\n\n<li>Java version 1.8 minimum,<\/li>\n\n\n\n<li>Acc\u00e8s au r\u00e9seau, en particulier \u00e0 docker.hub.<\/li>\n<\/ul>\n\n\n\n<p>Pour en savoir plus sur les exigences relatives \u00e0 des syst\u00e8mes d'exploitation et \u00e0 des syst\u00e8mes d'information sp\u00e9cifiques, voir<br>en <a href=\"https:\/\/www.testcontainers.org\/supported_docker_environment\/\" rel=\"nofollow\">la documentation<\/a>.<\/p>\n\n\n\n<p>Il est maintenant temps d'ajouter quelques lignes \u00e0 <code>pom.xml<\/code>.<\/p>\n\n\n\n<aside>J'utilise Spring Boot dans le projet afin de r\u00e9duire le nombre de t\u00e2ches r\u00e9p\u00e9titives. <strong>Conteneurs d'essai<\/strong> sont ind\u00e9pendants de Spring Framework et vous pouvez les utiliser sans cela.<\/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     runtime\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>J'utilise <strong>Conteneurs d'essai<\/strong> version <code>1.17.3<\/code>mais n'h\u00e9sitez pas \u00e0 utiliser la plus r\u00e9cente.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Tests avec le conteneur Postgres<\/h3>\n\n\n\n<p>La premi\u00e8re \u00e9tape consiste \u00e0 pr\u00e9parer notre instance de conteneur. Vous pouvez le faire directement dans le test, mais il est pr\u00e9f\u00e9rable d'utiliser une classe ind\u00e9pendante.<\/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   \/\/ ne fait rien. Il s'agit d'une instance partag\u00e9e. Laissez la JVM g\u00e9rer cette op\u00e9ration.\n }\n}\n<\/code><\/pre>\n\n\n\n<p>Au d\u00e9but des tests, nous cr\u00e9erons une instance de <code>Postgres13TC<\/code>. Cette classe permet de g\u00e9rer les informations relatives \u00e0 notre conteneur. Les plus importantes sont les cha\u00eenes de connexion \u00e0 la base de donn\u00e9es et les informations d'identification. Il est maintenant temps d'\u00e9crire un test tr\u00e8s simple.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">@Testcontainers\nclass SimpleDbTest {\n\n @Container\n private static Postgres13TC = Postgres13TC.getInstance() ;\n\n @Test\n void testConnection() {\n   assumeThat(postgres13TC.isRunning()) ;\n   var connectionProps = new Properties() ;\n   connectionProps.put(\"user\", postgres13TC.getUsername()) ;\n   connectionProps.put(\"password\", postgres13TC.getPassword()) ;\n\n   try (Connection = 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>J'utilise ici JUnit 5. Annotation <code>@Testcontainers<\/code> fait partie des extensions qui contr\u00f4lent les conteneurs dans l'environnement de test. Ils trouvent tous les champs avec <code>@Container<\/code> et les conteneurs de d\u00e9marrage et d'arr\u00eat respectivement.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Tests avec Spring Boot<\/h3>\n\n\n\n<p>Comme je l'ai d\u00e9j\u00e0 mentionn\u00e9, j'utilise Spring Boot dans le projet. Dans ce cas, nous devons \u00e9crire un peu plus de code. La premi\u00e8re \u00e9tape consiste \u00e0 cr\u00e9er une classe de configuration suppl\u00e9mentaire.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">@Slf4j\npublic class ContainerInit implements\n   ApplicationContextInitializer {\n\n public static Postgres13TC ;\n\n statique {\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.password=\" + postgres13TC.getPassword()\n   ) ;\n }\n}<\/code><\/pre>\n\n\n\n<p>Cette classe remplace les propri\u00e9t\u00e9s existantes par des valeurs provenant de la classe <strong>r\u00e9cipient d'essai<\/strong>. Les trois premi\u00e8res propri\u00e9t\u00e9s sont des propri\u00e9t\u00e9s standard de Spring. Les cinq suivantes sont des propri\u00e9t\u00e9s suppl\u00e9mentaires, personnalis\u00e9es, qui peuvent \u00eatre utilis\u00e9es pour configurer d'autres ressources et extensions comme liquibase, par exemple :<\/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>Il est maintenant temps de d\u00e9finir un test d'int\u00e9gration simple.<\/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@ContextConfiguration(initializers = ContainerInit.class)\n@Testcontainers\nclass 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>Nous avons ici quelques annotations suppl\u00e9mentaires.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>@SpringBootTest(webEnvironment = RANDOM_PORT)<\/code> - marque le test comme un test Spring Boot et d\u00e9marre le contexte Spring.<\/li>\n\n\n\n<li><code>@AutoConfigureTestDatabase(replace = NONE)<\/code> - Ces annotations indiquent que l'extension Spring Test ne doit pas remplacer la configuration de la base de donn\u00e9es postgres par H2 dans la configuration de la m\u00e9moire.<\/li>\n\n\n\n<li><code>@ContextConfiguration(initializers = ContainerInit.class)<\/code> - un contexte de printemps suppl\u00e9mentaire<br>o\u00f9 nous mettons en place des propri\u00e9t\u00e9s de <strong>Conteneurs d'essai<\/strong>.<\/li>\n\n\n\n<li><code>@Testcontainers<\/code> - comme indiqu\u00e9 pr\u00e9c\u00e9demment, cette annotation contr\u00f4le le cycle de vie du conteneur.<\/li>\n<\/ul>\n\n\n\n<p>Dans cet exemple, j'utilise des r\u00e9f\u00e9rentiels r\u00e9actifs, mais cela fonctionne de la m\u00eame mani\u00e8re avec les r\u00e9f\u00e9rentiels JDBC et JPA courants.<\/p>\n\n\n\n<p>Nous pouvons maintenant ex\u00e9cuter ce test. S'il s'agit de la premi\u00e8re ex\u00e9cution, le moteur doit extraire les images de docker.hub. Cela peut prendre un moment. Apr\u00e8s cela, nous verrons que deux conteneurs ont \u00e9t\u00e9 ex\u00e9cut\u00e9s. L'un est postgres et l'autre est Testcontainers controller. Ce deuxi\u00e8me conteneur g\u00e8re les conteneurs en cours d'ex\u00e9cution et m\u00eame si la JVM s'arr\u00eate inopin\u00e9ment, il \u00e9teint les conteneurs et nettoie l'environnement.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">En r\u00e9sum\u00e9<\/h2>\n\n\n\n<p><strong>Conteneurs d'essai<\/strong> sont des outils tr\u00e8s faciles \u00e0 utiliser qui nous aident \u00e0 cr\u00e9er des tests d'int\u00e9gration utilisant des conteneurs Docker. Cela nous donne plus de flexibilit\u00e9 et augmente la vitesse de d\u00e9veloppement. La mise en place correcte de la configuration des tests r\u00e9duit le temps n\u00e9cessaire \u00e0 l'int\u00e9gration des nouveaux d\u00e9veloppeurs. Ils n'ont pas besoin de configurer toutes les d\u00e9pendances, il suffit d'ex\u00e9cuter les tests \u00e9crits avec les fichiers de configuration s\u00e9lectionn\u00e9s.<\/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=\"banni\u00e8re de coop\u00e9ration\"\/><\/a><\/figure>","protected":false},"excerpt":{"rendered":"<p>Vous cherchez un moyen de faire des tests plus facilement ? Nous avons ce qu'il vous faut ! Consultez l'article suivant et apprenez comment y parvenir.<\/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\/fr\/blog\/conteneurs-de-test-comment-faciliter-les-tests\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/blog\/conteneurs-de-test-comment-faciliter-les-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\":\"fr-FR\",\"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\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@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\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\",\"name\":\"The Codest\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@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\":\"fr-FR\",\"@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\\\/fr\\\/author\\\/thecodest\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Conteneurs de test - Comment faciliter les tests ? - 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\/fr\/blog\/conteneurs-de-test-comment-faciliter-les-tests\/","og_locale":"fr_FR","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\/fr\/blog\/conteneurs-de-test-comment-faciliter-les-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":"fr-FR","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":"Conteneurs de test - Comment faciliter les tests ? - 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":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@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":"fr-FR"},{"@type":"Organization","@id":"https:\/\/thecodest.co\/#organization","name":"The Codest","url":"https:\/\/thecodest.co\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@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":"fr-FR","@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\/fr\/author\/thecodest\/"}]}},"_links":{"self":[{"href":"https:\/\/thecodest.co\/fr\/wp-json\/wp\/v2\/posts\/3631","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thecodest.co\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thecodest.co\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thecodest.co\/fr\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thecodest.co\/fr\/wp-json\/wp\/v2\/comments?post=3631"}],"version-history":[{"count":9,"href":"https:\/\/thecodest.co\/fr\/wp-json\/wp\/v2\/posts\/3631\/revisions"}],"predecessor-version":[{"id":8016,"href":"https:\/\/thecodest.co\/fr\/wp-json\/wp\/v2\/posts\/3631\/revisions\/8016"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thecodest.co\/fr\/wp-json\/wp\/v2\/media\/3632"}],"wp:attachment":[{"href":"https:\/\/thecodest.co\/fr\/wp-json\/wp\/v2\/media?parent=3631"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thecodest.co\/fr\/wp-json\/wp\/v2\/categories?post=3631"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thecodest.co\/fr\/wp-json\/wp\/v2\/tags?post=3631"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}