Tutorials

IA pour PHP : comment adapter les prompts d’IA pour améliorer les tests PHP

Read this post in other languages:

Dans notre article précédent, nous avons vu comment l’AI Assistant de JetBrains permet d’automatiser les tests unitaires. En nous déchargeant de l’écriture des tests, il nous permet de passer directement à la partie la plus intéressante de la création de tests.

En essayant la génération de tests par IA, j’ai souvent été agréablement surpris de la précision dont l’AI Assistant fait preuve pour générer du code adapté à mon projet. Cependant, il y a des cas dans lesquels j’aurais aimé que le résultat soit légèrement différent. Si seulement on pouvait lui donner des indications sur ce qu’on attend du résultat final.

Eh bien figurez-vous que c’est possible.

Spécification des prompts

Revenons à l’exemple donné dans notre article précédent qui portait sur des tests pour la classe CreateArgumentComment. Cette classe écrit un record dans la base de données, détermine les utilisateurs à notifier, puis envoie des notifications à ces utilisateurs (en utilisant une autre classe : SendUserMessage). Voici à quoi ressemble ce code :

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',
            );
        }
    }
}

Vous avez sans doute remarqué que l’AI Assistant n’avait pas écrit de tests pour la partie notification dans cet extrait. En fait, il a bien écrit des tests pour cette partie dans certaines itérations, mais pas à chaque fois.

Une génération intéressante incluait le commentaire suivant à la fin de la classe de test :

// 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)

Bien sûr, nous pourrions demander à l’AI Assistant de générer ces tests de toute façon, mais je suis d’accord avec lui dans ce cas ; notifyUsers doit être traitée comme une classe distincte et testée séparément. J’avais prévu de me plonger dans les tests de notifications, mais l’AI Assistant a mis en évidence une meilleure approche et m’a aidé à réorienter mon projet. Merci à lui ! Maintenant que nous avons décidé de tester notifyUsers séparément, nous allons mettre cette classe de côté et envisager un autre cas d’utilisation. Imaginez que nous voulions utiliser Mockery au lieu des factories de Laravel. Nous commençons par générer nos tests de la même façon que dans l’article précédent, mais cette fois nous allons consacrer plus de temps à perfectionner la sortie de l’AI Assistant.

Après avoir généré une première version de notre classe de test, vous remarquerez le bouton Specify dans la barre d’outils du haut :

Ce bouton permet d’envoyer des informations supplémentaires à l’AI Assistant, en apportant des précisions au prompt. Vous pouvez, par exemple, écrire un prompt lui demandant d’utiliser Mockery de la façon suivante :

Après avoir écrit ce prompt personnalisé et appuyé sur Enter, vous verrez que l’AI Assistant met à jour le code en conséquence.

Vous pouvez optimiser vos prompts autant que nécessaire, jusqu’à ce que la solution proposée réponde à vos besoins.

Conclusion

Lorsque vous expérimentez la spécification de prompts, gardez à l’esprit ce que nous avions dit dans le premier article de cette série : l’objectif n’est pas que l’AI Assistant génère des tests parfaits, mais qu’il se charge d’effectuer pour nous la création de code réutilisable, afin de nous permettre de nous concentrer sur les derniers ajustements à apporter, ce qui est le plus intéressant.

Dans le même esprit, il est inutile de “sur-spécifier” vos prompts : il est plus productif de générer du code qui vous convienne à 90 % que de passer du temps à essayer de créer le prompt parfait.

Un dernier mot sur un point que vous avez peut-être déjà remarqué : l’AI Assistant apprend de vos prompts au fil du temps. Par exemple, comme nous avons spécifié que nous souhaitions utiliser Mockery au lieu des factories de Laravel, il en tiendra compte pour les prochains tests à générer.

Si vous voulez en apprendre plus sur le fonctionnement de l’AI Assistant et la façon dont il traite les données, consultez les Conditions d’utilisation du Service JetBrains AI (section 5).

Jusqu’à présent dans cette série, nous avons utilisé l’AI Assistant pour générer nos tests et avons vu comment optimiser nos prompts pour obtenir le résultat voulu.

Quelle est l’étape suivante ? PhpStorm dispose de fonctionnalités très intéressantes qui permet de combiner l’AI Assistant avec des actions personnalisées. Abonnez-vous à notre blog pour être informé de nos prochaines publications, dans lesquelles nous allons continuer d’explorer les avantages de l’utilisation de l’IA pour les tâches routinières en PHP.

Liens utiles

Ressources :

Vidéos :

Auteur de l’article original en anglais :

Delphine Massenhove

Brent Roose

image description

Discover more