{"id":1005,"date":"2020-02-17T15:35:02","date_gmt":"2020-02-17T14:35:02","guid":{"rendered":"https:\/\/www.loicmathieu.fr\/wordpress\/?p=1005"},"modified":"2020-02-21T13:49:54","modified_gmt":"2020-02-21T12:49:54","slug":"quarkus-et-testcontainers","status":"publish","type":"post","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/quarkus-et-testcontainers\/","title":{"rendered":"Quarkus et Testcontainers"},"content":{"rendered":"<p>Si vous ne connaissait pas Quarkus, voici un article d&rsquo;introduction : <a href=\"https:\/\/blog.zenika.com\/2019\/04\/23\/zoom-sur-quarkus\/\" target=\"_blank\" rel=\"noopener noreferrer\">Zoom sur Quarkus<\/a>.<\/p>\n<p>Quarkus offre un support des Tests Unitaires (TU) avec JUnit 5 via l&rsquo;annotation <a>@QuarkusTest<\/code>code&gt;@QuarkusTest&lt;\/code<\/a>, la documentation du support des TU de Quarkus peut \u00eatre trouv\u00e9 <a href=\"https:\/\/quarkus.io\/guides\/getting-started-testing\" target=\"_blank\" rel=\"noopener noreferrer\">ici<\/a>.<\/p>\n<p>Voici un exemple de TU tir\u00e9 du <a href=\"https:\/\/github.com\/quarkusio\/quarkus-quickstarts\/blob\/master\/hibernate-orm-quickstart\" target=\"_blank\" rel=\"noopener noreferrer\">Quickstart Hibernate ORM<\/a> :<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\n@QuarkusTest\npublic class FruitsEndpointTest {\n\n    @Test\n    public void testListAllFruits() {\n        given()\n              .when().get(\"\/fruits\")\n              .then()\n              .statusCode(200)\n              .body(\n                    containsString(\"Cherry\"),\n                    containsString(\"Apple\"),\n                    containsString(\"Banana\")\n                    );\n    }\n}\n<\/pre>\n<p>Classiquement, on peut ex\u00e9cuter des tests en utilisant une base de donn\u00e9es embarqu\u00e9e, Quarkus supporte la BDD H2 pour \u00e7a. Mais si on veut que nos tests tournent dans un environnement qui ressemble le plus \u00e0 la production, l&rsquo;utilisation de la m\u00eame base de donn\u00e9es est id\u00e9ale.<\/p>\n<p>On voudrait donc pouvoir utiliser une base de donn\u00e9es Postgres pour ex\u00e9cuter nos tests.<\/p>\n<p><a href=\"https:\/\/www.testcontainers.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Testcontainers<\/a> est une librairie qui permet de facilement d\u00e9marrer un conteneur Docker au sein de vos TUs. Il fournit une extension JUnit 5 et une extension permettant de facilement lancer des bases de donn\u00e9es. Son utilisation serait donc id\u00e9ale pour lancer une base de donn\u00e9es Postgres pour nos TUs.<\/p>\n<p>L&rsquo;int\u00e9gration classique de Testcontainers se fait via l&rsquo;annotation <a>@Testcontainers<\/code>code&gt;@Testcontainers&lt;\/code<\/a> qui permet de d\u00e9marrer l&rsquo;extension JUnit 5 pour Testcontainers et permet de d\u00e9marrer des conteneurs via <a>@Container<\/code>code&gt;@Container&lt;\/code<\/a>, voir la documentation de <a href=\"https:\/\/www.testcontainers.org\/test_framework_integration\/junit_5\/\" target=\"_blank\" rel=\"noopener noreferrer\">l&rsquo;extension Junit 5 de Testcontainers<\/a>.<\/p>\n<p>Le soucis c&rsquo;est que les deux extensions, celle de Quarkus et celle de Testcontainers, ne fonctionne pas tr\u00e8s bien ensemble car Quarkus va d\u00e9marrer avant Testcontainers et le conteneur ne sera pas d\u00e9marr\u00e9 avant le d\u00e9marrage de l&rsquo;application Quarkus. La base de donn\u00e9es ne sera donc pas d\u00e9marr\u00e9 lors du d\u00e9marrage de votre application et celle-ci ne r\u00e9ussira donc pas \u00e0 d\u00e9marrer.<\/p>\n<p>Avec JUnit 5, on devrait pouvoir ordonner les extensions entre elles via <a>@ExtendWith<\/code>code&gt;@ExtendWith&lt;\/code<\/a> mais ce n&rsquo;est pas possible d&rsquo;utiliser cette annotation avec Testcontainers (plus d&rsquo;info <a href=\"https:\/\/github.com\/testcontainers\/testcontainers-java\/issues\/2045\" target=\"_blank\" rel=\"noopener noreferrer\">ici<\/a>).<\/p>\n<p>La solution ? L&rsquo;utilisation d&rsquo;une URL JDBC modifi\u00e9e pour Testcontainers (document\u00e9e <a href=\"https:\/\/www.testcontainers.org\/modules\/databases\/\" target=\"_blank\" rel=\"noopener noreferrer\">ici<\/a>).<\/p>\n<p>Pour notre exemple il faut tout d&rsquo;abord ajouter les d\u00e9pendances Testcontainers \u00e0 notre <code>pom.xml<\/code>.<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n    \n      org.testcontainers\n      testcontainers\n      ${testcontainers.version}\n      test\n    \n    \n      org.testcontainers\n      junit-jupiter\n      ${testcontainers.version}\n      test\n    \n    \n      org.testcontainers\n      postgresql\n      ${testcontainers.version}\n      test\n    \n<\/pre>\n<p>Ensuite, ajouter l&rsquo;annotation <a>@Testcontainers<\/code>code&gt;@Testcontainers&lt;\/code<\/a> \u00e0 notre <code>FruitsEndpointTest<\/code>.<\/p>\n<p>Pour finir configurer notre datasource via notre <code>application.properties<\/code> en utilisant une URL JDBC modifi\u00e9e pour Testcontainers :<\/p>\n<pre>\nquarkus.datasource.url = jdbc:tc:postgresql:11.3:\/\/hostname\/mydatabase\nquarkus.datasource.driver = org.testcontainers.jdbc.ContainerDatabaseDriver\nquarkus.hibernate-orm.dialect = org.hibernate.dialect.PostgreSQLDialect\n<\/pre>\n<p><strong>Attention, il faut alors sp\u00e9cifier le dialect Hibernate car la s\u00e9lection automatique de dialect ne fonctionne pas quand l&rsquo;URL JDBC est modifi\u00e9e.<\/strong><\/p>\n<p>Une fois tout \u00e7a configur\u00e9, lorsque Quarkus initialisera sa datasource, Testcontainers d\u00e9marrera automatiquement un conteneur Postgres et vous verrez les lignes suivantes dans vos logs :<\/p>\n<pre>\n2020-02-17 15:03:20,078 INFO  [org.tes.doc.DockerClientProviderStrategy] (Agroal_5751340441) Loaded org.testcontainers.dockerclient.EnvironmentAndSystemPropertyClientProviderStrategy from ~\/.testcontainers.properties, will try it first\n2020-02-17 15:03:20,283 INFO  [org.tes.doc.EnvironmentAndSystemPropertyClientProviderStrategy] (Agroal_5751340441) Found docker client settings from environment\n2020-02-17 15:03:20,283 INFO  [org.tes.doc.DockerClientProviderStrategy] (Agroal_5751340441) Found Docker environment with Environment variables, system properties and defaults. Resolved dockerHost=unix:\/\/\/var\/run\/docker.sock\n2020-02-17 15:03:20,374 INFO  [org.tes.DockerClientFactory] (Agroal_5751340441) Docker host IP address is localhost\n2020-02-17 15:03:20,390 INFO  [org.tes.DockerClientFactory] (Agroal_5751340441) Connected to docker: \n[...]\n2020-02-17 15:03:20,958 INFO  [org.tes.DockerClientFactory] (Agroal_5751340441) Ryuk started - will monitor and terminate Testcontainers containers on JVM exit\n2020-02-17 15:03:20,970 INFO  [\ud83d\udc33 .3]] (Agroal_5751340441) Creating container for image: postgres:11.3\n2020-02-17 15:03:21,009 INFO  [\ud83d\udc33 .3]] (Agroal_5751340441) Starting container with ID: c40f75e48f238f2aafe14899adae0afd3a3948396c19247aff64811166d4b057\n2020-02-17 15:03:21,390 INFO  [\ud83d\udc33 .3]] (Agroal_5751340441) Container postgres:11.3 is starting: c40f75e48f238f2aafe14899adae0afd3a3948396c19247aff64811166d4b057\n2020-02-17 15:03:23,038 INFO  [\ud83d\udc33 .3]] (Agroal_5751340441) Container postgres:11.3 started in PT2.067585S\n<\/pre>\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>Si vous ne connaissait pas Quarkus, voici un article d&rsquo;introduction : Zoom sur Quarkus. Quarkus offre un support des Tests Unitaires (TU) avec JUnit 5 via l&rsquo;annotation @QuarkusTestcode&gt;@QuarkusTest&lt;\/code, la documentation du support des TU de Quarkus peut \u00eatre trouv\u00e9 ici. Voici un exemple de TU tir\u00e9 du Quickstart Hibernate ORM : @QuarkusTest public class FruitsEndpointTest { @Test public void testListAllFruits() { given() .when().get(&quot;\/fruits&quot;) .then() .statusCode(200) .body( containsString(&quot;Cherry&quot;), containsString(&quot;Apple&quot;), containsString(&quot;Banana&quot;) ); } } Classiquement, on peut ex\u00e9cuter des tests en utilisant&#8230;<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/quarkus-et-testcontainers\/\">Lire la suite<span class=\"screen-reader-text\"> Lire la suite<\/span><\/a><\/p><\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[9],"tags":[11,167,46,177],"class_list":["post-1005","post","type-post","status-publish","format-standard","hentry","category-informatique","tag-java","tag-quarkus","tag-test","tag-testcontainers"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":1560,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/quarkus-tip-tester-une-fonction-google-cloud\/","url_meta":{"origin":1005,"position":0},"title":"Quarkus Tip : Tester une fonction Google Cloud","author":"admin","date":"jeudi 29 d\u00e9cembre 2022","format":false,"excerpt":"J'ai r\u00e9cemment contribu\u00e9 une PR \u00e0 Quarkus qui contient un framework de test pour les fonctions Google Cloud. Quarkus supporte la cr\u00e9ation de fonction Google Cloud de trois mani\u00e8res diff\u00e9rentes : En utilisant l'API de Google Cloud. En utilisant une extension HTTP de Quarkus : RESTEasy, Reactive routes, Servlet, Spring\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1440,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/google-cloud-functions-2nd-gen\/","url_meta":{"origin":1005,"position":1},"title":"Google Cloud Functions 2nd gen","author":"admin","date":"mardi 29 mars 2022","format":false,"excerpt":"Google vient de sortir en beta la seconde g\u00e9n\u00e9ration des Google Cloud Functions. Pour ceux qui ne connaissent pas encore les Google Cloud Functions vous pouvez lire mes articles J\u2019ai test\u00e9 Java Google Cloud Functions et Quarkus et les Google Cloud Functions. Cette seconde g\u00e9n\u00e9ration apporte : Un temps de\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/cloud-function-gen1-instance.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/cloud-function-gen1-instance.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/cloud-function-gen1-instance.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":2089,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/deployer-une-application-quarkus-dans-cloud-run\/","url_meta":{"origin":1005,"position":2},"title":"D\u00e9ployer une application Quarkus dans Cloud Run","author":"admin","date":"mardi 30 d\u00e9cembre 2025","format":false,"excerpt":"Quarkus est un framework de d\u00e9veloppement de microservice pens\u00e9 pour le cloud et les conteneurs. Il est pens\u00e9 pour avoir une utilisation m\u00e9moire r\u00e9duite et un temps de d\u00e9marrage le plus court possible. Il se base principalement sur des standards (Jakarta EE, Eclipse MicroProfile, \u2026) et permet l\u2019utilisation de librairies\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1353,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/quarkus-tip-comment-ne-pas-creer-une-extension-quarkus\/","url_meta":{"origin":1005,"position":3},"title":"Quarkus Tip : Comment NE PAS cr\u00e9er une extension Quarkus","author":"admin","date":"mardi 16 novembre 2021","format":false,"excerpt":"Quand on d\u00e9veloppe une application compos\u00e9e de plusieurs composants, il est fr\u00e9quent de vouloir partager du code dans une librairie externe, par exemple via un JAR externe int\u00e9gr\u00e9 comme une d\u00e9pendance de vos composants. Quarkus est un framework d'extension, chaque extension qu'il propose permet d'int\u00e9grer une technologie (client BDD, framework\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1345,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/quarkus-et-les-google-cloud-functions\/","url_meta":{"origin":1005,"position":4},"title":"Quarkus et les  Google Cloud Functions","author":"admin","date":"mardi  2 novembre 2021","format":false,"excerpt":"Quarkus est un framework de d\u00e9veloppement de microservice pens\u00e9 pour le cloud et les conteneurs. Il est pens\u00e9 pour avoir une utilisation m\u00e9moire r\u00e9duite et un temps de d\u00e9marrage le plus court possible. Il se base principalement sur des standards (Jakarta EE, Eclipse MicroProfile, \u2026) et permet l'utilisation de librairies\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":975,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/devfest-nantes-2019-developper-une-api-cloud-ready-avec-quarkus\/","url_meta":{"origin":1005,"position":5},"title":"Devfest Nantes 2019 &#8211; D\u00e9velopper une API Cloud Ready avec Quarkus","author":"admin","date":"jeudi 31 octobre 2019","format":false,"excerpt":"La semaine derni\u00e8re j'\u00e9tais au Devfest Nantes pour parler Quarkus lors d'un talk intitul\u00e9 \"D\u00e9velopper une API Cloud Ready avec Quarkus\". Si ce sujet vous int\u00e9r\u00e8sse, voici le lien vers la vid\u00e9o : https:\/\/www.youtube.com\/watch?v=6VdChn13f3U&list=PLuZ_sYdawLiUjPGPsOvBcgBxC6yP_HSA6&index=4","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1005","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/comments?post=1005"}],"version-history":[{"count":0,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1005\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/media?parent=1005"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/categories?post=1005"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/tags?post=1005"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}