{"id":458098,"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:38:33","modified_gmt":"2025-09-17T08:38:33","slug":"ai-for-php-how-to-tweak-ai-prompts-to-improve-php-tests","status":"publish","type":"phpstorm","link":"https:\/\/blog.jetbrains.com\/es\/phpstorm\/2024\/02\/ai-for-php-how-to-tweak-ai-prompts-to-improve-php-tests\/","title":{"rendered":"IA para PHP: c\u00f3mo optimizar las peticiones a la IA para mejorar las pruebas de PHP"},"content":{"rendered":"<p>En nuestro <a href=\"https:\/\/blog.jetbrains.com\/es-es\/phpstorm\/2024\/02\/ai-for-php-how-to-automate-unit-testing-using-ai-assistant\/\">art\u00edculo anterior<\/a>, vimos c\u00f3mo <a href=\"https:\/\/www.jetbrains.com\/es-es\/ai\/\" target=\"_blank\" rel=\"noopener\">JetBrains AI Assistant<\/a> puede estructurar autom\u00e1ticamente las pruebas de unidad por nosotros. Al generar el aburrido c\u00f3digo reutilizable, nos permite saltar directamente a la parte m\u00e1s interesante de la creaci\u00f3n de pruebas.<\/p>\n<p>Al experimentar con la generaci\u00f3n de pruebas con la IA, a menudo me he sorprendido de lo preciso que es AI Assistant a la hora de generar c\u00f3digo que se ajuste a mi proyecto. Sin embargo, hay casos en los que me gustar\u00eda que el resultado fuera ligeramente diferente. Si pudi\u00e9ramos darle algunas pistas sobre c\u00f3mo deber\u00eda ser el resultado&#8230;<\/p>\n<p>Pues resulta que precisamente podemos hacerlo.<\/p>\n<h2 class=\"wp-block-heading\">Peticiones m\u00e1s espec\u00edficas<\/h2>\n<p>Volvamos al ejemplo de nuestro <a href=\"https:\/\/blog.jetbrains.com\/es-es\/phpstorm\/2024\/02\/ai-for-php-how-to-automate-unit-testing-using-ai-assistant\/\">art\u00edculo anterior<\/a>: estamos trabajando en las pruebas para la clase <code>CreateArgumentComment<\/code>. Esta clase escribe un registro en la base de datos, determina a qu\u00e9 usuarios notificar y, a continuaci\u00f3n, env\u00eda esas notificaciones a los usuarios (utilizando otra clase: <code>SendUserMessage<\/code>). Este es el aspecto de ese 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>Se habr\u00e1 dado cuenta de que AI Assistant no ha escrito ninguna prueba para la parte de notificaci\u00f3n en este fragmento. De hecho, ha escrito pruebas para esta parte en <em>algunas<\/em> iteraciones, pero no siempre.<\/p>\n<p>Una generaci\u00f3n interesante ha incluido el siguiente comentario al final de la clase de prueba:<\/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>Naturalmente, podr\u00edamos pedir a AI Assistant que genere estas pruebas de todos modos, pero en realidad estoy de acuerdo con \u00e9l en esto; <code>notifyUsers<\/code> <em>deber\u00eda<\/em> ser una clase por s\u00ed misma, probada de forma aislada. Aunque en un principio hab\u00eda planeado profundizar en las pruebas de notificaci\u00f3n, AI Assistant ha resaltado un mejor enfoque respecto a ellas y me ha ayudado a replantear mi proyecto. \u00a1Gracias, AI Assistant! Puesto que hemos decidido probar <code>notifyUsers<\/code> por separado, lo dejaremos a un lado y consideraremos otro caso pr\u00e1ctico. Imaginemos que queremos utilizar Mockery en lugar de las factories de Laravel. Empezaremos generando nuestras pruebas del mismo modo que en el <a href=\"https:\/\/blog.jetbrains.com\/es-es\/phpstorm\/2024\/02\/ai-for-php-how-to-automate-unit-testing-using-ai-assistant\/\">art\u00edculo anterior<\/a>, pero esta vez dedicaremos un poco m\u00e1s de tiempo a pulir el resultado de AI Assistant.<\/p>\n<p>Tras generar una versi\u00f3n borrador de nuestra clase de prueba, ver\u00e1 el bot\u00f3n <em>Specify<\/em>en la barra de herramientas 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\u00f3n le permite enviar informaci\u00f3n adicional a AI Assistant, para que su petici\u00f3n sea incluso m\u00e1s espec\u00edfica. Podr\u00eda, por ejemplo, indicarle que utilice Mockery de esta forma:<\/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>Tras escribir esta petici\u00f3n personalizada y pulsar <em>Intro<\/em>, ver\u00e1 que AI Assistant actualiza el c\u00f3digo en consecuencia.<\/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>Puede optimizar sus peticiones tanto como desee, hasta que encuentre una soluci\u00f3n que se adapte a sus necesidades.<\/p>\n<div class=\"buttons\">\n<div class=\"buttons__row\"><a class=\"btn\" href=\"https:\/\/www.jetbrains.com\/es-es\/ai\/\" target=\"\" rel=\"noopener\">Probar las funcionalidades de AI Assistant<\/a><\/div>\n<\/div>\n<h2 class=\"wp-block-heading\">Conclusi\u00f3n<\/h2>\n<p>A medida que experimente con la especificaci\u00f3n de sus peticiones, tenga en cuenta el objetivo que comentamos al principio de esta serie de art\u00edculos del blog: no pretendemos que AI Assistant genere las pruebas perfectas para nosotros. Queremos que se encargue de la aburrida configuraci\u00f3n repetitiva para que podamos centrarnos principalmente en hacer los retoques finales, que son las partes m\u00e1s divertidas.<\/p>\n<p>Teniendo esto en cuenta, creo que es importante <em>no especificar en exceso<\/em> las peticiones. Probablemente ser\u00e1 m\u00e1s productivo generar un c\u00f3digo que est\u00e9 a su gusto en un 90 %, en lugar de dedicar m\u00e1s tiempo a intentar encontrar la petici\u00f3n perfecta.<\/p>\n<p>Una \u00faltima consecuencia que tal vez haya notado es que AI Assistant aprende de sus peticiones con el tiempo. Por ejemplo, ahora que hemos especificado que queremos que utilice Mockery en lugar de las factories de Laravel, la herramienta lo tendr\u00e1 en cuenta la pr\u00f3xima vez que genere pruebas.<\/p>\n<p>Si desea saber m\u00e1s sobre c\u00f3mo funciona AI Assistant entre bastidores y c\u00f3mo trata sus datos, consulte las <a href=\"https:\/\/www.jetbrains.com\/legal\/docs\/terms\/jetbrains-ai-service\/\" target=\"_blank\" rel=\"noopener\">Condiciones de servicio de JetBrains AI<\/a> (secci\u00f3n 5).<\/p>\n<p>\u2014<\/p>\n<p>Hasta ahora, en esta serie, hemos utilizado AI Assistant para que genere pruebas por nosotros, y hemos aprendido a optimizar nuestras peticiones para obtener el resultado que necesitamos.<\/p>\n<p>\u00bfCu\u00e1l es el siguiente paso? PhpStorm tiene algunas funcionalidades muy interesantes para combinar AI Assistant con acciones personalizadas. <strong>Suscr\u00edbase<\/strong> a nuestro blog para estar al d\u00eda de nuestras pr\u00f3ximas publicaciones, en las que seguiremos explorando las ventajas de utilizar la IA para sus rutinas PHP.<\/p>\n<h2 class=\"wp-block-heading\">Enlaces \u00fatiles<\/h2>\n<p><strong>Recursos:<\/strong><\/p>\n<ul>\n<li><a href=\"https:\/\/blog.jetbrains.com\/es-es\/phpstorm\/2024\/02\/ai-for-php-how-to-automate-unit-testing-using-ai-assistant\/\">IA para PHP: c\u00f3mo automatizar las pruebas de unidad con 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 en PhpStorm<\/a> (documentaci\u00f3n)<\/li>\n<li><a href=\"https:\/\/www.jetbrains.com\/es-es\/ai\/#plans-and-pricing\" target=\"_blank\" rel=\"noopener\">Precios de 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\">Presentaci\u00f3n de JetBrains AI Assistant<\/a><\/li>\n<li><a href=\"https:\/\/youtu.be\/k8EzKJDlbFo?feature=shared\" target=\"_blank\" rel=\"noopener\">Utilizaci\u00f3n de PHP y de la IA para crear un convertidor de Markdown a v\u00eddeo<\/a><\/li>\n<\/ul>\n<p><em>Art\u00edculo original en ingl\u00e9s de:<\/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":445713,"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\/es\/wp-json\/wp\/v2\/phpstorm\/458098"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/phpstorm"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/types\/phpstorm"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/users\/1086"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/comments?post=458098"}],"version-history":[{"count":6,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/phpstorm\/458098\/revisions"}],"predecessor-version":[{"id":618036,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/phpstorm\/458098\/revisions\/618036"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/media\/445713"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/media?parent=458098"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/categories?post=458098"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/tags?post=458098"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/cross-post-tag?post=458098"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}