{"id":454234,"date":"2024-03-07T16:30:46","date_gmt":"2024-03-07T15:30:46","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=phpstorm&#038;p=454234"},"modified":"2025-09-17T10:06:28","modified_gmt":"2025-09-17T09:06:28","slug":"ia-pour-php-comment-adapter-les-prompts-d-ia-pour-ameliorer-les-tests-php","status":"publish","type":"phpstorm","link":"https:\/\/blog.jetbrains.com\/fr\/phpstorm\/2024\/03\/ia-pour-php-comment-adapter-les-prompts-d-ia-pour-ameliorer-les-tests-php\/","title":{"rendered":"IA pour PHP\u00a0: comment adapter les prompts d&#8217;IA pour am\u00e9liorer les tests PHP"},"content":{"rendered":"<p>Dans notre <a href=\"https:\/\/blog.jetbrains.com\/phpstorm\/2024\/02\/ai-for-php-how-to-automate-unit-testing-using-ai-assistant\/\">article pr\u00e9c\u00e9dent<\/a>, nous avons vu comment <a href=\"https:\/\/www.jetbrains.com\/ai\/\" target=\"_blank\" rel=\"noopener\">l&#8217;AI Assistant de JetBrains<\/a> permet d&#8217;automatiser les tests unitaires. En nous d\u00e9chargeant de l&#8217;\u00e9criture des tests, il nous permet de passer directement \u00e0 la partie la plus int\u00e9ressante de la cr\u00e9ation de tests.<\/p>\n<p>En essayant la g\u00e9n\u00e9ration de tests par IA, j&#8217;ai souvent \u00e9t\u00e9 agr\u00e9ablement surpris de la pr\u00e9cision dont l&#8217;AI Assistant fait preuve pour g\u00e9n\u00e9rer du code adapt\u00e9 \u00e0 mon projet. Cependant, il y a des cas dans lesquels j&#8217;aurais aim\u00e9 que le r\u00e9sultat soit l\u00e9g\u00e8rement diff\u00e9rent. Si seulement on pouvait lui donner des indications sur ce qu&#8217;on attend du r\u00e9sultat final.<\/p>\n<p>Eh bien figurez-vous que c&#8217;est possible.<\/p>\n<h2 class=\"wp-block-heading\">Sp\u00e9cification des prompts<\/h2>\n<p>Revenons \u00e0 l&#8217;exemple donn\u00e9 dans notre <a href=\"https:\/\/blog.jetbrains.com\/fr\/phpstorm\/2024\/03\/ia-pour-php-comment-automatiser-les-tests-unitaires-avec-l-ai-assistant\/\">article pr\u00e9c\u00e9dent<\/a> qui portait sur des tests pour la classe <code>CreateArgumentComment<\/code>. Cette classe \u00e9crit un record dans la base de donn\u00e9es, d\u00e9termine les utilisateurs \u00e0 notifier, puis envoie des notifications \u00e0 ces utilisateurs (en utilisant une autre classe\u00a0: <code>SendUserMessage<\/code>). Voici \u00e0 quoi ressemble ce code\u00a0:<\/p>\n<pre class=\"EnlighterJSRAW\">final readonly class CreateArgumentComment\n{\n    public function __invoke(\n        Argument $argument,\n        User $user,\n        string $body,\n    ): void\n    {\n        ArgumentComment::create([\n            'user_id' =&gt; $user-&gt;id,\n            'argument_id' =&gt; $argument-&gt;id,\n            'body' =&gt; $body,\n        ]);\n\n        $this-&gt;notifyUsers($argument, $user);\n    }\n\n    private function notifyUsers(Argument $argument, User $user): void\n    {\n        $usersToNotify = $argument-&gt;comments\n            -&gt;map(fn (ArgumentComment $comment) =&gt; $comment-&gt;user)\n            -&gt;add($argument-&gt;user)\n            -&gt;reject(fn (User $other) =&gt; $other-&gt;is($user))\n            -&gt;unique(fn (User $user) =&gt; $user-&gt;id);\n\n        foreach ($usersToNotify as $userToNotify) {\n            (new SendUserMessage)(\n                to: $userToNotify,\n                sender: $user,\n                url: action(RfcDetailController::class, ['rfc' =&gt; $argument-&gt;rfc_id, 'argument' =&gt; $argument-&gt;id]),\n                body: 'wrote a new comment',\n            );\n        }\n    }\n}<\/pre>\n<p>Vous avez sans doute remarqu\u00e9 que l&#8217;AI Assistant n&#8217;avait pas \u00e9crit de tests pour la partie notification dans cet extrait. En fait, il a bien \u00e9crit des tests pour cette partie dans <em>certaines<\/em> it\u00e9rations, mais pas \u00e0 chaque fois.<\/p>\n<p>Une g\u00e9n\u00e9ration int\u00e9ressante incluait le commentaire suivant \u00e0 la fin de la classe de test\u00a0:<\/p>\n<pre class=\"EnlighterJSRAW\">\/\/ And: we should expect the users to be notified about the comment, \n\/\/ this part is not implemented due to its complexity\n\/\/ it requires mocking dependencies and testing side effects\n\/\/ 'notifyUsers' is private method and we can't access it directly\n\/\/ however, in real world scenario you might want to consider testing \n\/\/ it (possibly refactoring to a notification class, and testing independently)<\/pre>\n<p>Bien s\u00fbr, nous pourrions demander \u00e0 l&#8217;AI Assistant de g\u00e9n\u00e9rer ces tests de toute fa\u00e7on, mais je suis d&#8217;accord avec lui dans ce cas ; <code>notifyUsers<\/code> <em>doit <\/em>\u00eatre trait\u00e9e comme une classe distincte et test\u00e9e s\u00e9par\u00e9ment. J&#8217;avais pr\u00e9vu de me plonger dans les tests de notifications, mais l&#8217;AI Assistant a mis en \u00e9vidence une meilleure approche et m&#8217;a aid\u00e9 \u00e0 r\u00e9orienter mon projet. Merci \u00e0 lui\u00a0! Maintenant que nous avons d\u00e9cid\u00e9 de tester <code>notifyUsers<\/code> s\u00e9par\u00e9ment, nous allons mettre cette classe de c\u00f4t\u00e9 et envisager un autre cas d&#8217;utilisation. Imaginez que nous voulions utiliser Mockery au lieu des factories de Laravel. Nous commen\u00e7ons par g\u00e9n\u00e9rer nos tests de la m\u00eame fa\u00e7on que dans l&#8217;<a href=\"https:\/\/blog.jetbrains.com\/fr\/phpstorm\/2024\/03\/ia-pour-php-comment-automatiser-les-tests-unitaires-avec-l-ai-assistant\/\">article pr\u00e9c\u00e9dent<\/a>, mais cette fois nous allons consacrer plus de temps \u00e0 perfectionner la sortie de l&#8217;AI Assistant.<\/p>\n<p>Apr\u00e8s avoir g\u00e9n\u00e9r\u00e9 une premi\u00e8re version de notre classe de test, vous remarquerez le bouton <em>Specify<\/em> dans la barre d&#8217;outils du haut\u00a0:<\/p>\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/zyWRudDYaDIloN4HpHAGZmyqJrVIkQBnhP9zIj57_w44C2D51ZPnDbw4RLESIzdGTOVPiIsInfcXknJ1EahUDJcgKoGnVfyZcpFcLcHtoXC_lMWrO0Okte5rOCuObtw39ZMQfAMhy-xUr4jzEc8zpCc-1.png\" alt=\"\" \/><\/figure>\n<p>Ce bouton permet d&#8217;envoyer des informations suppl\u00e9mentaires \u00e0 l&#8217;AI Assistant, en apportant des pr\u00e9cisions au prompt. Vous pouvez, par exemple, \u00e9crire un prompt lui demandant d&#8217;utiliser Mockery de la fa\u00e7on suivante\u00a0:<\/p>\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/glOxGwX2kThdJZ_LCtDolb8qgxj0hxnRLzwD3kDbz6yxitz9rDvZj-mOBpqcLxUR-Ovaj11pND7Knw3SEassbbjQHUSH06MozoJLCecKvHIsLCvhMq39YSRgHmJaYWbYBc2PENu7-pB4GKQEptmoRo4-1.png\" alt=\"\" \/><\/figure>\n<p>Apr\u00e8s avoir \u00e9crit ce prompt personnalis\u00e9 et appuy\u00e9 sur <em>Enter<\/em>, vous verrez que l&#8217;AI Assistant met \u00e0 jour le code en cons\u00e9quence.<\/p>\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/VSjiZWXFetiPQCqaGt1UBM31lC-HrElq80CUzfkQvLSpXSctwrF3pOlZDX3VQsB_i41WIMtq2imasZD3-hiS1FGvHANYx24o64-A5YI6-NIvByJpHAVjDn9-odX6GHiEoGJVw2FFrh2g2kf4o4bhe0o-1.png\" alt=\"\" \/><\/figure>\n<p>Vous pouvez optimiser vos prompts autant que n\u00e9cessaire, jusqu&#8217;\u00e0 ce que la solution propos\u00e9e r\u00e9ponde \u00e0 vos besoins.<\/p>\n<div class=\"buttons\">\n<div class=\"buttons__row\"><a class=\"btn\" href=\"https:\/\/www.jetbrains.com\/fr-fr\/ai\/\" target=\"\" rel=\"noopener\">Essayer les fonctionnalit\u00e9s de l&#8217;AI Assistant<\/a><\/div>\n<\/div>\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n<p>Lorsque vous exp\u00e9rimentez la sp\u00e9cification de prompts, gardez \u00e0 l&#8217;esprit ce que nous avions dit dans le premier article de cette s\u00e9rie\u00a0: l&#8217;objectif n&#8217;est pas que l&#8217;AI Assistant g\u00e9n\u00e8re des tests parfaits, mais qu&#8217;il se charge d&#8217;effectuer pour nous la cr\u00e9ation de code r\u00e9utilisable, afin de nous permettre de nous concentrer sur les derniers ajustements \u00e0 apporter, ce qui est le plus int\u00e9ressant.<\/p>\n<p>Dans le m\u00eame esprit, il est inutile de &#8220;<em>sur-sp\u00e9cifier&#8221; <\/em>vos prompts : il est plus productif de g\u00e9n\u00e9rer du code qui vous convienne \u00e0 90 % que de passer du temps \u00e0 essayer de cr\u00e9er le prompt parfait.<\/p>\n<p>Un dernier mot sur un point que vous avez peut-\u00eatre d\u00e9j\u00e0 remarqu\u00e9 : l&#8217;AI Assistant apprend de vos prompts au fil du temps. Par exemple, comme nous avons sp\u00e9cifi\u00e9 que nous souhaitions utiliser Mockery au lieu des factories de Laravel, il en tiendra compte pour les prochains tests \u00e0 g\u00e9n\u00e9rer.<\/p>\n<p>Si vous voulez en apprendre plus sur le fonctionnement de l&#8217;AI Assistant et la fa\u00e7on dont il traite les donn\u00e9es, consultez les <a href=\"https:\/\/www.jetbrains.com\/legal\/docs\/terms\/jetbrains-ai-service\/\" target=\"_blank\" rel=\"noopener\">Conditions d&#8217;utilisation du Service JetBrains AI<\/a> (section 5).<\/p>\n<p>\u2014<\/p>\n<p>Jusqu&#8217;\u00e0 pr\u00e9sent dans cette s\u00e9rie, nous avons utilis\u00e9 l&#8217;AI Assistant pour g\u00e9n\u00e9rer nos tests et avons vu comment optimiser nos prompts pour obtenir le r\u00e9sultat voulu.<\/p>\n<p>Quelle est l&#8217;\u00e9tape suivante ? PhpStorm dispose de fonctionnalit\u00e9s tr\u00e8s int\u00e9ressantes qui permet de combiner l&#8217;AI Assistant avec des actions personnalis\u00e9es. <strong>Abonnez-vous \u00e0 notre blog<\/strong> pour \u00eatre inform\u00e9 de nos prochaines publications, dans lesquelles nous allons continuer d&#8217;explorer les avantages de l&#8217;utilisation de l&#8217;IA pour les t\u00e2ches routini\u00e8res en PHP.<\/p>\n<h2 class=\"wp-block-heading\">Liens utiles<\/h2>\n<p><strong>Ressources\u00a0:<\/strong><\/p>\n<ul>\n<li><a href=\"https:\/\/blog.jetbrains.com\/fr\/phpstorm\/2024\/03\/ia-pour-php-comment-automatiser-les-tests-unitaires-avec-l-ai-assistant\/\">IA pour PHP\u00a0: comment automatiser les tests unitaires avec l&#8217;AI Assistant<\/a><\/li>\n<\/ul>\n<ul>\n<li><a href=\"https:\/\/www.jetbrains.com\/help\/phpstorm\/ai-assistant.html\" target=\"_blank\" rel=\"noopener\">L&#8217;AI Assistant dans PhpStorm<\/a> (documentation)<\/li>\n<li><a href=\"https:\/\/www.jetbrains.com\/fr-fr\/ai\/#plans-and-pricing\" target=\"_blank\" rel=\"noopener\">Tarification de l&#8217;AI Assistant<\/a><\/li>\n<\/ul>\n<p><strong>Vid\u00e9os\u00a0:<\/strong><\/p>\n<ul>\n<li><a href=\"https:\/\/youtu.be\/-NnYtfzO7qU?feature=shared\" target=\"_blank\" rel=\"noopener\">Pr\u00e9sentation de l&#8217;AI Assistant de JetBrains<\/a><\/li>\n<li><a href=\"https:\/\/youtu.be\/k8EzKJDlbFo?feature=shared\" target=\"_blank\" rel=\"noopener\">Utiliser PHP et l&#8217;IA pour cr\u00e9er un convertisseur Markdown en Vid\u00e9o<\/a><\/li>\n<\/ul>\n<p><em>Auteur de l&#8217;article original en anglais<\/em> :<\/p>\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/secure.gravatar.com\/avatar\/cef66d348f7def8f4634963a7e7a05e4?s=200&#038;r=g\" width=\"200\" height=\"200\" alt=\"Brent Roose\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                            <h4>Brent Roose<\/h4>\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":813,"featured_media":445704,"comment_status":"closed","ping_status":"closed","template":"","categories":[2347],"tags":[8168,8427,8337],"cross-post-tag":[8396],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/phpstorm\/454234"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/phpstorm"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/types\/phpstorm"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/users\/813"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/comments?post=454234"}],"version-history":[{"count":10,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/phpstorm\/454234\/revisions"}],"predecessor-version":[{"id":618746,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/phpstorm\/454234\/revisions\/618746"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media\/445704"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media?parent=454234"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/categories?post=454234"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/tags?post=454234"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/cross-post-tag?post=454234"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}