Vous savez, il y a une certaine anxiété qui s'insinue lorsque vous jetez un coup d'œil à une base de code sur laquelle vous commencez tout juste à travailler, pour vous rendre compte que c'est un vaste désert inexploré. Pas un seul test n'a été écrit pour se prémunir contre les imprévus.
C'est comme marcher sur une corde raide au-dessus d'un gouffre, sachant qu'un seul faux pas pourrait plonger tout votre projet dans le chaos.
Si vous avez travaillé sur une base de code avec 0 test, vous savez que cela peut être une tâche ardue de penser à couvrir l'intégralité de la base de code avec des tests à partir de zéro là où il n'en existe pas actuellement.
Le processus demande un effort presque herculéen : vous devez vous pencher sur chaque fonction, méthode et composant, réfléchir à tous les cas extrêmes potentiels, structurer le code de la suite de tests et faire en sorte que tout fonctionne correctement.
Et cela ne touche même pas le temps qu'il faut pour atteindre une couverture significative. Nous parlons de semaines, voire de mois, avant que vous puissiez vous asseoir et dire : « Oui, nous avons atteint 80 % ou 90 % de couverture.
C'est pourquoi je suis ravi de partager ce sur quoi j'ai travaillé ces derniers mois. Ce voyage nous emmène dans un endroit où le domaine des tests automatisés rencontre le monde magique de l'IA. Découvrez Pythagora, un outil de développement open source qui est sur le point de devenir votre nouveau meilleur ami.
Tout au long de cet article de blog, je vais vous montrer comment lancer des tests automatisés avec Pythagora qui exploite la puissance de l'IA pour générer des tests pour l'ensemble de votre base de code, le tout avec une seule commande CLI et, espérons- le, amener votre base de code à 80% - 90 % de couverture du code en une seule journée .
Nous connaissons tous le dicton "Rome ne s'est pas construite en un jour". La même chose pourrait être dite pour une suite de tests complète et efficace. C'est un processus méticuleux et exigeant, mais une fois que vous avez parcouru cette route rocailleuse, le sentiment d'accomplissement est profond.
Parcourons ensemble les étapes nécessaires pour créer une suite de tests à partir de zéro et atteindre cette couverture de code convoitée de 80 % à 90 %.
Au premier stade, vous êtes comme un peintre devant une toile vierge. Le monde regorge de possibilités et vous êtes libre de créer un chef-d'œuvre.
Votre chef-d'œuvre, dans ce cas, consiste à choisir les types de tests que vous souhaitez écrire, à trouver le bon cadre de test à utiliser et à adopter les meilleures pratiques adaptées à votre environnement spécifique.
Envisagez-vous des tests unitaires, des tests d'intégration, des tests E2E ou un mélange des trois ?
Bien que cette configuration initiale soit souvent considérée comme la partie "facile", ce n'est en aucun cas une promenade dans le parc. Du temps, des recherches et peut-être quelques tasses de café sont nécessaires pour prendre des décisions éclairées.
Une fois que vous avez mis en place votre structure de base, il est temps de retrousser vos manches et d'approfondir les choses sérieuses. Maintenant, vous devrez parcourir toute votre base de code, une fonction à la fois, et écrire des tests pour chacune. Votre tâche ici est de vous assurer que vos tests touchent toutes les lignes de code de chaque fonction, méthode ou composant.
Cette tâche s'apparente à l'exploration d'un labyrinthe complexe. Vous devez parcourir tous les chemins, tourner tous les virages et vous assurer qu'aucune pierre n'est laissée de côté.
La rédaction de ces tests est une étape détaillée et chronophage. Il ne s'agit pas seulement d'écrire quelques lignes de code ; il s'agit de comprendre le but de la fonction, sa sortie attendue et comment elle interagit au sein de votre application.
Après la première série de tests, vous pourriez pousser un soupir de soulagement. Attendez, cependant; il reste encore une pièce importante du puzzle. Il est temps de plonger dans le monde sauvage et imprévisible des cas extrêmes .
Cette partie n'augmentera peut-être pas votre pourcentage de couverture de code, mais elle est cruciale pour tester la robustesse et la résilience de votre code.
Ces tests dits négatifs permettent d'évaluer comment votre code réagit à diverses entrées, en particulier celles en marge du comportement attendu. Des entrées vides aux valeurs qui repoussent les limites de vos types de données, ces tests sont conçus pour imiter le comportement des utilisateurs dans le monde réel, où les utilisateurs ont souvent le don de pousser votre code dans des directions que vous n'auriez jamais cru possibles.
Créer une suite de tests à partir de zéro est une tâche herculéenne. Mais rassurez-vous, chaque effort que vous fournissez est une étape vers la création d'une application plus robuste, fiable et résiliente.
Et rappelez-vous, vous n'êtes pas seul. Nous sommes tous passés par là, et avec un outil comme Pythagora, le voyage n'est pas aussi intimidant qu'il n'y paraît.
Par contre, avec Pythagore, ce que vous pouvez faire, c'est saisir :
npx pythagora --unit-tests --path ./path/to/repo
Pythagora naviguera dans tous les fichiers de tous les dossiers, évoquant des tests unitaires pour chaque fonction rencontrée. Maintenant, vous pouvez vous asseoir et vous détendre ou aller déjeuner et le laisser fonctionner pendant un moment jusqu'à ce qu'il ait fini d'écrire les tests.
Ok, mais attendez, c'est quoi Pythagore ??
J'ai toujours rêvé d'un monde où des tests automatisés pourraient être créés pour moi. Mais la réalité n'est pas si simple. Personne ne connaît votre code comme vous, ce qui rend difficile pour un autre de rédiger des tests automatisés efficaces pour celui-ci. Les résultats sont souvent en deçà de ce que vous obtiendriez vous-même.
Cependant, tout a changé lorsque ChatGPT est entré en scène. Alors que je bricolais avec cette technologie, je me suis demandé : « Pourrions-nous exploiter la puissance de ChatGPT pour écrire des tests automatisés ?
La curiosité piquée, j'ai creusé plus profondément, expérimentant ses capacités, et ce que j'ai découvert m'a époustouflé.
ChatGPT a démontré une incroyable capacité à comprendre le code, offrant un aperçu d'une nouvelle voie prometteuse dans les tests automatisés.
Et ainsi, une idée pour Pythagore est née.
Pythagora est un outil de développement open source, conçu avec une seule mission en tête : rendre les tests automatisés autonomes . J'imagine un monde où les développeurs, tels que vous et moi, peuvent se concentrer sur la création de fonctionnalités sans s'enliser dans le bourbier de l'écriture et de la maintenance des tests.
Pour réaliser cette vision, il utilise GPT-4.
Actuellement, Pythagora a la capacité d'écrire des tests unitaires et d'intégration. Cependant, pour les besoins de cet article de blog, nous nous concentrerons sur sa capacité à générer des tests unitaires.
Pour installer Pythagora, il vous suffit de faire npm i pythagora
. C'est ça! Pythagora est maintenant à votre service.
Une fois Pythagora installé, vous devrez le configurer avec une clé API. Il peut s'agir d'une clé API OpenAI ou d'une clé API Pythagora.
Pour utiliser une clé API OpenAI, vous devez exécuter la commande suivante :
npx pythagora --config --openai-api-key <OPENAI_API_KEY>
Il est important de noter que si vous choisissez d'utiliser votre propre clé API OpenAI, vous devez avoir accès à GPT-4.
Alternativement, vous pouvez obtenir une clé API Pythagora à partir de ce lien . Une fois que vous l'avez, configurez-le avec la commande suivante :
npx pythagora --config --pythagora-api-key <PYTHAGORA_API_KEY>
Si vous préférez générer des tests pour un fichier spécifique, utilisez :
npx pythagora --unit-tests --path ./path/to/file.js
Et si vous avez une fonction particulière en tête, utilisez :
npx pythagora --unit-tests --func <FUNCTION_NAME>
Décollons le rideau et jetons un coup d'œil dans la salle des machines. Qu'est-ce qui fait vibrer Pythagore ?
À la base, Pythagora fonctionne comme un explorateur intrépide, plongeant dans le labyrinthe complexe de votre base de code. Tout d'abord, il mappe toutes les fonctions qui sont exportées à partir de vos fichiers afin qu'il puisse les appeler depuis les tests.
Évidemment, si une fonction n'est pas exportée, elle ne peut pas être appelée depuis l'extérieur de son fichier. Au fait, après avoir généré des tests plusieurs fois, cela vous fera réfléchir à votre base de code et à la manière dont vous pouvez mieux la structurer afin que davantage de tests puissent être générés.
Une fois qu'il a identifié les fonctions exportées, Pythagora franchit une nouvelle étape dans le terrier du lapin : il étudie chaque fonction à tour de rôle, traquant toutes les fonctions supplémentaires appelées à l'intérieur.
Imaginez-le comme l'archéologue de votre base de code, éliminant doucement les couches de poussière pour exposer les connexions et dépendances cachées.
En d'autres termes, il recherche toutes les fonctions appelées depuis la fonction testée afin que GPT puisse mieux comprendre ce que fait une fonction pour laquelle les tests sont écrits.
Armé de ces informations, Pythagora se prépare à utiliser la puissance de l'IA. Il conditionne le code collecté et l'envoie à l'API Pythagora. Ici, la véritable magie opère : une invite est méticuleusement conçue et transmise au modèle GPT.
Cette interaction entre le code, l'API et le modèle d'IA aboutit à la génération d'un ensemble complet de tests unitaires, prêts à être déployés et mis en œuvre.
Le serveur API et les invites utilisées sont open-source. Ils sont à votre disposition pour que vous puissiez les approfondir, les examiner et même y contribuer si vous le souhaitez. Vous pouvez trouver le serveur API Pythagora ici tandis que les invites et les ingrédients clés de la création de tests unitaires sont hébergés dans ce dossier .
Une fois que Pythagora a écrit tous les tests demandés, il est temps pour vous de vous lancer et de commencer à les réviser. Il s'agit d'une étape essentielle du processus ; il est important de savoir ce qui a été créé et de s'assurer que tout correspond à vos attentes.
N'oubliez pas que Pythagora crée des tests basés sur Jest. Ainsi, pour exécuter tous les tests générés, vous pouvez simplement exécuter :
npx jest ./pythagora_tests/
Maintenant, un mot d'avertissement : Pythagore est encore à ses débuts. Comme pour tous les jeunes projets, il y aura forcément des ratés en cours de route. Ainsi, vous pourriez rencontrer des tests défaillants lors de vos premières exécutions.
Ne soyez pas découragé; considérez cela comme une partie du voyage. Avec votre avis et les améliorations continues de Pythagora, ces tests ratés appartiendront bientôt au passé.
Et n'oublions pas le bon côté des choses. Même avec ces problèmes de démarrage à un stade précoce, Pythagora peut vous amener à un endroit où votre base de code a une couverture de test substantielle, potentiellement jusqu'à 90 % .
Le processus de révision, en particulier pour les bases de code plus volumineuses, peut prendre quelques heures. N'oubliez pas que vous ne regardez pas seulement les tests qui ont réussi, mais aussi ceux qui ont échoué. Il est crucial de comprendre chaque test que vous engagez dans votre référentiel. La connaissance est le pouvoir, après tout.
Après un examen approfondi et des ajustements potentiels, vous êtes prêt à faire votre dernier pas : valider les tests générés dans votre référentiel. Avec cette dernière étape, vous auriez réussi à intégrer une suite de tests unitaires robuste dans votre projet.
Et tout cela est réalisé avec la puissance de Pythagora et quelques lignes de commande dans votre terminal.
Très bien, maintenant que j'ai éveillé votre intérêt, plongeons dans les vrais trucs - des exemples tangibles de Pythagore en action. Pour les besoins de notre démonstration, nous avons sélectionné un projet open source bien connu, Lodash .
L'exécution d'une seule commande Pythagora a suffi à générer 1604 tests, atteignant une couverture de code impressionnante de 91 % de l'ensemble du référentiel Lodash. Mais ce n'est pas seulement la quantité de tests qui est impressionnante.
Parmi ceux-ci, 13 tests ont mis au jour de véritables bogues dans la branche principale de Lodash.
Si vous êtes curieux de les vérifier vous-même, nous avons forké le référentiel Lodash et ajouté les tests générés par Pythagora. N'hésitez pas à les découvrir ici .
Examinons maintenant de plus près l'un des tests qui a détecté un bogue sournois :
test(`size({ 'a': 1, 'b': 2, 'length': 9 })`, () => { expect(size({ 'a': 1, 'b': 2, 'length': 9 })).toBe(3); // test returns 9 });
Dans ce test, la fonction size
de Lodash est supposée renvoyer la taille d'un objet JSON. Mais, GPT a ajouté une clé nommée length
, une petite astuce pour voir si Lodash pourrait renvoyer la valeur de cette clé au lieu de la taille réelle de l'objet.
Il semble que Lodash soit tombé dans le piège de cette ruse, car le test a échoué en retournant '9' au lieu du '3' attendu.
Ceci est un exemple fantastique de la façon dont Pythagora, alimenté par GPT, excelle à découvrir des cas délicats qui pourraient facilement passer sous le radar.
En générant automatiquement un grand nombre de cas de test aussi complexes, Pythagora peut être votre fidèle compagnon, vous aidant à découvrir et à corriger des bogues que vous n'auriez peut-être jamais anticipés.
Eh bien, nous l'avons, chers développeurs. Nous nous sommes lancés dans un voyage assez important aujourd'hui, traversant les territoires inexplorés d'une base de code substantielle dépourvue de tests, et revenant avec une suite automatisée de tests conçus par notre fidèle outil alimenté par l'IA, Pythagora.
Vous avez appris que même face à une base de code intimidante et sans test, il n'y a pas lieu de désespérer. La tâche de créer une suite substantielle de tests n'a plus besoin d'être une tâche ardue.
Nous avons été témoins de la magie de Pythagora alors qu'il examinait une bibliothèque open source bien connue, Lodash, et générait 1604 tests qui couvraient 91 % de la base de code .
Nous avons vu comment Pythagora n'est pas seulement une question de quantité, mais aussi de qualité des tests. Il ne s'agit pas seulement de créer des tests pour le plaisir, mais de trouver intelligemment des cas extrêmes et des bogues qui auraient autrement pu passer inaperçus.
Pythagora a démasqué 13 vrais bogues dans la branche principale de Lodash - un témoignage de la puissance de l'IA dans les tests de logiciels.
Maintenant, vous devriez avoir une meilleure compréhension des raisons pour lesquelles les outils de test basés sur l'IA comme Pythagora ne sont pas seulement un luxe, mais une nécessité dans le paysage de développement rapide d'aujourd'hui.
Donc, que vous ayez affaire à un projet existant avec zéro test ou que vous en commenciez un nouveau et que vous cherchiez à établir un cadre de test solide dès le départ, n'oubliez pas que vous n'êtes pas seul.
Pythagora est là pour prendre les rênes, vous aider à générer facilement des tests significatifs et vous faire gagner un temps précieux qui peut être mieux utilisé pour développer de superbes fonctionnalités.
Merci de m'avoir rejoint dans ce voyage, et j'ai hâte de voir comment vous utilisez Pythagora dans vos projets. Bon codage !
PS Si vous avez trouvé ce message utile, cela signifierait beaucoup pour moi si vous mettiez en vedette le repo Pythagora Github , et si vous essayez Pythagora, veuillez nous faire savoir comment cela s'est passé sur [email protected]