Générer des tests unitaires
Cet outil écrit un premier jeu de tests unitaires pour le code que vous lui confiez. Il repère les cas nominaux, quelques cas limites et les erreurs attendues, puis produit des tests dans le framework de votre langage. C’est un point de départ à relire, pas une couverture garantie. La fonction est en bêta.
Exécuter en ligne
Exécutez cette tâche sur nos serveurs, avec votre compte. Les outils gratuits tournent dans votre navigateur ; celui-ci est facturé sur votre solde KIT au prix affiché ci-dessus.
Des cas nominaux aux cas limites
L’outil ne se contente pas de vérifier qu’une fonction renvoie la bonne valeur pour une entrée évidente. Il propose aussi des cas limites : chaîne vide, zéro, valeur négative, liste sans élément, entrée invalide qui doit lever une erreur. Ce sont précisément les cas que l’on oublie sous la pression, et ceux qui font tomber le code en production, souvent au pire moment. Les voir listés est déjà utile en soi.
Un point de départ, pas une garantie de couverture
Disons-le sans détour : des tests générés ne prouvent pas que votre code est correct. Ils reflètent le comportement observé, y compris un bogue existant qu’ils figeraient en « attendu ». Relisez chaque assertion, vérifiez qu’elle teste la bonne chose et complétez avec les cas métier que l’outil ne peut pas deviner. La fonction est en bêta et gagne à être encadrée par votre jugement.
Le framework de votre langage
Les tests sont écrits pour l’outil que vous utilisez déjà : pytest en Python, Jest ou Vitest en JavaScript et TypeScript, JUnit en Java, PHPUnit en PHP. Vous copiez le fichier dans votre dossier de tests et il s’exécute avec vos commandes habituelles, sans configuration exotique à mettre en place. Le style des assertions suit la convention du framework choisi, pour ne pas dépayser vos relecteurs.
Dans votre chaîne d’intégration
Sur cette page, collez une fonction et lisez les tests proposés en quelques secondes. Pour couvrir un module complet ou générer des tests au fil des commits, l’API s’intègre à votre chaîne d’intégration continue, et d’autres canaux suivront. L’objectif n’est pas de remplacer votre jugement, mais de vous épargner la page blanche du premier test, souvent le plus difficile à écrire.
Cas d’usage
Couvrir vite une fonction utilitaire
Thomas vient d’écrire une fonction de calcul de TVA. Il génère les tests, découvre un cas d’arrondi qu’il n’avait pas prévu et corrige avant même de committer.
Rattraper une dette de tests
Un module hérité de Studio Lumen SAS n’a aucun test. L’équipe génère une base de couverture, la relit et l’enrichit : mieux vaut un filet imparfait que pas de filet du tout.
Voir les cas oubliés
En lisant les tests proposés, Nadia repère un cas limite — une entrée nulle — que sa fonction ne gère pas. Le test révèle le trou avant l’utilisateur.
Questions fréquentes
Quels langages et frameworks de test ?
Les plus courants : pytest, Jest, Vitest, JUnit, PHPUnit et leurs équivalents. Vous précisez le framework voulu, et les tests suivent sa syntaxe et ses conventions d’assertion.
Les tests passent-ils du premier coup ?
Souvent, mais pas toujours. Un test peut refléter une supposition erronée sur le comportement attendu. Relisez et adaptez : la fonction est en bêta et le résultat reste un brouillon à valider.
L’outil couvre-t-il 100 % de mon code ?
Non, et il ne le prétend pas. Il propose un socle de tests utiles ; la couverture complète, notamment des cas métier spécifiques, reste votre travail. Mesurez-la avec votre outil de couverture habituel.
Mon code est-il conservé sur vos serveurs ?
Il est transmis le temps de générer les tests, puis n’est pas conservé ni réutilisé. Rien n’est journalisé au-delà du traitement.
Combien ça coûte ?
$0.003 par appel, plus $0.0135 par tranche de 1 000 mots de code, en dollars US. Tarif affiché, sans abonnement.
Faut-il un compte ?
Non. Vous collez votre code et lancez la génération ; l’achat, pour un usage facturé, est direct, sans inscription.
Pour les développeurs — accès API
Tout sur cette page est disponible par programmation. Cette section s'adresse aux équipes qui veulent l'intégrer à leurs systèmes ; les autres peuvent simplement utiliser l'outil ci-dessus.
Endpoint
Authentification par jeton Bearer : un seul POST met la tâche en file d’attente, et le résultat vous parvient par webhook ou lien signé.
Appeler depuis votre stack
curl -X POST https://api.kit.forhosting.com/dev/unit-tests \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"…"}'const res = await fetch("https://api.kit.forhosting.com/dev/unit-tests", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "…"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev/unit-tests",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "…"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev/unit-tests", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"…"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"…"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev/unit-tests", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemple de requête
{
"text": "…"
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.unit_tests",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L’API est asynchrone : chaque appel renvoie un task_id immédiatement, puis vous interrogez l’état à raison d’une requête par seconde.
Tarifs
Le prix est publié, sans tokens ni crédits. Une tâche qui échoue n’est pas facturée.
Erreurs
| HTTP | Code | Signification |
|---|---|---|
401 | unauthorized | Clé API absente ou invalide : vérifiez l’en-tête Authorization. |
402 | insufficient_balance | Solde insuffisant : rechargez votre compte pour lancer cette tâche. |
404 | unknown_type | Type de tâche inconnu : vérifiez le champ type de votre requête. |
429 | rate_limited | Trop de requêtes : ralentissez la cadence, puis réessayez. |
422 | task_failed | La tâche a échoué : elle ne vous est pas facturée. |