Tests unitaires
Un test décrit un cas précis et ce que le programme doit donner dans ce cas. En un clic, CoddyRun rejoue tous les tests et dit lesquels passent : on modifie son code sans crainte, car si quelque chose casse, on le voit tout de suite.
Les tests unitaires sont un nouvel outil de CoddyRun. Ils arrivent dans la prochaine version, CoddyRun v4.3, et ne sont pas encore présents dans la version actuelle. Cette page vous les présente à l’avance. Pour être prévenu de sa sortie, suivez les versions et les annonces.
Le programme entier est exécuté avec des saisies données à l’avance. Ce qu’il affiche est comparé à la sortie attendue.
Une expression comme carre(3) est calculée et comparée au résultat attendu (9), sans exécuter le programme principal.
OutilsBouton de la barre du haut, puis Tests unitairesCtrl + KPalette de commandes, puis tapez testsLes tests appartiennent au programme ouvert : chaque programme enregistré a ses propres tests. On ne peut pas ouvrir le panneau pendant qu’un programme s’exécute.
Prenons ce programme :
- Cliquez sur + Test de sortie. Une carte s’ouvre.
- Donnez-lui un nom clair (par exemple Ada, 12 ans). Sans nom, il s’appelle Test 1, Test 2…
- Dans Saisies, écrivez les réponses aux
demande, une par ligne, dans l’ordre. - Dans Sortie attendue, écrivez exactement ce que le programme doit afficher.
| Comparaison | Le test réussit si… | Utile pour |
|---|---|---|
| exacte | chaque ligne est identique. Les espaces en fin de ligne et les lignes vides à la fin sont ignorés. | la plupart des cas |
| contient | la sortie attendue apparaît quelque part dans ce que le programme affiche. | vérifier une seule phrase importante dans un long affichage |
| souple | les lignes sont identiques en ignorant les majuscules, les espaces multiples et les lignes vides. | ne pas échouer pour une majuscule ou une espace en trop |
[toile], les couleurs sont retirées (seul le texte compte), le HTML est réduit à son texte, et les lignes de déboguer sont ignorées.C’est le test le plus précis : quand il échoue, on sait exactement quelle fonction est en cause.
- Cliquez sur + Test de fonction.
- Dans la liste Fonction à tester, choisissez la fonction. Elle contient les fonctions écrites dans le programme (avec leur ligne) et celles de Mes fonctions et procédures, que l’on appelle avec
appelle. - Un champ apparaît pour chaque paramètre, avec son nom. Donnez-lui une valeur :
3,'Bonjour'(un texte s’écrit entre guillemets),vrai,[1, 2]… L’appel testé (carre(3)) se construit tout seul. - Dans Résultat attendu, écrivez la valeur :
9. - Appuyez sur Entrée dans un de ces champs pour lancer ce test tout de suite.
4Attendu5Ici, c’est le test qui est faux : le plus grand de 4 et 4 vaut bien 4. Un test qui échoue ne veut pas toujours dire que le programme est faux : vérifiez les deux !
Pour tester un calcul qui n’est pas un simple appel, comme carre(3) + carre(4) ou longueur(inverser('abc')), choisissez — Expression libre — en haut de la liste : le champ Expression testée s’écrit alors à la main.
Un paramètre vide ou mal écrit (guillemet non fermé, deux valeurs dans un même champ) devient rouge et est signalé avant l’exécution.
Une fonction de Mes fonctions et procédures se teste comme les autres : son code est ajouté automatiquement au lancement. Dans une expression libre, on l’écrit comme dans le programme : appelle compter_voyelles('élève').
Écrivez-le comme dans le code : 9, 2.5, 'Bonjour' (avec les guillemets), vrai, ou même un calcul comme 3 * 3. CoddyRun le calcule, puis compare les deux valeurs telles qu’elles s’affichent.
2.50 = 2,5Deux nombres sont égaux même s’ils sont écrits différemment0.1 + 0.2Les petites erreurs d’arrondi sont tolérées : cela vaut bien 0.3procédureNe retourne rien : elle se vérifie avec un test de sortie« Ignorer le programme principal »
Cette case est cochée par défaut. CoddyRun ne garde alors que les fonction, procédure, processus et classe, ainsi que les constantes et les déclarations (score est un nombre, xPI est une constante vaut 3.14…). Tout le reste (les demande, les affiche, les boucles du programme…) est mis de côté. Les numéros de ligne ne changent pas : une erreur pointe toujours la bonne ligne.
taux vaut 20), cette valeur n’existe pas quand la case est cochée : la variable vaut 0. Décochez la case, ou mieux, passez la valeur en paramètre de la fonction.▶ Lancer les testsLance tous les tests (ou Ctrl + Entrée)▶ d’une carteLance ce test seulementArrêterInterrompt les tests en coursLe bilan s’affiche en haut du panneau, dans la barre d’état et dans la console de l’éditeur. Les cartes en échec s’ouvrent toutes seules.
| État | Signification |
|---|---|
| ✔ Réussi | Le résultat obtenu est celui attendu. |
| ✘ Échoué | Le programme a fonctionné, mais le résultat est différent. |
| ! Erreur | Le programme s’est arrêté sur une erreur (division par zéro, variable inconnue…). Le lien Aller à la ligne N y emmène. |
| ⏱ Délai dépassé | Le test a duré plus longtemps que son délai (2 s par défaut) : souvent une boucle infinie. |
| – Non exécuté | Le test n’a pas été lancé (arrêt demandé, ou série trop longue). |
Lire une différence de sortie
Pour un test de sortie échoué, CoddyRun montre côte à côte ce qui était attendu et ce qui a été obtenu. Les lignes différentes sont surlignées :
Attendu
Obtenu
Ici, 1210 au lieu de 22 : quelqu’un a remplacé age est un nombre par age est un texte, donc age + 10 colle les deux au lieu de les additionner. Le test a trouvé le bug tout de suite !
Un résultat « à relancer »
Si l’on modifie un test après l’avoir lancé, sa carte prend une bordure en pointillés et le message « résultat obtenu avant ta dernière modification » apparaît. Relancez-le pour mettre le résultat à jour.
Le programme fonctionne et vous voulez le protéger avant de le modifier ? Ce bouton exécute le test et recopie ce qui est obtenu dans Sortie attendue (ou Résultat attendu). Pratique pour les longs affichages.
Il recopie ce que fait le programme maintenant, même si c’est faux : relisez toujours le résultat recopié.
Avec hasard(1, 6), le résultat change à chaque exécution… sauf pendant les tests : chaque test a une graine (1 par défaut). Avec la même graine, hasard donne toujours la même suite de nombres, et le test reste stable. Changez la graine pour essayer un autre tirage.
Chaque test a 2 secondes par défaut (entre 0,1 et 10 s). Augmentez-le pour un calcul vraiment long ; s’il dépasse quand même, cherchez une boucle qui ne s’arrête jamais.
Cas normalcarre(3) → 9Cas limites0, un nombre négatif, un texte vide, un tableau vide…Cas d’erreurQue se passe-t-il si l’utilisateur tape un âge négatif ?Un test = une idéeAvec un nom qui dit ce qu’il vérifie| Touche | Action |
|---|---|
| Ctrl + Entrée | Lancer tous les tests |
| Entrée | Dans « Expression » ou « Résultat attendu » : lancer ce test |
| Échap | Quitter le didacticiel, sinon fermer le panneau (les tests restent enregistrés) |
| ? | Bouton en haut du panneau : relancer le didacticiel |
Sur chaque carte : ⧉ duplique le test (pratique pour en écrire un autre presque pareil), 🗑 le supprime (une barre « Annuler » permet de le récupérer pendant quelques secondes).
fichiers, réseau, sonIndisponibles : rien n’est lu, écrit ni jouépauseIgnorées : le test ne perd pas de temps à attendreprocessusNe peuvent pas démarrerSi le programme utilise une de ces fonctions, le test s’arrête avec le message « … indisponible pendant les tests unitaires ». Testez alors plutôt les fonctions de calcul, avec des tests de fonction.
Programme enregistréDans Documents\CoddyRun\CoddyRun.tests.json, à côté de vos programmesPas encore enregistréDans le navigateur, en attendant. Une fois le programme enregistré, rouvrez les tests : un bandeau propose « Les ajouter ici » pour les rattacherCoddyRun.tests.json.100 testsAu maximum par programme ; une série dure 60 secondes au plusProgrammes interactifscliquer, appuyer, interagir, la souris et le clavier en direct se testent mal : testez leurs fonctions de calcul séparémentPendant une exécutionOn ne peut pas lancer les tests pendant qu’un programme s’exécute« Le programme demande une saisie de plus que prévu »
Il y a plus de demande (ou de choisir) dans le programme que de lignes dans Saisies. Ajoutez la réponse qui manque : le message indique quelle question était posée et à quelle ligne.
« N saisie(s) non utilisée(s) par le programme »
Ce n’est qu’un avertissement : le test donne plus de saisies que le programme n’en demande. Vérifiez qu’une ligne vide ne s’est pas glissée dans Saisies.
« Le programme s’est arrêté (terminer ?) avant d’évaluer le test »
La case « Ignorer le programme principal » est décochée et le programme utilise terminer : il s’arrête avant que l’expression soit calculée. Cochez la case.
Ma fonction marche dans le programme mais pas dans le test
Elle utilise sans doute une variable globale remplie par le programme principal. Voir « Ignorer le programme principal ».
« Délai dépassé » alors que mon programme n’a pas de boucle infinie
Une boucle attend peut-être une condition qui n’arrive jamais avec les saisies du test, ou le calcul est vraiment long : augmentez le Délai max de ce test (jusqu’à 10 000 ms).
Le test réussit alors que '9' (texte) n’est pas 9 (nombre)
Les valeurs sont comparées telles qu’elles s’affichent : '9' et 9 s’affichent tous les deux « 9 ». Pour vérifier le type, testez-le directement : expression type_de(carre(3)), résultat attendu 'nombre'.
« Des tests sont déjà en cours »
Une seule série de tests peut tourner à la fois. Attendez la fin, ou cliquez sur Arrêter.