{"id":1560,"date":"2022-12-29T10:14:03","date_gmt":"2022-12-29T09:14:03","guid":{"rendered":"https:\/\/www.loicmathieu.fr\/wordpress\/?p=1560"},"modified":"2022-12-29T10:14:03","modified_gmt":"2022-12-29T09:14:03","slug":"quarkus-tip-tester-une-fonction-google-cloud","status":"publish","type":"post","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/quarkus-tip-tester-une-fonction-google-cloud\/","title":{"rendered":"Quarkus Tip : Tester une fonction Google Cloud"},"content":{"rendered":"<p>J&rsquo;ai r\u00e9cemment contribu\u00e9 une <a href=\"https:\/\/github.com\/quarkusio\/quarkus\/pull\/27986\" rel=\"noopener\" target=\"_blank\">PR<\/a> \u00e0 Quarkus qui contient un framework de test pour les fonctions Google Cloud.<\/p>\n<p>Quarkus supporte la cr\u00e9ation de fonction Google Cloud de trois mani\u00e8res diff\u00e9rentes :<\/p>\n<ul><li>En utilisant l&rsquo;API de Google Cloud.<\/li>\n\n<li>En utilisant une extension HTTP de Quarkus : RESTEasy, Reactive routes, Servlet, Spring Web.<\/li>\n\n<li>En utilisant Funqy, l&rsquo;API de d\u00e9veloppement de fonction de Quarkus agnostique du fournisseur cloud.<\/li>\n<\/ul>\n<p>Mais jusqu&rsquo;\u00e0 aujourd&rsquo;hui, pour tester ces fonctions, il fallait les packager puis les lancer localement via l&rsquo;invoker de fonction fournit par le SDK de Google. L&rsquo;invoker de fonction est un JAR \u00e0 t\u00e9l\u00e9charger qui peut ensuite \u00eatre utilis\u00e9 pour lancer une fonction. Pas tr\u00e8s pratique \u00e0 utiliser, et surtout, ne permet pas une utilisation pour des tests unitaires automatis\u00e9s.<\/p>\n<p>Les fonctions utilisant une extension HTTP de Quarkus pouvaient impl\u00e9menter un test unitaire de mani\u00e8re traditionnel, mais celui-ci n&rsquo;utilisait pas un environnement de fonction. Il ne reproduisait donc pas une ex\u00e9cution de fonction proche de la r\u00e9alit\u00e9.<\/p>\n<p>Avec Quarkus 2.15, un framework de test des fonctions Google Cloud existe qui permet de tester une fonction via des appels HTTP. Ce framework va utiliser l&rsquo;invoker des fonctions et le d\u00e9marrer automatiquement au lancement du test. Vous pourrez alors utiliser <a href=\"https:\/\/rest-assured.io\/\" rel=\"noopener\" target=\"_blank\">REST-assured<\/a> pour r\u00e9aliser le test de votre fonction comme vous l&rsquo;auriez fait pour une application Quarkus standard.<\/p>\n<p>Pour utiliser ce framework de test, il faut ajouter la d\u00e9pendance Maven suivante :<\/p>\n<pre>\n\n    io.quarkus\n    quarkus-test-google-cloud-functions\n    test\n\n<\/pre>\n<h2>Tester une fonction utilisant l&rsquo;API de Google Cloud Function<\/h2>\n<p>La fonction suivante utilise l&rsquo;API de Google Cloud Function pour impl\u00e9menter une fonction HTTP qui r\u00e9pond <em>\u00ab\u00a0Hello World\u00a0\u00bb<\/em>.<\/p>\n<pre>\n@ApplicationScoped \/\/ Needed for Quarkus to locate the function\npublic class HttpFunctionTest implements HttpFunction { \n    @Inject GreetingService greetingService; \n\n    @Override\n    public void service(HttpRequest httpRequest, HttpResponse httpResponse) throws Exception { \n        Writer writer = httpResponse.getWriter();\n        writer.write(greetingService.hello());\n    }\n}\n<\/pre>\n<p>Le test correspondant sera un test Quarkus standard, annot\u00e9 via <a>@QuarkusTest<\/code>code&gt;@QuarkusTest&lt;\/code<\/a>, mais qui utilisera l&rsquo;annotation <a>@WithFunction<\/code>code&gt;@WithFunction&lt;\/code<\/a> qui permet de lancer la fonction en utilisant l&rsquo;invoker des fonctions Google Cloud. L&rsquo;annotation <a>@WithFunction<\/code>code&gt;@WithFunction&lt;\/code<\/a> prend comme attribut le type de fonction \u00e0 lancer, ici <code>FunctionType.HTTP<\/code> car c&rsquo;est une fonction HTTP.<\/p>\n<pre>\n@QuarkusTest \n@WithFunction(FunctionType.HTTP) \nclass HttpFunctionTestCase {\n    @Test\n    public void test() {\n        when()\n                .get()\n                .then()\n                .statusCode(200)\n                .body(is(\"Hello World!\")); \n    }\n}\n<\/pre>\n<p>Le test utilise REST-assured pour envoyer une requ\u00eate HTTP avec la m\u00e9thode GET, et asserter que la r\u00e9ponse a un code statut 200 et contient la cha\u00eene de caract\u00e8re <em>\u00ab\u00a0Hello World\u00a0\u00bb<\/em>.<\/p>\n<p>On peut \u00e9crire le m\u00eame type de test pour une fonction de type background.<\/p>\n<p>Prenons comme exemple une fonction background se d\u00e9clenchant depuis un \u00e9v\u00e9nement Cloud Storage :<\/p>\n<pre>\n@ApplicationScoped  \/\/ Needed for Quarkus to locate the function\npublic class BackgroundFunctionStorageTest implements BackgroundFunction { \n    @Override\n    public void accept(StorageEvent event, Context context) throws Exception { \n        System.out.println(\"Receive event: \" + event);\n    }\n\n    \/\/ The Cloud Storage event will be deserialized with this class\n    public static class StorageEvent { \n        public String name;\n    }\n}\n<\/pre>\n<p>Elle peut \u00eatre test\u00e9e via le code suivant :<\/p>\n<pre>\n@QuarkusTest\n@WithFunction(FunctionType.BACKGROUND) \nclass BackgroundFunctionStorageTestCase {\n    @Test\n    public void test() {\n        given()\n                .body(\"{\\\"data\\\":{\\\"name\\\":\\\"hello.txt\\\"}}\") \n                .when()\n                .post()\n                .then()\n                .statusCode(200);\n    }\n}\n<\/pre>\n<p>Ici, le test est de type <code>FunctionType.BACKGROUND<\/code>, et on envoie l\u2019\u00e9v\u00e9nement \u00e0 la fonction via une requ\u00eate POST dont le corps est un JSON dont l&rsquo;attribut <code>data<\/code> contient l\u2019\u00e9v\u00e9nement d\u00e9clenchant la fonction.<\/p>\n<p>Les fonctions de type Cloud Events sont aussi support\u00e9es.<\/p>\n<p>Plus d&rsquo;information dans le guide <a href=\"https:\/\/quarkus.io\/version\/main\/guides\/gcp-functions\" rel=\"noopener\" target=\"_blank\">Quarkus Google Cloud Functions<\/a>.<\/p>\n<h2>Tester une fonction utilisant Quarkus Funqy<\/h2>\n<p>Il est possible d&rsquo;\u00e9crire une fonction Google Cloud r\u00e9agissant \u00e0 un \u00e9v\u00e9nement Cloud Storage via le framework Funqy.\nFunqy offre une API agnostique du fournisseur cloud.\nPour utiliser Funqy, il faut \u00e9crire une m\u00e9thode Java annot\u00e9e via <a>@Funq<\/code>code&gt;@Funq&lt;\/code<\/a>, qui prend en param\u00e8tre l\u2019\u00e9v\u00e9nement d\u00e9clencheur de la fonction.<\/p>\n<pre>\npublic class GreetingFunctions {\n    @Funq \n    public void helloGCSWorld(StorageEvent storageEvent) {\n        String message = service.hello(\"world\");\n        System.out.println(storageEvent.name + \" - \" + message);\n    }\n}\n<\/pre>\n<p>Pour tester cette fonction, on va utiliser le m\u00eame code que pour une fonction utilisant l&rsquo;API de Google Cloud, mais on va configurer le framework de test pour une fonction de type <code>FunctionType.FUNQY_BACKGROUND<\/code>.<\/p>\n<pre>\n@QuarkusTest \n@WithFunction(FunctionType.FUNQY_BACKGROUND) \nclass GreetingFunctionsStorageTest {\n    @Test\n    public void test() {\n        given()\n                .body(\"{\\\"data\\\":{\\\"name\\\":\\\"hello.txt\\\"}}\") \n                .when()\n                .post()\n                .then()\n                .statusCode(200);\n    }\n}\n<\/pre>\n<p>L\u00e0 encore, les fonctions de type Cloud Events sont aussi support\u00e9es.<\/p>\n<p>Plus d&rsquo;information dans le guide <a href=\"https:\/\/quarkus.io\/version\/main\/guides\/funqy-gcp-functions\" rel=\"noopener\" target=\"_blank\">Quarkus Funqy Google Cloud Functions<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>J&rsquo;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&rsquo;API de Google Cloud. En utilisant une extension HTTP de Quarkus : RESTEasy, Reactive routes, Servlet, Spring Web. En utilisant Funqy, l&rsquo;API de d\u00e9veloppement de fonction de Quarkus agnostique du fournisseur cloud. Mais jusqu&rsquo;\u00e0 aujourd&rsquo;hui, pour tester ces fonctions, il fallait les packager puis les lancer localement&#8230;<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/quarkus-tip-tester-une-fonction-google-cloud\/\">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":[210,205,11,167],"class_list":["post-1560","post","type-post","status-publish","format-standard","hentry","category-informatique","tag-cloud-events","tag-google-cloud-functions","tag-java","tag-quarkus"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":1345,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/quarkus-et-les-google-cloud-functions\/","url_meta":{"origin":1560,"position":0},"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":1440,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/google-cloud-functions-2nd-gen\/","url_meta":{"origin":1560,"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-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":1560,"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":1068,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/j-ai-teste-java-google-cloud-functions-aplha\/","url_meta":{"origin":1560,"position":3},"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":1960,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/creer-un-chatbot-avec-google-gemini-vertex-ai-et-quarkus\/","url_meta":{"origin":1560,"position":4},"title":"Cr\u00e9er un chatbot avec Google Gemini Vertex AI et Quarkus","author":"admin","date":"vendredi 27 juin 2025","format":false,"excerpt":"J'ai r\u00e9cemment cr\u00e9\u00e9 une extension Quarkus qui permet d'acc\u00e9der \u00e0 Google Vertex AI. Dans cet article, je vais utiliser cette extension pour cr\u00e9er un chatbot. La premi\u00e8re \u00e9tape consiste \u00e0 cr\u00e9er un projet Quarkus contenant les extensions REST et Google Cloud Vertex AI. Voici les extensions \u00e0 ajouter \u00e0 votre\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\/Capture-decran-du-2025-06-27-14-22-26-1024x376.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/Capture-decran-du-2025-06-27-14-22-26-1024x376.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/Capture-decran-du-2025-06-27-14-22-26-1024x376.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":1532,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/tester-une-java-google-cloud-function\/","url_meta":{"origin":1560,"position":5},"title":"Tester une Java Google Cloud Function","author":"admin","date":"mardi  4 octobre 2022","format":false,"excerpt":"Jusqu'il y a peu de temps, tester une Google Cloud Function \u00e9crite en Java pouvait se faire via l'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\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":[]}],"_links":{"self":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1560","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=1560"}],"version-history":[{"count":8,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1560\/revisions"}],"predecessor-version":[{"id":1599,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1560\/revisions\/1599"}],"wp:attachment":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/media?parent=1560"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/categories?post=1560"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/tags?post=1560"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}