Exerciciels d’algorithmique avec les tests unitaires

samedi 27 octobre 2012
par  Alain BUSSER

Les tests unitaires servent à déboguer des programmes ; on peut aussi en faire un usage pédagogique. Voici comment, en quelques lignes de Python

En fait, tous les langages objet ont un utilitaire de test :

  • JUnit en Java
  • PHPUnit pour Php
  • JSUnit pour JavaScript
  • PyUnit pour Python
  • SUnit pour Smalltalk

Etc.

Le principe est toujours le même :

  1. Le prof écrit un certain nombre d’affirmations (« assert ») qui devront être vraies si l’algorithme est bien rédigé (une sorte de cahier des charges) ;
  2. L’élève rédige son algorithme en Python (par exemple)
  3. L’élève lance le test créé par le prof, et regarde si le test réussit ; si le test échoue, l’élève sait où et en déduit une remédiation.

L’élève est donc très largement autonome. Le test lui-même, selon la façon dont il est rédigé, peut mettre l’élève sur la voie pour la rédaction de l’algorithme ... ou pas !

En amont

L’énoncé est le suivant :


Rédiger une fonction f en Python, qui admet en entrée un entier n, et retourne en sortie la somme des entiers inférieurs ou égaux à n.

Le prof prépare donc son sujet d’interro sous la forme d’une fonction interro() qui ne fait que vérifier certaines valeurs de f :

variantes

Il est possible de mettre cette fonction dans un fichier du source de Python sans le dire aux élèves ; par exemple le fichier prof.py (qui n’existe pas !). L’élève devra alors écrire

from prof import *

en préambule de son exercice. Ce qui lui simplifie la tâche s’il doit redémarrer Python.

Il est possible aussi de rajouter, outre les assertions, un calcul automatique de la note obtenue. Dans ce cas, le mieux est de définir la fonction interro avec pour argument le nom de l’élève. Quelque chose comme

def interro(eleve):
    assert(f(1)==1)
    note(eleve)=5
    assert(f(2)==3)
    note(eleve)=10
    assert(f(3)==6)
    note(eleve)=15
    assert(f(4)==10)
    note(eleve)=20

L’élève Vincent devra alors, après avoir entré sa fonction, tester avec

interro(Vincent)

Contre-exemple

Si un élève tente une interpolation affine, et se rend compte que la fonction 2x-1 coïncide avec la somme des premiers entiers pour n=1 ou n=2 :

  • en effet 2×1-1=2-1=1 ;
  • et 2×2-1=4-1=3...

Alors il va écrire une fonction comme

def f(x):
    return 2*x-1

Qui aura l’air correcte pour x=1 et x=2 mais le test échoue :

Lumineux non ? Avec un minimum de connaissance de la langue anglaise, on voit que l’algorithme n’est pas bon parce que l’image de 3 n’est pas égale à 6. En effet 2×3-1=6-1=5 et pas 6...

Exemples

En fait, c’est tellement facile de faire des interros avec cet outil de test, qu’on a vite peur du faux positif (un test qui échoue alors que l’algorithme est correct). Mais plusieurs algorithmes différents donnent un test réussi (qu’on aperçoit au fait qu’il n’y a pas de message d’erreur). Par exemple avec une sommation par boucle :

Ou la version raccourcie avec itérateur (peut-on encore parler d’algorithme ici ?) :

Et même avec un polynôme d’interpolation, avec des valeurs approchées réelles (donc a priori pas égales aux entiers voulus) le test réussit :

Triche

Si un élève a accès au source de l’interro(), il peut écrire une fonction ad hoc qui ne passe victorieusement que la batterie de tests préétablie. Mais l’écriture de cet algorithme (une fonction définie par intervalles par exemple) devient vite fastidieuse et le tricheur finira même par mériter sa note !

Par contre, si le test est caché aux élèves, on peut le rendre aléatoire. Avec des choses comme

for n in range(6):
    t=randrange(100)
    assert(f(t)==t*(t+1)/2)

Barème

On peut faire quelque chose comme ceci : 6 assertions dans le test (précautionneusement choisies) comptant 4 points chacune, ce qui fait un total de 24 points ; auxquels on enlève 2 points par ligne de programme, le total étant tronqué à 20 pour ceux qui auraient réussi à écrire un programme d’une seule ligne...

Les assertions sur la position (coordonnées et orientation) de la tortue permettent aussi de faire des exerciciels d’algorithmique dans un cadre graphique avec le module turtle()...

Il est également possible de transformer les interros en expériences aléatoires, et de mutualiser les résultats des élèves, pour amener à la statistique inférentielle (compter par exemple le pourcentage de tests réussis si ces tests sont basés sur un intervalle de confiance, et ainsi évaluer expérimentalement le degré de confiance de cet intervalle).

Conclusion : Ça sert, cet assert !


Commentaires

Annonces

Prochains rendez-vous de l’IREM

Séminaire EDIM-IREM

- Mercredi 8 février 2017, 14h-18h, campus du Tampon, amphi 120 B
- Mercredi 8 mars 2017, 14h-18h, PTU, Saint-Denis, salle S23.6
- Mercredi 12 avril 2017, 14h-18h, campus du Tampon
- Mercredi 3 mai 2017, 14h-18h, PTU, Saint-Denis, salle S23.6
- Mardi 13 juin 2017, 14h-18h, campus du Tampon
- Mercredi 14 juin 2017, 14h-18h, PTU, Saint-Denis, salle S23.6

Semaine des mathématiques

Du 23 mars au 4 avril 2017 dans l’académie de la Réunion.


Brèves

Travailler à plusieurs

lundi 19 décembre 2016

Les enseignements d’exploration au lycée imposent aux enseignants de travailler ensemble. Chantal Tuffery-Rochdi a analysé dans sa thèse les pratiques des enseignants de MPS (méthodes et pratiques scientifiques). Elle répond aux questions des Cahiers pédagogiques.

Un document sur Eduscol

mardi 19 mai 2015

Un document clarifiant bien la façon dont les mêmes concepts vivent en mathématiques et dans les sciences « exactes » les utilisant, publié par Eduscol en octobre 2014. Citons-les :
« Le document proposé ci-dessous s’adresse aux professeurs de mathématiques, physique-chimie et sciences de l’ingénieur intervenant dans le segment [Bac-3 ; Bac+3]. Il vise à les informer des différences de présentation et d’interprétation qui sont faites de certains concepts mathématiques dans les autres disciplines. Ces éclaircissements peuvent contribuer à harmoniser et à clarifier l’utilisation de ces notions auprès des élèves. »

Les métiers des mathématiques et de l’informatique

dimanche 22 mars 2015

Une brochure de l’ONISEP réalisée à l’initiative des cinq sociétés savantes, Femmes & Mathématiques, Société informatique de France, Société française de statistique, Société de mathématiques appliquées et industrielles, Société mathématique de France, représentant l’ensemble de la communauté française d’informatique et de mathématiques.

Histoire de la comptabilité

vendredi 28 décembre 2012

Sur ce site (en anglais) dédié à la comptabilité, on trouve des informations intéressantes sur l’histoire et les pratiques de ce domaine, qui peuvent être utiles aux professeurs enseignant des mathématiques financières (et aussi aux autres...).

La CGE et la réforme des lycées

lundi 16 janvier 2012

La Conférence des Grandes Écoles publie 19 préconisations pour la réforme du lycée.

Sur le Web : Les 19 préconisations

Pratique des mathématiques en série STD2A

lundi 16 janvier 2012

Le site de l’IGEN offre des recommandations et des ressources pour enseigner les mathématiques en série STD2A. Les thèmes abordés (couleurs et nuances de gris, arcs et architecture, jeux vidéos, photo et tableur, perspectives parallèles...) sont de nature à donner aussi des idées d’activités aux enseignants des autres séries !

En cheminant avec Kakeya

lundi 16 janvier 2012

Un livre (à télécharger) de Vincent Borelli et Jean-Luc Rullière qui présente le calcul intégral et la dérivation en s’appuyant sur la question de Kakeya. Pour les lycéens, les étudiants et tous les esprits curieux qui souhaitent voir les mathématiques sous un jour différent.

Sur le Web : Livre à télécharger

Bicentenaire Galois

lundi 12 septembre 2011

À l’occasion du bicentenaire de la naissance d’Évariste Galois (1811-2011), l’Institut Henri Poincaré et la Société mathématique de France organisent un ensemble de manifestations et proposent un site contenant diverses ressources documentaires susceptibles d’intéresser les enseignants.

Statistiques

Dernière mise à jour

jeudi 23 février 2017

Publication

732 Articles
Aucun album photo
125 Brèves
11 Sites Web
126 Auteurs

Visites

906 aujourd'hui
1162 hier
1929011 depuis le début
36 visiteurs actuellement connectés