Phpstorm logo

PhpStorm

The IDE that empowers PHP developers

Tutorials

IA para PHP: cómo optimizar las peticiones a la IA para mejorar las pruebas de PHP

Read this post in other languages:

En nuestro artículo anterior, vimos cómo JetBrains AI Assistant puede estructurar automáticamente las pruebas de unidad por nosotros. Al generar el aburrido código reutilizable, nos permite saltar directamente a la parte más interesante de la creación de pruebas.

Al experimentar con la generación de pruebas con la IA, a menudo me he sorprendido de lo preciso que es AI Assistant a la hora de generar código que se ajuste a mi proyecto. Sin embargo, hay casos en los que me gustaría que el resultado fuera ligeramente diferente. Si pudiéramos darle algunas pistas sobre cómo debería ser el resultado…

Pues resulta que precisamente podemos hacerlo.

Peticiones más específicas

Volvamos al ejemplo de nuestro artículo anterior: estamos trabajando en las pruebas para la clase CreateArgumentComment. Esta clase escribe un registro en la base de datos, determina a qué usuarios notificar y, a continuación, envía esas notificaciones a los usuarios (utilizando otra clase: SendUserMessage). Este es el aspecto de ese código:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
final readonly class CreateArgumentComment
{
public function __invoke(
Argument $argument,
User $user,
string $body,
): void
{
ArgumentComment::create([
'user_id' => $user->id,
'argument_id' => $argument->id,
'body' => $body,
]);
$this->notifyUsers($argument, $user);
}
private function notifyUsers(Argument $argument, User $user): void
{
$usersToNotify = $argument->comments
->map(fn (ArgumentComment $comment) => $comment->user)
->add($argument->user)
->reject(fn (User $other) => $other->is($user))
->unique(fn (User $user) => $user->id);
foreach ($usersToNotify as $userToNotify) {
(new SendUserMessage)(
to: $userToNotify,
sender: $user,
url: action(RfcDetailController::class, ['rfc' => $argument->rfc_id, 'argument' => $argument->id]),
body: 'wrote a new comment',
);
}
}
}
final readonly class CreateArgumentComment { public function __invoke( Argument $argument, User $user, string $body, ): void { ArgumentComment::create([ 'user_id' => $user->id, 'argument_id' => $argument->id, 'body' => $body, ]); $this->notifyUsers($argument, $user); } private function notifyUsers(Argument $argument, User $user): void { $usersToNotify = $argument->comments ->map(fn (ArgumentComment $comment) => $comment->user) ->add($argument->user) ->reject(fn (User $other) => $other->is($user)) ->unique(fn (User $user) => $user->id); foreach ($usersToNotify as $userToNotify) { (new SendUserMessage)( to: $userToNotify, sender: $user, url: action(RfcDetailController::class, ['rfc' => $argument->rfc_id, 'argument' => $argument->id]), body: 'wrote a new comment', ); } } }
final readonly class CreateArgumentComment
{
    public function __invoke(
        Argument $argument,
        User $user,
        string $body,
    ): void
    {
        ArgumentComment::create([
            'user_id' => $user->id,
            'argument_id' => $argument->id,
            'body' => $body,
        ]);

        $this->notifyUsers($argument, $user);
    }

    private function notifyUsers(Argument $argument, User $user): void
    {
        $usersToNotify = $argument->comments
            ->map(fn (ArgumentComment $comment) => $comment->user)
            ->add($argument->user)
            ->reject(fn (User $other) => $other->is($user))
            ->unique(fn (User $user) => $user->id);

        foreach ($usersToNotify as $userToNotify) {
            (new SendUserMessage)(
                to: $userToNotify,
                sender: $user,
                url: action(RfcDetailController::class, ['rfc' => $argument->rfc_id, 'argument' => $argument->id]),
                body: 'wrote a new comment',
            );
        }
    }
}

Se habrá dado cuenta de que AI Assistant no ha escrito ninguna prueba para la parte de notificación en este fragmento. De hecho, ha escrito pruebas para esta parte en algunas iteraciones, pero no siempre.

Una generación interesante ha incluido el siguiente comentario al final de la clase de prueba:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// And: we should expect the users to be notified about the comment,
// this part is not implemented due to its complexity
// it requires mocking dependencies and testing side effects
// 'notifyUsers' is private method and we can't access it directly
// however, in real world scenario you might want to consider testing
// it (possibly refactoring to a notification class, and testing independently)
// And: we should expect the users to be notified about the comment, // this part is not implemented due to its complexity // it requires mocking dependencies and testing side effects // 'notifyUsers' is private method and we can't access it directly // however, in real world scenario you might want to consider testing // it (possibly refactoring to a notification class, and testing independently)
// And: we should expect the users to be notified about the comment, 
// this part is not implemented due to its complexity
// it requires mocking dependencies and testing side effects
// 'notifyUsers' is private method and we can't access it directly
// however, in real world scenario you might want to consider testing 
// it (possibly refactoring to a notification class, and testing independently)

Naturalmente, podríamos pedir a AI Assistant que genere estas pruebas de todos modos, pero en realidad estoy de acuerdo con él en esto; notifyUsers debería ser una clase por sí misma, probada de forma aislada. Aunque en un principio había planeado profundizar en las pruebas de notificación, AI Assistant ha resaltado un mejor enfoque respecto a ellas y me ha ayudado a replantear mi proyecto. ¡Gracias, AI Assistant! Puesto que hemos decidido probar notifyUsers por separado, lo dejaremos a un lado y consideraremos otro caso práctico. Imaginemos que queremos utilizar Mockery en lugar de las factories de Laravel. Empezaremos generando nuestras pruebas del mismo modo que en el artículo anterior, pero esta vez dedicaremos un poco más de tiempo a pulir el resultado de AI Assistant.

Tras generar una versión borrador de nuestra clase de prueba, verá el botón Specifyen la barra de herramientas superior:

Este botón le permite enviar información adicional a AI Assistant, para que su petición sea incluso más específica. Podría, por ejemplo, indicarle que utilice Mockery de esta forma:

Tras escribir esta petición personalizada y pulsar Intro, verá que AI Assistant actualiza el código en consecuencia.

Puede optimizar sus peticiones tanto como desee, hasta que encuentre una solución que se adapte a sus necesidades.

Conclusión

A medida que experimente con la especificación de sus peticiones, tenga en cuenta el objetivo que comentamos al principio de esta serie de artículos del blog: no pretendemos que AI Assistant genere las pruebas perfectas para nosotros. Queremos que se encargue de la aburrida configuración repetitiva para que podamos centrarnos principalmente en hacer los retoques finales, que son las partes más divertidas.

Teniendo esto en cuenta, creo que es importante no especificar en exceso las peticiones. Probablemente será más productivo generar un código que esté a su gusto en un 90 %, en lugar de dedicar más tiempo a intentar encontrar la petición perfecta.

Una última 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á en cuenta la próxima vez que genere pruebas.

Si desea saber más sobre cómo funciona AI Assistant entre bastidores y cómo trata sus datos, consulte las Condiciones de servicio de JetBrains AI (sección 5).

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.

¿Cuál es el siguiente paso? PhpStorm tiene algunas funcionalidades muy interesantes para combinar AI Assistant con acciones personalizadas. Suscríbase a nuestro blog para estar al día de nuestras próximas publicaciones, en las que seguiremos explorando las ventajas de utilizar la IA para sus rutinas PHP.

Enlaces útiles

Recursos:

Vídeos:

 

Artículo original en inglés de:

image description

Discover more