Tests unitaires

  • 4 min de lecture
  • Étiquettes: 
  • TP
  • L3
  • UCA
  • Isima
  • Test

[TP 3/4] - Génie Logiciel L3

Dans ce TP, on se propose d’expĂ©rimenter l’utilisation des tests unitaires en Java. Pour cela, on va rĂ©aliser une classe permettant de gĂ©rer des chiffres romains.

Rappel sur les chiffres romains

Dans la numérotation romaine, il y a sept symboles combinés de différentes maniÚres pour composer les nombres :

  • I = 1
  • V = 5
  • X = 10
  • L = 50
  • C = 100
  • D = 500
  • M = 1000

La construction des nombres plus complexes suit les rĂšgles suivantes :

  • Les symboles sont additifs : I vaut 1, II vaut 2, VI vaut 6 (5 + 1), etc
  • Les symboles des multiples (I, X, C et M) peuvent ĂȘtre rĂ©pĂ©tĂ©s jusqu’à trois fois. À partir de quatre, il faut soustraire du symbole suivant. Ainsi, 4 est reprĂ©sentĂ© par IV, 40 s’écrit XL, etc.
  • De mĂȘme, si 8 est VIII, 9 est IX.
  • Les symboles des “5” ne peuvent jamais ĂȘtre rĂ©pĂ©tĂ©s.
  • Les chiffres romains s’écrivent du plus grand vers le plus petit et se lisent de gauche Ă  droite. L’ordre compte : DC est 600, mais CD est 400.

Les propriĂ©tĂ©s suivantes devront ĂȘtre respectĂ©es :

  • Il n’existe qu’une seule maniĂšre de reprĂ©senter un nombre en chiffres romains
  • RĂ©ciproquement, un nombre romain valide reprĂ©sente un seul nombre dĂ©cimal
  • Seuls les nombres entiers compris entre 1 et 3999 inclus peuvent ĂȘtre reprĂ©sentĂ©s avec ce systĂšme

Module de conversion

Les algorithmes de conversion sont assez simples et sont donnés ci-dessous.

Conversion d’un chiffre arabe vers un chiffre romain :

DONNÉES : table des symboles (symbole, nombre) connus
ENTRÉES : nombre entier inclus dans l'intervalle [1;3999] n
RÉSULTAT : chiffre romain
DÉBUT :
  rĂ©sultat ← ""
  POUR CHAQUE couple(symbole, nombre) de la table des symboles, FAIRE :
     TANT QUE n ≄ nombre, FAIRE :
        rĂ©sultat ← rĂ©sultat + symbole
        n ← n - nombre
  RETOURNER : résultat
FIN

Conversion d’un chiffre romain vers un chiffre arabe :

DONNÉES : table des symboles (symbole, nombre) connus
ENTRÉES : chiffre romain s
RÉSULTAT : nombre entier en dĂ©cimal
DÉBUT :
  rĂ©sultat ← 0;
  index ← 0;
  POUR CHAQUE couple (symbole, nombre) de la table des symboles, FAIRE :
    TANT QUE SousChaine(s, index, index + Longueur(symbole)) = symbole,
    FAIRE :
      rĂ©sultat ← rĂ©sultat + nombre
      index ← index + Longueur(symbole)
    RETOURNER : résultat
FIN

Pour débuter, clonez le projet de départ :

git clone https://framagit.org/uca/genie-logiciel-l3/helper-tp3.git

Pour simplifier la conversion, les combinaisons soustractives ont Ă©tĂ© ajoutĂ©es Ă  la table des symboles. De plus, l’expression rĂ©guliĂšre de validation des chiffres romains vous est donnĂ©e.

Tests unitaires et TDD

Principe des tests unitaires

Les tests unitaires ont pour but de tester les fonctions (ou mĂ©thodes) Ă  un niveau Ă©lĂ©mentaire, avec une approche “boĂźte noire”, c’est-Ă -dire que l’on ne connaĂźt que la signature de la fonction Ă  tester. On teste donc des unitĂ©s fonctionnelles indĂ©pendantes d’un programme plus global.

Il existe des frameworks de test unitaire pour la plupart des langages de programmation, souvent inspiré de SUnit, le framework pour Smalltalk.

Les mĂ©thodes de test ne testent qu’un aspect particulier du cas, correspondant Ă  une spĂ©cification particuliĂšre, et lĂšvent une exception si le rĂ©sultat n’est pas celui attendu. Cette verification se fait par l’intermĂ©diaire de mĂ©thodes spĂ©cifiques (assertEquals, assertRaises, etc.). LĂ  aussi, il existe de nombreuses bibliothĂšques d’assertion.

Mise en oeuvre

Nous allons suivre les principes du dĂ©veloppement guidĂ© par les tests, ou TDD (Test Driven Development). Cela signifie que nous allons Ă©crire les tests avant d’écrire le code. C’est un principe mis en Ɠuvre dans les mĂ©thodes agiles.

Les tests Ă  effectuer sont (au moins) les suivants :

  • Tests de rĂ©ussite :
    • Donner les bonnes valeurs dĂ©cimales pour des valeurs romaines connues ;
    • Donner les bonnes valeurs romaines pour des valeurs dĂ©cimales connues ;
  • Tests d’échec :
    • Échouer pour les valeurs nĂ©gatives ;
    • Échouer pour des valeurs hors de l’intervalle [1;3999] ;
    • Échouer pour des valeurs avec trop de rĂ©pĂ©titions de symboles ;
    • Échouer pour des valeurs avec des rĂ©pĂ©titions de paires ;
    • Échouer pour des valeurs avec des antĂ©cĂ©dents incorrects ;
  • Tests de validitĂ© :
    • Pour tout entier n inclus dans l’intervalle [1;3999] :
      fromRoman(toRoman(n)) = n.

Travail

L’idĂ©e est donc d’écrire les tests en premier, et d’implĂ©menter les fonctionnalitĂ©s petit Ă  petit jusqu’à ce que tous les tests passent :

  • ImplĂ©mentez la totalitĂ© des tests unitaires d’aprĂšs les spĂ©cifications fournies ;
  • ImplĂ©mentez les mĂ©thodes toRoman() et fromRoman() jusqu’à ce que tous les tests passent ;
  • ImplĂ©mentez et testez les mĂ©thodes dĂ©finies dans java.lang.Number (toString(), toDouble(), etc.) ;
  • Faites en sorte qu’un chiffre romain soit comparable avec n’importe quel autre nombre (voir l’interface Comparable).

Le modĂšle fournit pour ce TP utilise l’outil Gradle. Le fichier de configuration build.gradle dĂ©finit les tĂąches et les dĂ©pendances du projet.

Pour exécuter les tests, lancez la tùche test de gradle :

./gradlew test

TP Précédent | TP Suivant