{"id":1532,"date":"2022-10-04T12:54:48","date_gmt":"2022-10-04T10:54:48","guid":{"rendered":"https:\/\/www.loicmathieu.fr\/wordpress\/?p=1532"},"modified":"2022-10-04T12:58:40","modified_gmt":"2022-10-04T10:58:40","slug":"tester-une-java-google-cloud-function","status":"publish","type":"post","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/tester-une-java-google-cloud-function\/","title":{"rendered":"Tester une Java Google Cloud Function"},"content":{"rendered":"<p>Jusqu&rsquo;il y a peu de temps, tester une Google Cloud Function \u00e9crite en Java pouvait se faire via l&rsquo;invoker fournit par le SDK des Google Cloud Functions mais pas via un test unitaire. Mais cela \u00e0 chang\u00e9 r\u00e9cemment !<\/p>\n<p>Prenons comme exemple la fonction HTTP suivante :<\/p>\n<pre>\npublic class HelloHttpFunction implements HttpFunction { \n    @Override\n    public void service(HttpRequest httpRequest, HttpResponse httpResponse) \n            throws Exception { \n        Writer writer = httpResponse.getWriter();\n        writer.write(\"Hello World\");\n    }\n}\n<\/pre>\n<p>Apr\u00e8s packaging de celle-ci dans un \u00fcber JAR, nous pouvons t\u00e9l\u00e9charger l&rsquo;invoker Google Cloud function via la commande Maven suivante :<\/p>\n<pre>\nmvn dependency:copy \\\n  -Dartifact='com.google.cloud.functions.invoker:java-function-invoker:1.1.1' \\\n  -DoutputDirectory=.\n<\/pre>\n<p>Puis l&rsquo;utiliser pour d\u00e9marrer la fonction en local :<\/p>\n<pre>\njava -jar java-function-invoker-1.1.1.jar \\\n  --classpath target\/hello-world.jar \\\n  --target org.example.HelloHttpFunction\n<\/pre>\n<p>Notre fonction est alors testable sur le port 8080.<\/p>\n<p>H\u00e9las, ceci n&rsquo;est pas pratique dans une optique d&rsquo;int\u00e9gration continue o\u00f9 nous voudrions ex\u00e9cuter des tests automatis\u00e9s avec JUnit par exemple.<\/p>\n<p>Heureusement, l&rsquo;invoker de fonction est un projet Open Source de Google et votre serviteur a propos\u00e9 une PR pour permettre l&rsquo;utilisation de celui-ci via des tests automatis\u00e9s en proposant une <a href=\"https:\/\/github.com\/GoogleCloudPlatform\/functions-framework-java\/pull\/128\" title=\"Invoker.stop()\">m\u00e9thode stop<\/a> qui \u00e9tait manquante.<\/p>\n<p>En utilisant sa derni\u00e8re version, nous pouvons ajouter l&rsquo;invoker en d\u00e9pendance Maven de notre projet pour l&rsquo;utiliser dans un test unitaire.<\/p>\n<pre>\n\n    com.google.cloud.functions.invoker\n    java-function-invoker\n    1.1.1\n    test\n\n<\/pre>\n<p>Nous pouvons alors cr\u00e9er des tests JUnit.\nPar exemple pour notre fonction HTTP <code>HelloHttpFunction<\/code> nous aurons le test suivant :<\/p>\n<pre>\nclass HttpFunctionTestCase {\n    @Test\n    public void test() throws Exception {\n        \/\/ start the invoker without joining to avoid blocking the thread\n        Invoker invoker = new Invoker(\n                8081,\n                \"org.example.HelloHttpFunction\",\n                \"http\",\n                Thread.currentThread().getContextClassLoader());\n        invoker.startTestServer();\n\n        \/\/ test the function using REST-assured\n        when()\n                .get(\"http:\/\/localhost:8081\")\n                .then()\n                .statusCode(200)\n                .body(is(\"Hello World!\"));\n\n        \/\/ stop the invoker\n        invoker.stopServer();\n    }\n}\n<\/pre>\n<p><em>Le framework <a href=\"https:\/\/rest-assured.io\/\" title=\"REST-assured website\">REST-assured<\/a> est utilis\u00e9 ici pour faciliter l&rsquo;\u00e9criture de test HTTP.<\/em><\/p>\n<p>Le troisi\u00e8me param\u00e8tre \u00e0 passer lors de l\u2019instanciation de l&rsquo;invoker est le type de fonction \u00e0 tester, tous les types de fonction sont support\u00e9s :<\/p>\n<ul><li><strong>http<\/strong> : pour les fonctions HTTP;<\/li>\n\n<li><strong>event<\/strong> : pour les fonctions backgound;<\/li>\n\n<li><strong>cloudevent<\/strong> : pour les fonctions Cloud Events.<\/li>\n<\/ul>\n<p>Pour tester une fonction background qui r\u00e9agit \u00e0 un \u00e9v\u00e9nement Cloud Storage, on va devoir envoyer un \u00e9v\u00e9nement au format JSON via un POST HTTP sur l&rsquo;URL de l&rsquo;invoker. Nous pouvons utiliser REST-assured pour cela comme nous avons fait pour une fonction HTTP.<\/p>\n<pre>\nclass BackgroundStorageFunctionTestCase {\n    @Test\n    public void test() throws Exception {\n        \/\/ start the invoker without joining to avoid blocking the thread\n        Invoker invoker = new Invoker(\n                8081,\n                \"org.example.BackgroundStorageFunction\",\n                \"event\",\n                Thread.currentThread().getContextClassLoader());\n        invoker.startTestServer();\n\n        \/\/ test the function using REST-assured\n        given()\n                .body(\"{\\\"data\\\":{\\\"name\\\":\\\"hello.txt\\\"}}\")\n                .when()\n                .post(\"http:\/\/localhost:8081\")\n                .then()\n                .statusCode(200);\n\n        \/\/ stop the invoker\n        invoker.stopServer();\n    }\n<\/pre>\n<p>En conclusion, gr\u00e2ce \u00e0 la version 1.1.1 de l&rsquo;invoker de fonction Goole Cloud, nous pouvons tester nos fonctions automatiquement avec JUnit5, et s&rsquo;assurer de leur qualit\u00e9 et leur non-r\u00e9gression fonctionnelle dans un workflow de CI.\n<\/p>","protected":false},"excerpt":{"rendered":"<p>Jusqu&rsquo;il y a peu de temps, tester une Google Cloud Function \u00e9crite en Java pouvait se faire via l&rsquo;invoker fournit par le SDK des Google Cloud Functions mais pas via un test unitaire. Mais cela \u00e0 chang\u00e9 r\u00e9cemment ! Prenons comme exemple la fonction HTTP suivante : public class HelloHttpFunction implements HttpFunction { @Override public void service(HttpRequest httpRequest, HttpResponse httpResponse) throws Exception { Writer writer = httpResponse.getWriter(); writer.write(\u00ab\u00a0Hello World\u00a0\u00bb); } } Apr\u00e8s packaging de celle-ci dans un \u00fcber JAR, nous&#8230;<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/tester-une-java-google-cloud-function\/\">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":[],"class_list":["post-1532","post","type-post","status-publish","format-standard","hentry","category-informatique"],"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":1532,"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":1345,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/quarkus-et-les-google-cloud-functions\/","url_meta":{"origin":1532,"position":1},"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":1068,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/j-ai-teste-java-google-cloud-functions-aplha\/","url_meta":{"origin":1532,"position":2},"title":"J&rsquo;ai test\u00e9 Java Google Cloud Functions Alpha","author":"admin","date":"mercredi  6 mai 2020","format":false,"excerpt":"J'ai test\u00e9 les Java Google Cloud Functions en Alpha. Jusqu'ici, les Cloud Functions de Google n'\u00e9taient impl\u00e9mentables qu'en NodeJs, Go ou Python. Mais Google est en train de pr\u00e9parer l'ouverture d'un runtime Java (8 et 11), que j'ai pu tester en alpha release priv\u00e9e (pour s'inscrire, c'est ici). Apr\u00e8s inscription\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":1532,"position":3},"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-gen2-instances.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/cloud-function-gen2-instances.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/cloud-function-gen2-instances.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":1532,"position":4},"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":377,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/session-chti-jug-sur-les-technologies-google\/","url_meta":{"origin":1532,"position":5},"title":"Ch&rsquo;ti Jug: les technologies Google","author":"admin","date":"mercredi 11 novembre 2009","format":false,"excerpt":"Hello, Lundi j'ai \u00e9t\u00e9 \u00e0 la session du Ch'ti Jug sur les technologies Google qui s'est pass\u00e9 \u00e0 l'ISEN et \u00e9tait sponsoris\u00e9e par SII. C'\u00e9tait la premi\u00e8re fois que j'assistais \u00e0 un \u00e9v\u00e8nement organis\u00e9 par le Ch'ti Jug et comme c'\u00e9tait int\u00e9ressant, j'aimerais partager avec vous l\u00e0 dessus. Ch'ti Jug?\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"Google Wave","src":"https:\/\/i0.wp.com\/loicmathieu.free.fr\/wordpress\/wp-content\/uploads\/google-wave.jpg?resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/loicmathieu.free.fr\/wordpress\/wp-content\/uploads\/google-wave.jpg?resize=350%2C200 1x, https:\/\/i0.wp.com\/loicmathieu.free.fr\/wordpress\/wp-content\/uploads\/google-wave.jpg?resize=525%2C300 1.5x"},"classes":[]}],"_links":{"self":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1532","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=1532"}],"version-history":[{"count":10,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1532\/revisions"}],"predecessor-version":[{"id":1542,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1532\/revisions\/1542"}],"wp:attachment":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/media?parent=1532"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/categories?post=1532"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/tags?post=1532"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}