{"id":458076,"date":"2024-02-19T14:37:55","date_gmt":"2024-02-19T13:37:55","guid":{"rendered":"https:\/\/blog.jetbrains.com\/phpstorm\/2024\/02\/ai-for-php-how-to-tweak-ai-prompts-to-improve-php-tests\/"},"modified":"2025-09-17T09:41:59","modified_gmt":"2025-09-17T08:41:59","slug":"ai-for-php-how-to-tweak-ai-prompts-to-improve-php-tests","status":"publish","type":"phpstorm","link":"https:\/\/blog.jetbrains.com\/pt-br\/phpstorm\/2024\/02\/ai-for-php-how-to-tweak-ai-prompts-to-improve-php-tests\/","title":{"rendered":"IA para PHP: como ajustar prompts de IA para melhorar testes de PHP"},"content":{"rendered":"<p>No <a href=\"https:\/\/blog.jetbrains.com\/pt-br\/phpstorm\/2024\/02\/ai-for-php-how-to-automate-unit-testing-using-ai-assistant\/\">post anterior<\/a> do nosso blog, vimos como o <a href=\"https:\/\/www.jetbrains.com\/pt-br\/ai\/\" target=\"_blank\" rel=\"noopener\">JetBrains AI Assistant<\/a> pode organizar testes de unidade automaticamente para n\u00f3s. Ao criar o c\u00f3digo padr\u00e3o chato, ele nos permite ir direto para a parte mais interessante de gera\u00e7\u00e3o de testes.<\/p>\n<p>Brincando com a gera\u00e7\u00e3o de testes orientada por IA, muitas vezes fico surpreso com a precis\u00e3o do AI Assistant quando se trata de criar c\u00f3digo que se ajusta ao meu projeto. No entanto, h\u00e1 casos em que eu gostaria que a sa\u00edda gerada fosse um pouco diferente. Se ao menos pud\u00e9ssemos dar algumas dicas sobre como deveria ser o resultado.<\/p>\n<p>Bem, acontece que podemos fazer exatamente isso.<\/p>\n<h2 class=\"wp-block-heading\">Especifica\u00e7\u00e3o de prompts<\/h2>\n<p>Vamos voltar ao exemplo do <a href=\"https:\/\/blog.jetbrains.com\/pt-br\/phpstorm\/2024\/02\/ai-for-php-how-to-automate-unit-testing-using-ai-assistant\/\">post anterior<\/a> do nosso blog: estamos trabalhando em testes para a classe <code>CreateArgumentComment<\/code>. Essa classe grava um registro no banco de dados, determina quais usu\u00e1rios devem ser notificados e, em seguida, envia essas notifica\u00e7\u00f5es aos usu\u00e1rios (usando outra classe: <code>SendUserMessage<\/code>). Esta \u00e9 a apar\u00eancia do c\u00f3digo:<\/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>Voc\u00ea deve ter notado que o AI Assistant n\u00e3o escreveu testes para a parte de notifica\u00e7\u00e3o nesse snippet. Na verdade, ele escreveu testes para esta parte em <em>algumas<\/em> itera\u00e7\u00f5es, mas n\u00e3o todas as vezes.<\/p>\n<p>Uma gera\u00e7\u00e3o interessante incluiu o seguinte coment\u00e1rio no final da classe de teste:<\/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>Poder\u00edamos, \u00e9 claro, pedir ao AI Assistant para gerar esses testes de qualquer forma, mas, na verdade, concordo com isto aqui; <code>notifyUsers<\/code> <em>deve <\/em>ser uma classe pr\u00f3pria, testada isoladamente. Embora eu tivesse planejado inicialmente me aprofundar nos testes de notifica\u00e7\u00e3o, o AI Assistant destacou uma abordagem melhor a ser adotada com eles e me ajudou a reformular meu projeto. Obrigado, AI Assistant! Como decidimos testar <code>notifyUsers<\/code> separadamente, deixaremos isso de lado e consideraremos outro caso de uso. Imagine que queiramos usar o Mockery em vez das factories do Laravel. Come\u00e7amos gerando nossos testes da mesma forma que fizemos no <a href=\"https:\/\/blog.jetbrains.com\/pt-br\/phpstorm\/2024\/02\/ai-for-php-how-to-automate-unit-testing-using-ai-assistant\/\">post anterior<\/a> do nosso blog, mas, desta vez, gastaremos um pouco mais de tempo ajustando a sa\u00edda do AI Assistant.<\/p>\n<p>Depois de gerar uma vers\u00e3o rascunho da nossa classe de teste, voc\u00ea notar\u00e1 um bot\u00e3o <em>Specify<\/em> na barra de ferramentas superior:<\/p>\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/zyWRudDYaDIloN4HpHAGZmyqJrVIkQBnhP9zIj57_w44C2D51ZPnDbw4RLESIzdGTOVPiIsInfcXknJ1EahUDJcgKoGnVfyZcpFcLcHtoXC_lMWrO0Okte5rOCuObtw39ZMQfAMhy-xUr4jzEc8zpCc.png\" alt=\"\" \/><\/figure>\n<p>Este bot\u00e3o permite enviar informa\u00e7\u00f5es adicionais ao AI Assistant, especificando ainda mais o prompt. Voc\u00ea poderia, por exemplo, escrever um prompt que diga para usar o Mockery assim:<\/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.png\" alt=\"\" \/><\/figure>\n<p>Depois de escrever este prompt personalizado e pressionar <em>Enter<\/em>, voc\u00ea ver\u00e1 que o AI Assistant atualiza o c\u00f3digo de acordo.<\/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.png\" alt=\"\" \/><\/figure>\n<p>Voc\u00ea pode ajustar seus prompts o quanto quiser at\u00e9 encontrar uma solu\u00e7\u00e3o que atenda \u00e0s suas necessidades.<\/p>\n<div class=\"buttons\">\n<div class=\"buttons__row\"><a class=\"btn\" href=\"https:\/\/www.jetbrains.com\/pt-br\/ai\/\" target=\"\" rel=\"noopener\">Experimente os recursos do AI Assistant<\/a><\/div>\n<\/div>\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n<p>Ao experimentar a especifica\u00e7\u00e3o de prompts, tenha em mente o objetivo que discutimos no in\u00edcio desta s\u00e9rie de posts: n\u00e3o pretendemos que o AI Assistant gere os testes perfeitos para n\u00f3s. Queremos que ele fa\u00e7a a configura\u00e7\u00e3o padr\u00e3o chata, para que possamos nos concentrar principalmente em fazer os ajustes finais: as partes que s\u00e3o mais divertidas.<\/p>\n<p>Com isso em mente, acho importante n\u00e3o <em>especificar demais<\/em> seus prompts. Provavelmente, ser\u00e1 mais produtivo gerar um c\u00f3digo 90% do seu agrado, em vez de gastar mais tempo tentando encontrar o prompt perfeito.<\/p>\n<p>Um \u00faltimo efeito colateral que voc\u00ea pode notar \u00e9 que o AI Assistant realmente aprende com suas instru\u00e7\u00f5es ao longo do tempo. Por exemplo, agora que especificamos que gostar\u00edamos de usar o Mockery em vez das factories do Laravel, a ferramenta levar\u00e1 isso em considera\u00e7\u00e3o na pr\u00f3xima vez que gerar testes.<\/p>\n<p>Se quiser saber mais sobre como o AI Assistant funciona nos bastidores e como ele lida com seus dados, acesse os <a href=\"https:\/\/www.jetbrains.com\/legal\/docs\/terms\/jetbrains-ai-service\/\" target=\"_blank\" rel=\"noopener\">Termos de Servi\u00e7o do JetBrains AI<\/a> (se\u00e7\u00e3o 5) para ler tudo sobre isso.<\/p>\n<p>\u2014<\/p>\n<p>At\u00e9 agora nesta s\u00e9rie, usamos o AI Assistant para gerar testes para n\u00f3s e aprendemos como ajustar nossos prompts para obter o resultado de que precisamos.<\/p>\n<p>Qual \u00e9 o pr\u00f3ximo passo? O PhpStorm tem alguns recursos bastante interessantes para combinar o AI Assistant com a\u00e7\u00f5es personalizadas. <strong>Assine nosso blog<\/strong> para ficar em dia sobre nossos pr\u00f3ximos posts, nos quais continuaremos explorando os benef\u00edcios de usar a IA em rotinas PHP.<\/p>\n<h2 class=\"wp-block-heading\">Links \u00fateis<\/h2>\n<p><strong>Recursos:<\/strong><\/p>\n<ul>\n<li><a href=\"https:\/\/blog.jetbrains.com\/pt-br\/phpstorm\/2024\/02\/ai-for-php-how-to-automate-unit-testing-using-ai-assistant\/\">IA para PHP: como automatizar testes de unidades usando o 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\">AI Assistant no PhpStorm<\/a> (documenta\u00e7\u00e3o)<\/li>\n<li><a href=\"https:\/\/www.jetbrains.com\/pt-br\/ai\/#plans-and-pricing\" target=\"_blank\" rel=\"noopener\">Pre\u00e7os do AI Assistant<\/a><\/li>\n<\/ul>\n<p><strong>V\u00eddeos:<\/strong><\/p>\n<ul>\n<li><a href=\"https:\/\/youtu.be\/-NnYtfzO7qU?feature=shared\" target=\"_blank\" rel=\"noopener\">Introdu\u00e7\u00e3o ao JetBrains AI Assistant<\/a><\/li>\n<li><a href=\"https:\/\/youtu.be\/k8EzKJDlbFo?feature=shared\" target=\"_blank\" rel=\"noopener\">Usando PHP e IA para construir um conversor de Markdown para v\u00eddeo<\/a><\/li>\n<\/ul>\n<p><em>Artigo original em ingl\u00eas por:<\/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\/?s=200&#038;r=g\" width=\"200\" height=\"200\" alt=\"\" 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                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":1086,"featured_media":445711,"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\/pt-br\/wp-json\/wp\/v2\/phpstorm\/458076"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/phpstorm"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/types\/phpstorm"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/users\/1086"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/comments?post=458076"}],"version-history":[{"count":9,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/phpstorm\/458076\/revisions"}],"predecessor-version":[{"id":618102,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/phpstorm\/458076\/revisions\/618102"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media\/445711"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media?parent=458076"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/categories?post=458076"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/tags?post=458076"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/cross-post-tag?post=458076"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}