Guide · SaaS & dev
Claude Code pour générer des tests : méthode et vérifications
Utiliser Claude Code pour préparer des tests utiles : contrat de comportement, cas négatifs, diff, exécution réelle et revue avant intégration.
Claude Code peut générer une première version de test, proposer des cas limites ou expliquer pourquoi une assertion échoue. Cela ne signifie pas que le test protège réellement votre application. Un test n’a de valeur que s’il exprime un comportement attendu, échoue lorsque ce comportement est cassé et s’exécute dans l’environnement du projet. La génération accélère l’écriture ; la validation reste votre responsabilité.
La meilleure demande n’est pas « écris des tests pour tout ». Commencez par une fonction, une route ou un composant dont vous pouvez formuler le contrat. Donnez les entrées, le résultat attendu et les erreurs pertinentes. Demandez à l’assistant de lire un test existant avant de proposer une syntaxe ou un framework : chaque dépôt a ses fixtures, conventions et scripts.
Ce que vous allez apprendre
Vous allez définir un contrat testable, sélectionner les cas utiles, demander une proposition limitée, vérifier le diff, exécuter la suite concernée et distinguer un test vert d’une preuve suffisante. La méthode s’applique à plusieurs frameworks ; les commandes exactes doivent toujours venir du projet.
Prérequis
Il vous faut un dépôt, une zone de code réservée, un framework de test déjà identifié et le droit d’exécuter les commandes pertinentes. Lisez le README, package.json, les fichiers de configuration et au moins un test voisin. Ne créez pas une nouvelle dépendance de test sans décision explicite : ce serait une modification d’outillage distincte.
Avant toute écriture, inspectez l’état :
git status --short
Vérification : les changements existants sont connus. Si une autre personne modifie le même test ou module, arrêtez-vous plutôt que de fusionner des versions concurrentes.
1. Écrire le contrat avant le test
Décrivez ce que l’utilisateur ou l’appelant doit observer. Pour une fonction, indiquez l’entrée valide, la sortie et au moins un cas invalide. Pour une route, indiquez le statut, le corps de réponse, l’autorisation et les erreurs. Pour un composant, indiquez le texte, l’action ou l’état visible, pas seulement le détail interne d’implémentation.
Exemple de contrat : « quand l’identifiant est absent, la route retourne une erreur contrôlée et ne lance aucun accès aux données ». Ce contrat est plus utile que « tester la validation », car il indique le comportement et l’effet de bord à surveiller.
Vérification : une personne qui ne connaît pas le code peut dire si le comportement est respecté sans lire la solution. Si ce n’est pas le cas, précisez le contrat.
2. Lire les exemples existants
Demandez à Claude Code de trouver un test comparable dans le dépôt et de l’expliquer : fixtures, nommage, mocks, assertions et commande associée. Cela évite les tests qui importent un framework absent, initialisent l’application différemment ou contournent le mécanisme de données réel.
Un bon exemple ne doit pas être copié intégralement sans compréhension. Vérifiez notamment les mocks : ils sont utiles pour isoler une API externe, mais un mock trop large peut rendre un test vert alors que la vraie intégration est cassée. Gardez les doubles de test proches de leur contrat et vérifiez les appels importants.
Vérification : la proposition de test respecte le langage, l’emplacement et les conventions que vous venez d’observer dans le dépôt.
3. Demander des cas normaux et négatifs
Un assistant propose souvent le « chemin heureux ». Demandez explicitement les erreurs utiles : valeur manquante, format invalide, accès non autorisé, timeout simulé ou résultat vide. Ne cherchez pas à couvrir toutes les combinaisons à la première passe ; choisissez celles qui correspondent au risque de la fonctionnalité.
Pour une validation, testez qu’une donnée incorrecte est rejetée sans divulguer de détail interne. Pour une autorisation, testez qu’un utilisateur standard ne peut pas agir sur une ressource qui ne lui appartient pas. Pour une interface, testez un état vide ou une erreur visible. Les cas négatifs réduisent les régressions qui passent inaperçues dans une démonstration manuelle.
Vérification : chaque cas de test correspond à une règle observable. Évitez les assertions sur des détails de structure qui changent à chaque refactorisation sans affecter l’utilisateur.
4. Relire le test généré
Avant de l’exécuter, lisez le diff. Vérifiez les imports, les chemins, les valeurs fictives et les assertions. Assurez-vous que le test ne contient pas un token, une URL de production ou une dépendance ajoutée sans autorisation. Un test qui appelle accidentellement un service réel peut coûter de l’argent, modifier des données ou échouer de manière aléatoire.
Regardez aussi la qualité de l’assertion. expect(result).toBeTruthy() est parfois trop faible : plusieurs résultats incorrects peuvent être vrais. Préférez une vérification précise du statut, du champ ou de l’effet attendu. Le test doit échouer pour la bonne raison.
Vérification : changez temporairement le comportement ou l’attendu. La suite doit échouer. Restaurez ensuite le code voulu sans utiliser une commande destructive sur le dépôt partagé.
5. Exécuter et interpréter les contrôles
Lancez la commande du projet, par exemple un test ciblé suivi d’une suite plus large si le changement le justifie. N’affirmez jamais qu’un test passe parce que l’assistant l’a prédit ou parce qu’il est syntaxiquement plausible. Notez la commande, la version d’environnement si elle compte et le résultat réel.
Un test vert peut cacher une couverture insuffisante. Vérifiez le comportement dans l’interface ou par une requête locale quand la fonctionnalité le nécessite. Inversement, un test rouge n’est pas une excuse pour modifier le code jusqu’à ce qu’il devienne vert : lisez l’erreur, déterminez si le contrat ou l’implémentation est incorrect et faites une correction limitée.
Vérification : la remise sépare les tests exécutés des suggestions non testées. Cette distinction est indispensable pour une revue honnête.
Problèmes fréquents et solutions
Le test passe même si la fonctionnalité est cassée
Renforcez l’assertion, vérifiez les mocks et introduisez volontairement une erreur contrôlée. Si le test reste vert, il ne couvre pas le contrat annoncé.
Claude Code invente une fixture ou une API
Revenez aux exemples du dépôt et à la documentation du framework. N’ajoutez pas une couche de compatibilité simplement pour faire compiler un test généré.
La suite est lente ou instable
Isolez la cause : réseau réel, temps système, données partagées ou initialisation coûteuse. Préférez des fixtures locales et des doubles contrôlés quand le test le permet.
FAQ
Claude Code peut-il écrire tous mes tests ?
Il peut proposer des ébauches, mais la couverture utile vient de contrats métier et de scénarios que l’équipe comprend. La revue et l’exécution restent nécessaires.
Faut-il commencer par le test ou le code ?
Les deux approches existent. Pour un bug ou une fonctionnalité claire, commencer par un test de comportement rend souvent le résultat plus vérifiable.
Que tester en priorité ?
Les règles métier, autorisations, entrées invalides, erreurs et comportements qui ont déjà régressé ou qui ont un impact utilisateur important.
Puis-je utiliser des données de production dans un test ?
Non sans une procédure de sécurité et d’anonymisation approuvée. Préférez des fixtures fictives et minimales.
Un taux de couverture élevé suffit-il ?
Non. La couverture mesure des lignes exécutées, pas la pertinence des assertions ni la qualité des scénarios.
Conclusion
Claude Code est utile pour accélérer la préparation des tests, à condition de lui donner un contrat précis et de relire ce qu’il propose. Les tests restent une preuve seulement après exécution réelle, échec contrôlé et validation du comportement qu’ils prétendent protéger.
Sources et limites
- Anthropic — Claude Code best practices : pratiques d’usage à vérifier selon version.
- Google Testing Blog : ressources générales sur les stratégies de test.
- Martin Fowler — Test Coverage : limites de la couverture de code.
Les outils et frameworks de test varient selon le dépôt. Ce guide ne prétend pas qu’un test généré est exécuté ou suffisant sans preuve locale.