TD 1 2 3 Avec Corr .TD 4 Sans Corr
TD 1 2 3 Avec Corr .TD 4 Sans Corr
TD 1 2 3 Avec Corr .TD 4 Sans Corr
Exercice 1 :
1
Erreur : Action humaine produisant un résultat incorrect.
L’erreur est humaine
Défaut : Une imperfection dans un composant ou un système qui peut conduire à ce qu’un
composant ou un système n’exécute pas les fonctions requises, par exemple une instruction ou une
définition de données incorrecte. Un défaut, si rencontré lors de l’exécution, peut causer la
défaillance d’un composant ou d’un système.
Trouver un défaut sans manipuler le système
Anomalie : toute condition qui dévie des attentes basées sur les exigences de spécifications,
documents de conception, documents utilisateurs, standards etc, ou des perceptions ou expériences
de quelqu’un. Les anomalies peuvent être trouvées pendant, mais pas uniquement, les revues, tests,
analyses, compilations ou utilisation des produits logiciels ou de la documentation applicable
[IEEE 1044]. »
Un écart entre le résultat attendu et le résultat obtenu
Exercice 2 :
Elaborer des DT permettant de tester une fonction qui détermine la nature d’un caractère passé
comme paramètre d’entrée.
Correction :
L’un des principes du test logiciel est que le test exhaustif n’est pas possible.
On cherche l’ensemble des données de test T tel que :
Le programme (logiciel) est considéré comme une boîte noire. Nous envisageons de le tester en
vue de mettre en évidence ses erreurs par rapport à sa spécification.
Classes d’équivalences :
Codification ASCII : elle comporte 256 caractères codifiés de 0 à 255 dans cette modification, on
distingue :
2
- Chiffres : ‘0’..’9’
En partant de ces classes d’équivalence, on peut proposer les données de test suivantes :
Jeu de test :
- Classe chiffre
o Cas ordinaire : ‘3 ‘ par exemple
o Cas limites : ‘0’, ‘1’, ‘8’, ‘9’
- Classe lettre minuscule
o Cas ordinaire : ‘k’
o Classification des caractères
- Classe lettre minuscule
o Cas ordinaire : ‘k’
o Cas limites : ‘a’, ‘b’, ‘y’, ‘z’
- Classe lettre majuscules
o Cas ordinaire : ‘M’
o Cas limites : ‘A’, ‘B’, ‘Y’, ‘Z’
- Autre classe : théoriquement un seul représentant fera l’affaire par exemple ‘ ;’
Rq : on a intérêt à décomposer d’avantage la classe d’équivalence autre !
3
UNIVERSISTE DE SFAX Année Universitaire : 2020-2021
Faculté des Sciences de Sfax TD2 : Test logiciel
Exercice 1 :
1. Elaborer des DT permettant de tester le sous-programme qui
détermine si un entier info appartient à un ensemble de valeurs
ordonnés.
2. Tester le sous-programme proposé
3. Automatiser l’oracle de test, en passant par le sous-programme
d’ordre supérieur bsearch de la bibliothèque stdlib.h qui
implémente l’algorithme de recherche dichotomique
Exercice 2 :
1. Elaborer des DT permettant de tester le sous-programme qui permet
de tirer un tableau d’entiers.
2. Tester le sous-programme proposé.
3. Automatiser l’oracle de test, en passant par le sous-programme
d’ordre supérieur qsort de la bibliothèque stdlib.h
1
UNIVERSISTE DE SFAX Année Universitaire : 2020-2021
Faculté des Sciences de Sfax
Correction TD 2 : Test logiciel
Niveau : 2ème Année
Enseignant de Cours : Kais HADDAR
Enseignante de TD : Farah FOURATI
Rappel :
"Les tests de programmes peuvent être utilisés pour montrer la présence de bogues, mais
jamais leur absence !"
} Principe n ° 1: } Les tests montrent la présence de défauts, mais si aucun défaut n'est trouvé,
cela ne prouve pas l'exactitude.
} Principe n ° 2: } Les tests exhaustifs sont impossibles, toutes les combinaisons d'entrées et de
conditions préalables sont impossibles à tester, au lieu de cela, il est important de se concentrer sur
l'analyse des risques et les priorités.
} Principe n ° 3: } Les tests précoces sont importants, testez le plus tôt possible et concentrez-
vous sur les objectifs définis.
} Principe n ° 4: } Regroupement de défauts, une petite section de code peut contenir la plupart
des défauts.
} Principe n ° 5: } Pesticide Paradox, utiliser sans cesse les mêmes cas de test ne mènera jamais
à la découverte de nouveaux défauts - examinez-les régulièrement.
} Principe n ° 6: } Les tests dépendent du contexte, les logiciels critiques pour la sécurité sont
testés différemment d'un site de commerce électronique.
} Principe n ° 7: } Erreur d'absence d'erreurs, si le système ne répond pas aux besoins des
utilisateurs, il n'est pas utile.
Exercice 1 :
1. Elaborer des DT permettant de tester le sous-programme qui détermine si un entier info
appartient à un ensemble de valeurs ordonnés.
2. Tester le sous-programme proposé
3. Automatiser l’oracle de test, en passant par le sous-programme d’ordre supérieur bsearch
de la bibliothèque stdlib.h qui implémente l’algorithme de recherche dichotomique
Correction 1.:
DT :
info Sortie observée
tableau trié Prog (calculée) :
recherche_dichotomique {vrai, faux}
Classes d’équivalences :
- Classe 1 : info appartient au tableau (issue positive)
- Classe 2 : info n’appartient pas au tableau (issue négative)
1
Jeu de test :
- Classe 1 ; issue positive
o Cas ordinaire : DT1={17, {10,15,17,20,24,116}}
o Cas limites :
DT2={10, {10,15,17,20,24,116}}
DT3={15, {10,15,17,20,24,116}}
DT4={24, {10,15,17,20,24,116}}
DT5={116, {10,15,17,20,24,116}}
- Classe 2 ; issue négative
o Cas ordinaire : DT6={18, {10,15,17,20,24,116}}
o Cas limites :
DT7={8, {10,15,17,20,24,116}} info < à la valeur en première position
DT8={12, {10,15,17,20,24,116}} info entre la valeur de 1ere et 2eme position
DT9={200, {10,15,17,20,24,116}} info > à la valeur en dernière position
DT10={40, {10,15,17,20,24,116}} info entre la valeur de dernière et avant
dernière position
Correction 2.:
#include <assert.h> //void assert( int condition );
#include <stdio.h>
int recherche_dichotomique(int info, int a[], unsigned n);
unsigned oracle(int info, int a[], unsigned n, int sa) {
int sc=recherche_dichotomique(info,a,n);
if(sc==sa)
return 1;
else
return 0;
}
int main(){
int a[6]={10,15,17,20,24,116} ;
2
assert(oracle(40, a, 6,0)) ;
//printf("\n**** ok ****\n");
return 1;
}
int recherche_dichotomique(int x, int a[], unsigned n){
int g,d,m;
g = 0;
d = n-1;
do{
m=(g+d)/2;
if (a[m] == x)
return m+1;//position non pas l'indice car erreur avec
l'indice 0! qui va être considéré comme false
else
if(x<a[m])
d=m-1;
else
g=m+1;
}while(g<=d);
return 0;//return -1;
}
Correction 3.:
#include <assert.h> //void assert( int condition );
#include <stdlib.h> /*
void * bsearch( const void * searchedValue, const void * arrayPtr,
size_t elementCount, size_t elementSize,
int (*comparatorFunction)(const void *, const void
*));
*/
#include <stdio.h>
int recherche_dichotomique(int info, int a[], unsigned n);
int comparer (const void * x, const void * y){
if( *(const int*)x < *(const int*)y )
return -1;
else if( *(const int*)x > *(const int*)y )
return 1;
else
return 0;
}
unsigned oracle(int info, int a[], unsigned n) {
int * sa= bsearch(&info,a,n,sizeof(int),comparer);
int sc=recherche_dichotomique(info,a,n);
//printf("\n%p",res);//un pointeur sur l'élément s'il existe sinon
NULL
//printf("\n%d",rd);
if(sa && sc)
return 1;
else
if(!sa && !sc)
return 1;
else
return 0;
}
int main()
{
3
int a[6]={10,15,17,20,24,116} ;
/*
int info=21,n=6;
int * res=bsearch(&info,a,n,sizeof(int),comparer);
printf(res != NULL ? "existe" : "n'existe pas " );
*/
//Classe 1 (issue positive)
//Cas ordinaire
assert(oracle(17, a, 6)) ;
return 1;
}
int recherche_dichotomique(int x, int a[], unsigned n){
int g,d,m;
g = 0;
d = n-1;
do{
m=(g+d)/2;
if (a[m] == x)
return m+1;//position non pas l'indice car erreur avec
l'indice 0! qui va être considéré comme false
else
if(x<a[m])
d=m-1;
else
g=m+1;
}while(g<=d);
return 0;//return -1;
}
Exercice 2 :
1. Elaborer des DT permettant de tester le sous-programme qui permet de tirer un tableau
d’entiers.
2. Tester le sous-programme proposé.
3. Automatiser l’oracle de test, en passant par le sous-programme d’ordre supérieur qsort
de la bibliothèque stdlib.h
4
Correction 1.:
DT :
Tableau Sortie observée (calculée) :
Tableau trié
Prog tri
Correction 2.:
3 Processus de test
DT : Donnée
Implémentation
de test
sous test
Exécution Spécification
La fonction oracle permet de comparer la sortie observée par rapport à la29 sortie
attendue.
#include<assert.h>
void tri(int tab[], unsigned n);
/*
DT1={{3,6,8,10},4}//tableau trié
DT2={{4,3,2,1,0},5}//tableau inversé
DT3={{66,1,2,0,-1,77},6}//ordre quelconque (cas ordinaire )
*/
int oracle(int a[], int b[], unsigned n){
int i=0;
tri(a,n);
while(i<n && a[i]==b[i])
i++;
if(i<n)
return 0;
else
return 1;
}
int main(){
int dt1[]={3,6,8,10},a1[]={3,6,8,10} ;
assert(oracle(dt1,a1,4));
int dt2[]={4,3,2,1,0},a2[]={0,1,2,3,4} ;
5
assert(oracle(dt2,a2,5));
int dt3[]={66,1,2,0,-1,77},a3[]={-1,0,1,2,66,77} ;
assert(oracle(dt3,a3,6));
return 1;
}
void tri(int tab[], unsigned n){//tri insertion
int i,j,tmp;
for (i=1 ; i < n; i++) {
j = i;
while (j > 0 && tab[j-1] > tab[j]) {
tmp = tab[j];
tab[j] = tab[j-1];
tab[j-1] = tmp;
j--;
}
}
}
Correction 3.:
Implémentation
digne de confiance Implémentation
DT : Donnée sous test
de test
Exécution Exécution
6
for(int j=0;j<n;j++)
q[j]=a[j];
tri(a,n);
qsort(q,n,sizeof(int),comparer);
int tab2[]={4,3,2,1,0} ;
assert(oracle(tab2,5));
int tab3[]={66,1,2,0,-1,77};
assert(oracle(tab3,6));
}
void tri(int tab[], unsigned n){//tri insertion
int i,j,tmp;
for (i=1 ; i < n; i++) {
j = i;
j--;
}
}
}
7
UNIVERSISTE DE SFAX Année Universitaire : 2020-2021
Faculté des Sciences de Sfax TD3 : Test logiciel
Exercice 1 :
void p(int x){
if(x<=0)
1. Etablir le graphe de flot de contrôle de ce
x=-x ;
else programme
x=1-x ; 2. Fournir l’expression des chemins. Déduire
if(x==-1) combien existe-t-il de chemins ?
x=1 ;
else
x=x+1 ;
print("%d",x) ;}
Exercice 2 :
int f(int n){
if (n<=0) 1. Etablir le graphe de flot de contrôle de ce
n = 1-n; programme
if (n%2==0)
2. Fournir l’expression des chemins. Déduire
n = n/2;
else combien existe-t-il de chemins pour une CFG?
n = 3*n+1; 3. Donner des DTs pour tous les nœuds
return n;} 4. Donner des DTs pour tous les arcs
5. Donner des DTs pour toutes les PLCS
Exercice 3 :
int f(int* tab, int key){
int i = 0; int res; bool found = false; 1. Etablir le graphe de flot de contrôle de ce
while(!found){ programme
if(tab[i]==key){ 2. Fournir l’expression des chemins. Déduire
found=true; res=i;} combien existe-t-il de chemins pour une CFG?
i = i+1;} 3. Donner des DTs pour tous les nœuds
return res;} 4. Donner des DTs pour tous les arcs
5. Donner des DTs pour toutes les PLCS
1
graphe de flot de contrôle
Correction exercice 1 :
(le
g). a
x<=0 x>0
t un
x := -x x := 1-x
b c
e.
d
x = -1 x ≠ -1
s
x := 1 f x := x+1
e
g
println(x)
β3=[a,c,d,f,g]
β4=[a,c,d,e,g]
La forme algébrique :
abdfg + abdeg + acdfg + acdeg
= a(bdf + bde + cdf + cde)g
= a(b + c)d(e + f)g
è 1.(1+1).1.(1+1).1=4
2
BB – Correction
Exercice exercice
1 2:
n<=0
n=1-n b n>0
n%2==0 c n%2!=0
n=n/2 d e n=3*n+1
f
return n
è 1(1+1)1(1+1)1=4
Question 3 : n=0, n=-1
Notez Bien que, la DT={ n=0} sensibilise le chemin [abcdf], on dit que
[abcdf]est un chemin exécutable, son taux de couverture N1 est
5/6=0.83
Taux de couverture (N1)= nb de nœuds couverts/nb total de nœuds
Question 4 : n=2, n=-2
Notez Bien que, la DT={ n=2} sensibilise le chemin [acdf], son taux de
couverture N2 est 3/7=0.42
Taux de couverture (N2) = nb d’arcs couverts/nb total d’arcs
Question 5 : Une PLCS est une portion linéaire de code suivie d’un
saut, i.e. une séquence d’instructions entre deux branchements
3
PLCS= [a,b,c], [a,c], [c,d,f], [c,e,f]
On cherche à couvrir tous les PLCS, DTs : n=-1, n=1
Question 6 : Chemin indépendant : chemin introduisant un ensemble
nouveau d’instructions ou le traitement d’une nouvelle condition.
Nombre minimal de cas de tests ; Le nombre de chemins indépendants
pour un graphe G est V(G) c’est-à-dire
Nb arcs – Nb nœuds + 2 ou Nb conditions + 1 (if, while, for, case, ...)
DTs pour tous les chemins indépendants n=-1, n=1, n=3
BB – Exercice 2
Correction exercice 3 :
nt key){
a
a
se; found
b f
{
!found
d
c
tab[i]==key
tab[i]
!=key d
Remarque
flot de contrôle : [abf] est un chemin non exécutable ; aucune DT capable de
de ce programme
des chemins sensibiliser ce chemin
ab ( c ( 21 :+L’expression
Question d ) eb )* f des chemins : ab ( c ( 1+d ) eb )* f
74
è 1.1(1(1+1).1.1)N.1 =2N donc L’infini
Question 3 : [1], 1
Question 4 : [2,1], 1
Question 5 : PLCS= [a,b], [b,f] , [b,c,e] , [b,c,d,e,b]
4
UNIVERSISTE DE SFAX Année Universitaire : 2020-2021
Faculté des Sciences de Sfax Test logiciel
Outils utilisés : l’environnement de développement intégré Eclipse, plugin pour les test unitaires
JUnit 5.x et l’outil d’analyse de couverture structurel Emma
Exercice 1 : Ecrivez un ensemble de tests JUnit pour tester une méthode qui permet de faire la
somme de deux entiers.
Exercice 2 : Exécuter cette classe couvrant toutes les méthodes de déclaration d'assert
importantes dans JUnit.
class AssertTest {
@Test
public void testAssert(){
//Variable declaration
String string1=new String("Junit");
String string2="Junit";
String string3="test";
String string4="test";
String string5=null;
int variable1=1;
int variable2=2;
int[] airethematicArrary1 = { 1, 2, 3 };
int[] airethematicArrary2 = { 1, 2, 3 };
//Assert statements
assertEquals(string1,string2);
assertSame(string3, string4);
assertNotSame(string1, string3);
assertNotNull(string1);
assertNull(string5);
assertTrue(variable1<variable2);
assertFalse(variable1>variable2);
assertArrayEquals(airethematicArrary1, airethematicArrary2); }
Exercice 3 : Ecrivez un ensemble de tests JUnit pour tester une méthode qui permet de
rechercher la valeur minimale dans un tableau d’entiers.
Exercice 4 :
1. Ecrire une classe Personne, munir cette classe d’un constructeur, des getters et des setters
et d’une méthode equals.
2. À partir de la spécification de la classe Personne, écrivez un ensemble de tests JUnit pour
cette classe. Pensez à tester aussi bien les cas qui doivent réussir que les cas qui doivent
lever une exception : l’objectif est de couvrir un maximum de cas différents parmi les cas
possibles.