CoddyRun

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.

2
Types de tests
1
Clic pour tout vérifier
100
Tests par programme
Bientôt disponible : CoddyRun v4.3

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 panneau Tests unitaires de CoddyRun : la liste des tests, le bilan des réussites et des échecs, et le détail d’un test
Pourquoi tester ?
Ne plus tout réessayer à la main après chaque modification
Quand on écrit un programme, on l’essaie à la main : on le lance, on tape une réponse, on regarde le résultat. Mais après chaque modification, il faudrait tout réessayer… Les tests unitaires le font pour vous, en un clic.
Test de sortie

Le programme entier est exécuté avec des saisies données à l’avance. Ce qu’il affiche est comparé à la sortie attendue.

Test de fonction

Une expression comme carre(3) est calculée et comparée au résultat attendu (9), sans exécuter le programme principal.

Ouvrir les tests
Un panneau propre à chaque programme
Deux façons d’ouvrir le panneau
OutilsBouton de la barre du haut, puis Tests unitaires
Ctrl + KPalette de commandes, puis tapez tests
Première fois ? Suivez le didacticiel. À l’ouverture du panneau, un didacticiel d’une minute démarre tout seul, comme ceux de l’éditeur, de CoddyBlock et de CoddyDraw : il présente chaque élément du panneau sur un exemple de test de fonction (retiré à la fin). Naviguez avec ← →, quittez avec Échap. Cochez « Ne plus afficher ce didacticiel à l’ouverture des tests unitaires » pour qu’il ne démarre plus tout seul ; le bouton ? en haut du panneau le relance quand vous voulez.

Les 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.

Tests unitaires— Calculatrice + Test de sortie+ Test de fonction▶ Lancer les tests?
2/3 réussis · 1 échoué — 38 ms Tests enregistrés
✔Bonjour AdaSortie12 ms
✔carré de 3Fonction4 ms
✘carré d’un négatifFonction3 ms
Le test de sortie
Vérifier le programme en entier, comme si quelqu’un l’utilisait

Prenons ce programme :

prenom est un texte demande 'Ton prénom ?' dans prenom age est un nombre demande 'Ton âge ?' dans age affiche 'Bonjour ' + prenom affiche 'Dans 10 ans tu auras ' + (age + 10) + ' ans.'
  1. Cliquez sur + Test de sortie. Une carte s’ouvre.
  2. Donnez-lui un nom clair (par exemple Ada, 12 ans). Sans nom, il s’appelle Test 1, Test 2…
  3. Dans Saisies, écrivez les réponses aux demande, une par ligne, dans l’ordre.
  4. Dans Sortie attendue, écrivez exactement ce que le programme doit afficher.
✔Ada, 12 ansSortie9 ms
Saisies (une par ligne)
Ada 12
Sortie attendue
Bonjour Ada Dans 10 ans tu auras 22 ans.
Comparaison exacte ▾ Délai max 2000 ms Graine 1 Remplir avec le résultat actuel
✔ Réussi — Test réussi.
Les trois comparaisons
ComparaisonLe test réussit si…Utile pour
exactechaque ligne est identique. Les espaces en fin de ligne et les lignes vides à la fin sont ignorés.la plupart des cas
contientla sortie attendue apparaît quelque part dans ce que le programme affiche.vérifier une seule phrase importante dans un long affichage
soupleles 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
Ce qui est comparé : le texte affiché dans la console. Une toile affichée devient [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.
Le test de fonction
Vérifier une fonction toute seule, avec des valeurs choisies

C’est le test le plus précis : quand il échoue, on sait exactement quelle fonction est en cause.

fonction carre(x) retourne x * x fin fonction fonction plusGrand(x, y) si x > y alors retourne x sinon retourne y fin si fin fonction
  1. Cliquez sur + Test de fonction.
  2. 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.
  3. 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.
  4. Dans Résultat attendu, écrivez la valeur : 9.
  5. Appuyez sur Entrée dans un de ces champs pour lancer ce test tout de suite.
✘plusGrand avec deux égauxFonction3 ms
Fonction à tester
plusGrand(x, y) — ligne 5▾
Paramètres de plusGrand
x
4
y
4
Appel testé
plusGrand(4, 4)
=
Résultat attendu
5
☑ Ignorer le programme principal
✘ Échoué — La valeur obtenue est différente de la valeur attendue.
Obtenu4Attendu5

Ici, 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 !

« Expression libre »

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').

Le résultat attendu est une expression

É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éremment
0.1 + 0.2Les petites erreurs d’arrondi sont tolérées : cela vaut bien 0.3
procé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.

La fonction utilise une variable globale ? Si elle dépend d’une valeur donnée par le programme principal (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 et lire les résultats
Le bilan, les états et les différences de sortie
Lancer
▶ Lancer les testsLance tous les tests (ou Ctrl + Entrée)
▶ d’une carteLance ce test seulement
ArrêterInterrompt les tests en cours

Le 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.

ÉtatSignification
✔ RéussiLe résultat obtenu est celui attendu.
✘ ÉchouéLe programme a fonctionné, mais le résultat est différent.
! ErreurLe 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 :

✘Ada, 12 ansSortie8 ms
✘ Échoué — La sortie diffère à la ligne 2.
Attendu
1Bonjour Ada
2Dans 10 ans tu auras 22 ans.
Obtenu
1Bonjour Ada
2Dans 10 ans tu auras 1210 ans.

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.

✔carré de 3Fonction4 ms
Astuces
Gagner du temps et écrire de bons tests
« Remplir avec le résultat actuel »

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é.

Le hasard reproductible : la graine

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.

Le délai

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.

Bien choisir ses tests
Cas normalcarre(3) → 9
Cas 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
Raccourcis
ToucheAction
Ctrl + EntréeLancer tous les tests
EntréeDans « Expression » ou « Résultat attendu » : lancer ce test
ÉchapQuitter 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).

Le mode protégé
Des tests rapides, isolés et sans risque
Chaque test tourne dans un interpréteur tout neuf : un test ne peut pas influencer le suivant.
Pendant les tests
fichiers, réseau, sonIndisponibles : rien n’est lu, écrit ni joué
pauseIgnorées : le test ne perd pas de temps à attendre
processusNe peuvent pas démarrer

Si 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.

Où sont gardés les tests ?
Enregistrés automatiquement à chaque modification
Selon le programme
Programme enregistréDans Documents\CoddyRun\CoddyRun.tests.json, à côté de vos programmes
Pas encore enregistréDans le navigateur, en attendant. Une fois le programme enregistré, rouvrez les tests : un bandeau propose « Les ajouter ici » pour les rattacher
Pensez à sauvegarder ce fichier : si vous copiez vos programmes sur une clé ou un autre ordinateur, copiez aussi CoddyRun.tests.json.
Limites
Ce que les tests unitaires ne font pas
100 testsAu maximum par programme ; une série dure 60 secondes au plus
Programmes interactifscliquer, appuyer, interagir, la souris et le clavier en direct se testent mal : testez leurs fonctions de calcul séparément
Pendant une exécutionOn ne peut pas lancer les tests pendant qu’un programme s’exécute
Problèmes fréquents
Les messages que l’on rencontre le plus souvent
« 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.

Les tests unitaires arrivent avec CoddyRun v4.3. D’autres réponses vous attendent dans la FAQ (rubrique « Tests unitaires »). En attendant, retrouvez tous les mots-clés sur la page Langage, et posez vos questions sur le support public.