Cours Composant 5. Test Logiciel

Transcription

Cours Composant 5. Test Logiciel
Introduction
Le test logiciel
Utilisation de JUnit
Conclusion
UPMC Paris Universitas Master Informatique STL
Cours Composant
5. Test Logiciel
Hakim Belhaouari
UPMC Paris Universitas
3 mai 2010
Hakim Belhaouari
Cours Composant
5. Test Logiciel
Introduction
Le test logiciel
Utilisation de JUnit
Contexte
Conclusion
Les bugs logiciel (I)
Un bug coûte très cher :
Télécommunication
Panne pendant 24H du réseau téléphonique de Bouygues Telecom
le 17 novembre 2005.
Evalué à 8 millions d'euros.
Ariane 5 en 1996
le vol inaugural raté en raison d'un dépassement des capacité dans
les appareils d'avionique importé d'Ariane 4.
Le bug le plus cher de l'histoire : environ 3 milliards de francs (≈
457 millions d'euro).
Hakim Belhaouari
Cours Composant
5. Test Logiciel
Introduction
Le test logiciel
Utilisation de JUnit
Contexte
Conclusion
Les bugs logiciel (I)
Un bug coûte très cher :
Télécommunication
Panne pendant 24H du réseau téléphonique de Bouygues Telecom
le 17 novembre 2005.
Evalué à 8 millions d'euros.
Ariane 5 en 1996
le vol inaugural raté en raison d'un dépassement des capacité dans
les appareils d'avionique importé d'Ariane 4.
Le bug le plus cher de l'histoire : environ 3 milliards de francs (≈
457 millions d'euro).
il faut donc s'assurer de la qualité des logiciels.
Hakim Belhaouari
Cours Composant
5. Test Logiciel
Introduction
Le test logiciel
Utilisation de JUnit
Contexte
Conclusion
Les bugs logiciel (II)
Méthodes de Validation et Vérication (V & V) :
Vérication : est-ce que le logiciel fonctionne correctement ?
Validation : est-ce que le logiciel réalise les fonctions
attendues ?
Concrètement :
Test statique : relecture du code, spécication, etc.
Test dynamique : exécuter le code pour s'assurer d'un
fonctionnement correct
Vérication symbolique : vérication à l'exécution, exécution
symbolique, . . .
Vérication formelle : preuve ou model-checking d'un modèle
formel.
Hakim Belhaouari
Cours Composant
5. Test Logiciel
Introduction
Le test logiciel
Utilisation de JUnit
Conclusion
Familles de tests
Types de test
Test fonctionnel
Le test structurel
Le test logiciel
Le test logiciel est la méthode la plus populaire pour vérier un
logiciel. Cette méthode représente environ 40-60% du prix nal.
Denition
Le test est l'exécution ou l'évaluation d'un système ou d'un
composant par des moyens automatiques ou manuels, pour vérier
qu'il répond à ses spécications ou identier les diérences entre les
résultats attendus et les résultats obtenus IEEE
Denition
Tester, c'est exécuter le programme dans l'intention d'y trouver
des anomalies ou des défauts G. Myers
Hakim Belhaouari
Cours Composant
5. Test Logiciel
Introduction
Le test logiciel
Utilisation de JUnit
Conclusion
Familles de tests
Types de test
Test fonctionnel
Le test structurel
En bref
Ce que le test est :
exécuter le programme
connaître les résultats attendus (notion d'oracle)
on échoue lorsqu'on ne trouve aucune erreur
Ce que le test n'est pas :
ne donne pas d'explication d'une erreur
ce n'est pas une validation (pas d'erreur détecter ne signie
pas que le programme soit correct)
Hakim Belhaouari
Cours Composant
5. Test Logiciel
Introduction
Le test logiciel
Utilisation de JUnit
Conclusion
Familles de tests
Types de test
Test fonctionnel
Le test structurel
Exemple de spécication
Le test est activité complexe :
Spécication : PGCD
Le calcul du PGCD de deux nombres entiers (x et y ) consiste à
determiner le plus grand commun diviseur (z ). Ce nombre vérie
l'existence de deux entiers (k et l ) tels que :
k.x + l.y = z
Hakim Belhaouari
Cours Composant
5. Test Logiciel
Introduction
Le test logiciel
Utilisation de JUnit
Conclusion
Familles de tests
Types de test
Test fonctionnel
Le test structurel
Familles de tests
Les familles de tests sont utilisées simultanément dans l'industrie,
car elles sont complémentaires :
1
Test structurel (boîte de verre) : les données de tests sont
produites après une analyse de code (elle est soumise à
diérent critère de test)
=⇒
2
détectent principalement les erreurs commises.
Test fonctionnel(boîte noire) : test de conformité par rapport à
la spécication.
=⇒
détectent principalement les erreurs d'omission et de
spécication.
Hakim Belhaouari
Cours Composant
5. Test Logiciel
Introduction
Le test logiciel
Utilisation de JUnit
Conclusion
Familles de tests
Types de test
Test fonctionnel
Le test structurel
Complémentarité des familles de test (I)
Les approches structurelles trouvent plus facilement les erreurs
commises
Les approches fonctionnelles trouvent plus facilement les
erreurs d'omission et de spécication
Exemple
Spec : retourne la somme de deux entiers modulo 20000
Code :
int somme(int x, int y) {
if (x==600 && y==500)
return x-y ;
else
return x+y ;
}
Hakim Belhaouari
Cours Composant
5. Test Logiciel
Introduction
Le test logiciel
Utilisation de JUnit
Conclusion
Familles de tests
Types de test
Test fonctionnel
Le test structurel
Complémentarité des familles de test (II)
Exemple
Spec : retourne la somme de deux entiers modulo 20000
Code :
int somme(int x, int y) {
if (x==600 && y==500)
return x-y ; // Bug 1
else
return x+y ; // Bug 2
}
Le Bug 1 est trouvé très facilement par le test structurel.
Le Bug 2 est trouvé plus facilement par le test fonctionnel.
Hakim Belhaouari
Cours Composant
5. Test Logiciel
Introduction
Le test logiciel
Utilisation de JUnit
Conclusion
Familles de tests
Types de test
Test fonctionnel
Le test structurel
Types de test
Désigne les caractéristiques de ce qu'on veut tester et le test dans
le cycle de développement :
Tests unitaires : test les procédures, interfaces, . . .
Tests d'intégration : test la composition des interfaces, . . .
Test de conformité : validation de l'adéquation aux
spécications
Test nominal : test le bon fonctionnement sur des données
valide (test to pass).
Test de robustesse : test avec des données invalide (test to
fail).
...
Hakim Belhaouari
Cours Composant
5. Test Logiciel
Introduction
Le test logiciel
Utilisation de JUnit
Conclusion
Familles de tests
Types de test
Test fonctionnel
Le test structurel
Test fonctionnel
Denition
Le test fonctionnel vise à examiner le comportement fonctionnel et
sa conformité avec la spécication du logiciel.
Méthode utilisées :
Test aléatoire
Analyse partitionnelle des domaines des données d'entrée
Test combinatoire (pairwise)
Hakim Belhaouari
Cours Composant
5. Test Logiciel
Introduction
Le test logiciel
Utilisation de JUnit
Conclusion
Familles de tests
Types de test
Test fonctionnel
Le test structurel
Test fonctionnel : analyse partitionnelle (I)
Denition
Une classe d'équivalence correspond à un ensemble de données de
tests permettant de tester le même comportement du programme.
Exemple : la classication de triangle
Soit un programme prenant trois entiers positifs et indique si ces
trois nombres représente un triangle (isocèle, scalène, équilatéral)
ou ne peut représenter un triangle.
Forme :
Angle :
isocèle
aigu
scalène
obtus
équilatéral
droit
Hakim Belhaouari
Cas particulier :
non-triangle
Cours Composant
5. Test Logiciel
Introduction
Le test logiciel
Utilisation de JUnit
Conclusion
Familles de tests
Types de test
Test fonctionnel
Le test structurel
Test fonctionnel : analyse partitionnelle (II)
Exercice la racine carrée.
Hakim Belhaouari
Cours Composant
5. Test Logiciel
Introduction
Le test logiciel
Utilisation de JUnit
Conclusion
Familles de tests
Types de test
Test fonctionnel
Le test structurel
Test fonctionnel : analyse partitionnelle (III)
Les caractéristiques du test partitionnel permet de faire diérent
type de test :
test nominal
: choisit une valeur valide de façon aléatoire dans
l'intervalle (ex : 1, 25 , 100, . . . ).
test aux limites
: choisit une valeur limitrophe valide du
32
domaine (ex : 0, 2
test hors-limite
− 1).
: choisit une valeur invalide du domaine pour
montrer un contre-exemple (ex : -2
Hakim Belhaouari
32 ,-1).
Cours Composant
5. Test Logiciel
Introduction
Le test logiciel
Utilisation de JUnit
Conclusion
Familles de tests
Types de test
Test fonctionnel
Le test structurel
Test fonctionnel : test combinatoire (I)
Denition
Le test combinatoire consiste à tester toutes les combinaisons
possibles des valeurs en entrées.
Exemple
Considérons une fonction dont la signature est la suivante :
void foo(int a, boolean b).
2
32
∗ 2 = 233 ≈ 8.6milliards
=⇒
explosion combinatoire des tests possibles
Hakim Belhaouari
Cours Composant
5. Test Logiciel
Introduction
Le test logiciel
Utilisation de JUnit
Conclusion
Familles de tests
Types de test
Test fonctionnel
Le test structurel
Test fonctionnel : approche Pairwise
But
Réduire l'inconvénient du test combinatoire en sélectionnant un
sous-ensemble de valeurs possibles.
La technique du pairwise prend les combinaisons de 2 variables.
Exemple : 3 variables booléennes
Cas de test
A
B
C
1
false
false
false
2
false
true
true
3
true
false
true
4
true
true
false
Hakim Belhaouari
Ici, réduction de 40%. MAIS :
pas aisé à la main
parfois redondance (4 var.
bool.)
extensible 3-ways, . . .
Cours Composant
5. Test Logiciel
Introduction
Le test logiciel
Utilisation de JUnit
Conclusion
Familles de tests
Types de test
Test fonctionnel
Le test structurel
Le test structurel (I)
Denition
Examine la structure du programme en testant des portions de
programme. Un graphe de ot est utilisé pour extraire les chemins
d'exécution possibles.
Exemple :
Code concrétisant la spécication
du PGCD.
int pgcd(int m,int n) {
int a = m ;
int b = n ;
if (a <= 0 || b <= 0) return 1 ;
while(a 6= b) {
if (a > b)
a = a - b;
else
}
}
Hakim Belhaouari
b = b - a;
return a ;
Cours Composant
5. Test Logiciel
Introduction
Le test logiciel
Utilisation de JUnit
Conclusion
Familles de tests
Types de test
Test fonctionnel
Le test structurel
Le test structurel (II)
Denition (Graphe de ot de contrôle)
La transformation du code en boîte repose sur un graphe
représentant la suite des représentations.
Une boîte rectangulaire pour une expression
Un losange pour marquer un point de choix
une boule pour une instruction abstraite
Hakim Belhaouari
Cours Composant
5. Test Logiciel
Introduction
Le test logiciel
Utilisation de JUnit
Conclusion
Familles de tests
Types de test
Test fonctionnel
Le test structurel
Le test structurel (II)
2,3
1
2
3
4
5
6
7
8
9
10
11
12
: int pgcd(int m,int n) {
:
int a = m ;
:
int b = n ;
:
if (a <= 0 || b <= 0)
:
while(a 6= b) {
:
if (a > b)
:
a = a - b;
:
else
:
b = b - a;
:
}
:
return a ;
:}
4
return 1 ;
faux
vrai
5
faux
vrai
6
8
10
11
Hakim Belhaouari
Cours Composant
5. Test Logiciel
Introduction
Le test logiciel
Utilisation de JUnit
Conclusion
Familles de tests
Types de test
Test fonctionnel
Le test structurel
Le test structurel (III)
=⇒
l'analyse du graphe permet d'identier les données de tests en
fonction d'un chemin dans le graphe.
Critère de couverture
tous les sommets
couvre l'intégralité des instructions. Passe
au moins une fois sur chaque arc du graphe.
tous les chemins simples
couvre tous les chemins
d'exécution sans itérer plus d'une fois dans les boucles.
tous les arcs
prend en comptes toutes les décisions du graphe.
Hakim Belhaouari
Cours Composant
5. Test Logiciel
Introduction
Le test logiciel
Utilisation de JUnit
Conclusion
Familles de tests
Types de test
Test fonctionnel
Le test structurel
Le test structurel (IV)
Critère
Chemins
Jeux de test
Forme
des
solu-
tions
tous les sommets
tous les chemins simples
[2,3,4,5,6,4,11]
(2,1)
[2,3,4,5,8,4,11]
(7,14)
[2,3,4,11]
(5,5)
[2,3,4,5,6,4,11]
(2,1)
[2,3,4,5,8,4,11]
(7,14)
tous les chemins
∞
−
tous les arcs
[2,3,4,5,6,4,5,8,4,11]
(39,26)
(2x , x )
(x , 2x )
(
x, x)
(comme précédemm
il y a une innité de
solution
Hakim Belhaouari
Cours Composant
(3x , 2x )
5. Test Logiciel
Introduction
Le test logiciel
JUnit 3
Utilisation de JUnit
JUnit 4
Conclusion
Utilisation de JUnit
Actuellement deux versions sont utilisées :
JUnit 3
=⇒
plus facile à comprendre
JUnit 4
=⇒
plus facile à utiliser
Les deux reposent sur un système d'assertion servant à décrire
l'oracle :
assertTrue(boolean b)
assertFalse(boolean b)
assertEquals(Object o, Object val)
assertNull(Object o),assertNotNull(Object o)
...
Hakim Belhaouari
Cours Composant
5. Test Logiciel
Introduction
Le test logiciel
JUnit 3
Utilisation de JUnit
JUnit 4
Conclusion
JUnit 3 (I)
Conception d'une classe de test :
hérite de junit.framework.TestCase
contient des méthodes de test :
publique et void en type de retour
nom doit commencer par test
pas de paramètre
peut lever une exception
méthode de préambule protected void setUp()
méthode de postambule protected void tearDown()
Hakim Belhaouari
Cours Composant
5. Test Logiciel
Introduction
Le test logiciel
JUnit 3
Utilisation de JUnit
JUnit 4
Conclusion
JUnit 3 (II)
class TestStack extends TestCase {
private Stack stack ;
protected void setUp() {
stack = new Stack() ;
}
public void testEmptySize() {
}
assertTrue(stack.isEmpty()) ;
public void testTwoPush() {
stack.push(new Integer(23)) ;
stack.push(new Integer(22)) ;
assertEquals(stack.pop() , new Integer(22)) ;
assertEquals(stack.pop() , new Integer(23)) ;
}
}
...
Hakim Belhaouari
Cours Composant
5. Test Logiciel
Introduction
Le test logiciel
JUnit 3
Utilisation de JUnit
JUnit 4
Conclusion
JUnit 4
Evolution de JUnit pour Java 5 (et supérieur)
utilisation des annotations
nouvelle architecture :
ne consomme plus le lien d'héritage
importation statique (import static org.junit.Assert.* ;)
utilisation de la réexion API
support des timeout
meilleur gestion des exceptions
Hakim Belhaouari
Cours Composant
5. Test Logiciel
Introduction
Le test logiciel
JUnit 3
Utilisation de JUnit
JUnit 4
Conclusion
JUnit 4 : Annotations
Annotations
@Test
Description
marque la méthode suivante comme une méthode de test.
@Test(expected=Class) : attend exception Class
@Test(timeout=X) : échoue au bout de X ms.
@Before
indique qu'une méthode est un préambule pour chaque
méthode de test
@After
indique qu'une méthode est un postambule pour chaque
méthode de test
@BeforeClass
exécute la méthode marquée une fois au tout début des
tests
@AfterClass
@Ignore
exécute la méthode en toute n des tests
ignore la méthode de test suivante
Hakim Belhaouari
Cours Composant
5. Test Logiciel
Introduction
Le test logiciel
Utilisation de JUnit
Le test pour les ADTs
Généralités
Conclusion
test dans les ADTs
A partir de maintenant il faut tester
obligatoirement
son code.
Un contrat ou ADT doit compter au moins 2 tests :
1
un test hors-limite
2
au moins un test nominal pour chaque observation possible
Hakim Belhaouari
Cours Composant
5. Test Logiciel
Introduction
Le test logiciel
Utilisation de JUnit
Le test pour les ADTs
Généralités
Conclusion
Exemple Test d'un ADT
Service : Tank
Types : double, boolean
Observators :
quantity : [Tank] → double
isEmpty : [Tank] → boolean
Constructor :
init : → [Tank]
Operators :
ll : [Tank] × double → [Tank]
pre ll(T,q) require q >= 0
pump : [Tank] × double → [Tank]
pre pump(T,q) require q >= 0 and quantity(T) >= q
Observations :
[invariants]
def
isEmpty = (quantity(T) == 0)
quantity(T) >= 0
[init]
quantity(init()) = 0
[ll]
quantity(ll(S,q)) = quantity(S) + q
[pump]
Belhaouari
Cours Composant 5. Test Logiciel
quantity(pump(S,q))Hakim
= quantity(S)
- q or
quantity(pump(S,q)) = quantity(S)
Introduction
Le test logiciel
Utilisation de JUnit
Le test pour les ADTs
Généralités
Conclusion
Conclusion
Le test logiciel est une activité obligatoire
L'écriture des tests se fait avant de commencer à implémenter
JUnit ne permet pas d'ordonnancer les tests exécutés
Il serait intéressant d'automatiser certaines activités
Hakim Belhaouari
Cours Composant
5. Test Logiciel
Introduction
Le test logiciel
Utilisation de JUnit
Le test pour les ADTs
Généralités
Conclusion
Fin
Fin
Hakim Belhaouari
Cours Composant
5. Test Logiciel