Documente Academic
Documente Profesional
Documente Cultură
Le test de logiciels
Yves Le Traon
Plan du cours 1
Introduction: importance du test et positionnement dans un contexte de GL
Hirarchisation des tests Etapes de test
Prouver que lalarme est sonne pour tout n? Indcidabilit de certaines proprits
problme de larrt de la machine de Turing...
Recours au test
ici, si machine 32 bits, 2^31 = 10^10 cas de tests 5 lignes de code => 10 milliards de valeurs !
Programming-in-the-Large
Compilateur Systme de commutation X25 Contrle de sous-marin nuclaire Station spatiale
Programming-in-the-Large
Gestion de la complexit due la taille
(diffrence entre le bricoleur et larchitecte) Mthodes bases sur la modularit (SADT, UML) Gestion des ressources (matrielles, humaines) et des synchronisation de tches => multiplication des risques derreur => impossibilit dobtenir des certitudes => se convaincre que, notion de confiance
UT
OBC disoriented
Angle attaque > 20, charges arodynamiques leves Sparation des boosters
500M)
La maintenance : Programming-in-the-Duration Etalement sur 10 ans ou plus dune ligne de produits Age moyen dun systme : 7 ans 26% des systmes ont plus de 10 ans
(Cf. Application banquaire et Cobol)
Problmatique
Problme analyse des besoins
tests
Problmatique
Le cot du test dans le dveloppement
La validation
tests
Problmatique
Pourquoi ?
Cot
Effort
Confiance
Vocabulaire
Testabilit faute erreur Test de Robustesse bogue Fiabilit (Reliability)
dfaillance
Test statique Tolrance aux fautes Squence de test Donnes de test Sret de fonctionnement (Dependability) Jeu de test Cas de test Test statistique
Test de non-rgressio
Problmatique
Objectifs du test
examiner ou excuter un programme dans le but dy trouver des erreurs ventuellement mise lpreuve de :
la robustesse (test hors bornes/domaine) des performances (test en charge) de conformit (protocoles normaliss) de proprits de sret
service
Dcodeur
Couche applicative
90% des fautes tps-rel sont en fait des fautes logicielles classiques dtectes trop tard
Maintenanc
Programme livrable
Intgration
Tests d intgration
Composants unitaires
Tests unitaires
le cycle en V
Niveau unitaire
Unit Level Components
=> implement specified functions how can you trust them ? How using/reusing them safely ?
off-the-shelf
LOCAL_NAME CALL_PROC_CALL E_FEATURE + is_deferred : Boolean = initval INSTRUCTION
BASE_CLASS + is_manifest_string+ path : String : Boolean + is_result : Boolean+ is_deferred : Boolean + is_void : Boolean + is_expanded : Boolean /+ is_generic : Boolean + is_any : Boolean = initval + is_general : Boolean
Intgration
INSTRUCTION
E_RETRY E_CHECK IFTHENELSE ONCE_PROCEDURE ONCE_FUNCTION DEFERRED_FUNCTION DEFERRED_PROCEDURE NATIVE_C NATIVE_SMALL_EIFFEL NATIVE_JVM IFTHEN EXTERNAL_FUNCTION EXTERNAL_PROCEDURE
Integration/Evolution
How integrating them safely ? How optimizing integration?
TYPE
E_DEBUG
E_LOOP
WRITABLE_ATTRIBUTE CST_ATT E_INSPECT WHEN_LISTE_WHEN WHEN_ITEM LOCAL_VAR_LIST ROUTINE REVERSE_ASSIGNMENT EXPRESSION CREATION_CALL PROC_CALL ASSIGNMENT +call +type WHEN_ITEM_1 ATTRIBUTE
A Transition Step
+result_type EXPRESSION CALL_PROC_CALL GLOBALS 1 +writable 1 DECLARATION_GROUP DECLARATION_1 +target 0..* +arguments SMALLEIFFEL LOCAL_NAME ARGUMENT_NAME FEATURE_CLAUSE +list
CALL
+ magic_count : Integer +list TYPE + is_ready : Boolean + load_class() + get_started() +name_list +to_runnable + falling_down() +result_type+ afd _check() +name FEATURE_CLAUSE_LIST +feature_clause_list +base_class_dictionary +base_class +base_class
LOCAL_ARGUMENT CLASS_NAME
+list CLASS_NAME
NAME BASE_CLASS + is_manifest_string+ path : String : Boolean + is_result : Boolean+ is_deferred : Boolean + is_void : Boolean + is_expanded : Boolean /+ is_generic : Boolean + is_any : Boolean = initval + is_general : Boolean +origin_base_class +base_class EXPORT_ITEM RENAME_PAIR FEATURE_NAME_LIST
(from InheritanceClause) InheritanceClause) (from
+creation_clause_list +base_class
+export_list +rename_list +undefine_list +parent_list PARENT_LIST +redefine_list (from InheritanceClause) +select_list PARENT
(from InheritanceClause)
+current_type
+list FORMAL_GENERIC_LIST
TYPE_CHARACTER
Test systme
E_RETRY
System
= a coherent components set
=>implement specified functions => a more elaborated component
ONCE_PROCEDURE ONCE_FUNCTION DEFERRED_FUNCTION DEFERRED_PROCEDURE NATIVE_C NATIVE_SMALL_EIFFEL NATIVE_JVM IFTHEN EXTERNAL_FUNCTION EXTERNAL_PROCEDURE
+then_compound ONCE_ROUTINE FUNCTION PROCEDURE +else_compound COMPOUND E_DEBUG E_LOOP +loop_body +initialize +else_compound +local_vars E_INSPECT +list +list WHEN_LISTE_WHEN WHEN_ITEM LOCAL_VAR_LIST
+routine_body EFFECTIVE_ROUTINE DEFERRED_ROUTINE EXTERNAL_ROUTINENATIVE +native + language_name : String +rescue_compound WRITABLE_ATTRIBUTE CST_ATT
+result_type EXPRESSION CALL_PROC_CALL GLOBALS 1 +writable 1 DECLARATION_GROUP DECLARATION_1 +target 0..* +arguments
FEATURE_CLAUSE +list SMALLEIFFEL + magic_count : Integer +list + is_ready : Boolean +result_type +clients TYPE +clients CLIENT_LIST
+ load_class() + get_started() +name_list +to_runnable + falling_down() +result_type+ afd _check() +name FEATURE_NAME + is_frozen : Boolean LOCAL_ARGUMENT CLASS_NAME +name +base_class_dictionary +base_class +base_class FEATURE_CLAUSE_LIST +feature_clause_list
+list CLASS_NAME
System = Component
NAME BASE_CLASS + is_manifest_string+ path : String : Boolean + is_result : Boolean+ is_deferred : Boolean + is_void : Boolean + is_expanded : Boolean /+ is_generic : Boolean + is_any : Boolean = initval + is_general : Boolean +origin_base_class +base_class EXPORT_ITEM RENAME_PAIR FEATURE_NAME_LIST
(from InheritanceClause) InheritanceClause) (from
+creation_clause_list +base_class
+export_list +rename_list +undefine_list +parent_list PARENT_LIST +redefine_list (from InheritanceClause) +select_list PARENT
(from InheritanceClause)
+current_type
+list FORMAL_GENERIC_LIST
TYPE_CHARACTER
Integration
Evolution
Unit component
System component
A Classical View...
Etapes de test
Gnration Cas de test Excution Programm e Rsultat Oracle Rsultat-Correct ? oui Critre d'arrt non Dfaillanc e
Diagnostic Correction
Etapes de test
Gnration Cas de test Excution Programm e Rsultat Oracle Rsultat-Correct ? oui Critre d'arrt non Dfaillanc e
Diagnostic Correction
Etapes de test
4 Test fonctionnel
a b c d e f
s1 s2
Etapes de test
4 Test fonctionnel ou test structurel
a b c d e f s1 s2
C1 M1 C2
M2 M3
Etapes de test
4 Test fonctionnel ou test structurel
a b c d e f s1 s2
C1 M1 C2
M2 M3
alatoire
Etapes de test
4 Test fonctionnel ou test structurel
a b c d e f s1 s2
C1 M1 C2
M2 M3
Etapes de test
4 Test fonctionnel ( black-box , bote noire)
Indpendant de l implmentation Planifier partir de la spcification fonctionnelle Rutilisables
Dpend de l implmentation
Test structurel
Test fonctionnel
Tests systme
Le test en gnral
Problme : Gnration des cas de test
trouver les donnes efficaces pour rvler les fautes minimiser le nombre des donnes de test
Le test en gnral
Mthodes de gnration des tests :
1) Gnration dterministe
Gnration la main des cas de test et des oracles Deux critres : - couvrir une portion prcise du logiciel (critre stucturel) - couvrir les fonctions du logiciel (critre fonctionnel) Pas de mthode miracle
Avantage ? : ncessitant une forte implication humaine les tests plus efficaces ?
Le test en gnral
Mthodes de gnration des tests :
2) Gnration alatoire des donnes
Performances Seuil_alerte
P (bars)
4.5
Le test en gnral
Mthodes de gnration des tests :
2) Gnration alatoire des donnes
Test par mutation Variantes Test statistique On ne connat pas les donnes d entre Exemples : Le flot d entre est fourni par le client Le flot d entre est obtenu via une antenne etc.
Le test en gnral
2) Gnration guide par les contraintes (analyse symbolique)
Procedure lissage(in: integer; var out :integer) begin if in < Val1 then begin if in > Val2 then out := trt1; out:=trt2; end else out:=trt3;
Val2
Val1
trt2
trt1; trt2;
trt3
Contraintes rapidement trop complexes Uniquement test structurel (on a accs au code)
Le test en gnral
Test alatoire
AT
AT
AT
Le test en gnral
Problmes : excution des tests
environnement de dveloppement propre environnement de test debugger (points d arrt, suivi de l tat des donnes du programme sous test) instrumentation automatique du code/outils d observation (couverture etc.) -> logiscope & Co.
on ne teste que rarement le systme tel quil sera chez le client (partie simule, systmes embarqus, parties non-termines ou Exemple : sous traites ailleurs ) -> environnement de simulation ARIANE V (potentiellement bogu)
Le test en gnral
Problmes : oracle (ou verdict)
Oracle : expression boolenne caractrisant la dtection d une erreur Gnralement = (resultat_attendu = rsultat_obtenu) Ou bien : leve d une exception
Exemple : gnration alatoire des donnes de test
Systme
Rsultat correct
Too late!
$
Faute de conception
Conception
Impl.
Tests unit.
Tests int.
Test statique
Techniques de test statique
Dfinition : ne requiert pas l excution du logiciel soustest sur des donnes relles
Test statique
Prparation: Distribution des documents quelques jours avant la
sance (code, spec, ventuellement cas de test prvus)
Test statique
Efficacit : plus de 50 % de l ensemble des fautes d un projet sont dtectes lors des inspections si il y en a (en moyenne plus de 75%)
Dfaut : mise en place lourde, ncessit de lien transversaux entre quipes, risques de tensiontche plutt fastidieuse
Test statique
Rgles
tre mthodique (cf. transparents suivants) un critre : le programme peut-il tre repris par quelquun qui ne la pas fait un second critre : les algorithmes/larchitecture de contrle apparat-elle clairement ? > dcortiquer chaque algo et noter toute redondance curieuse (coller) et toute discontinuit lorsquil y a symtrie (ce qui peut rvler une modif incomplte du programme)
Test statique
Exemple: vrification de la clart (procdural) R1 :Dtermination des paramtres globaux et de leur impact sur les fonctions propres
program recherche_tricho; uses crt; const max_elt = 50; choix1 = 1; choix2 = 2; fin = 3; type Tliste = array[1..max_elt] of integer; var liste : Tliste; taille, choix, val : integer; complex : integer;
Test statique
Exemple: vrification de la clart R2 : Existence dun entte clair pour chaque fonction
{-------------------------------------------------------------------------Recherche recursive d'une valeur dans une liste triee --------------------------------------------------------------------------}
{ parametres d'entree : liste L la valeur recherchee manque indice gauche e nom de la fonction indice droit dpendance avec resultat : complexite de la recherche } utres
Interface Spcifie
?
ariables/fonctions
Interface implante
Test statique
Quzako ?
begin affiche(L, g, d); Action non spcifie if g<d then begin pt :=g+(d-g) div 3; if val > L[pt] Rptition ? then begin dt := (pt+1+d) div 2; if val > L[pt] then rech_rec:=2+rech_rec(L, val, dt+1, d) else rech_rec:=2+rech_rec(L, val, pt+1, dt) end else rech_rec:=1+rech_rec(L, val, g, pt) end else rech_rec:=0 end; { rech_rec }
Test statique
Autre mthodes :
revues, mtriques (contraintes etc.), analyse d anomalies (du graphe de contrle/de donnes), rgles (de bon sens!) identificateurs clairs, dcoupage fonctionnel naturel limiter les effets de bords (interfaces, variables globales) preuves d algorithmes, excution symbolique, simulation de modles, etc.
F=P ?
Test dynamique
DEUX REGLES :
Conserver les tests dj crits Conserver les rponses correctes correspondantes
Test dynamique
Exemple simplissime: exe < fichier_testi quand correct : exe < fichier_testi > res_testi Lorsque intgration : Driver de test existe dj Lorsque volution : Tests de non-rgression newexe < fichier_testi > res_test_newexe diff res_test_newexe
Cest plus simple en OO (classes autotestables)
si C alors I1 sinon I2
I1
I2
Sommets :
blocs lmentaires du programme, ou prdicats des conditionnelles /boucles, ou nuds de jonction vide associ un noeud prdicat Bloc lmentaire : squence maximale dinstructions squentielles
Arcs :
enchanement dexcution possibles entre deux sommets
p<>q
Tous les noeuds: (E, B1, P1, P2, B2, P1, B4, S) (E, B1, P1, P2, B3, P1, B4, S) Tous les arcs : idem Tous les chemins lmentaires (1-chemin) : idem + (E, B1, P1, B4, S) Tous les 2-chemins : idem + (E, B1, P1, P2, B2, P1, P2, B2, P1, B4, S (E, B1, P1, P2, B2, P1, P2, B3, P1, B4, S) (E, B1, P1, P2, B3, P1, P2, B2, P1, B4, S (E, B1, P1, P2, B3, P1, P2, B3, P1, B4, S)
Aspects donnes
Graphe de contrle dcor dinformations sur les donnes (variables) du programme. Sommets :idem GC
une dfinition (= affectation) dune variable v est note def(v) une utilisation dune variable est v note P_use(v) dans un prdicat et C_use(v) dans un calcul.
Exemple
pgcd: integer is local p,q : integer; do B1- Def(p), Def(q) read(p, q) while p<> q do P1 - Puse(p), Puse(q)
P1 p=q
p<>
if p > q P2- Puse(p), Puse(q) then p := p-q B2- Def(p), Cuse(q), Cuse(p) else q:= q-p B3 - Def(q), Cuse(p),Cuse(q) end -- if B4 end -- while Cuse(p) result:=p B4- Cuse(p), end-- pgcd S
B3
Cuse(p)
Utilisation 2.
Nombre cyclomatique
Nombre de chemins pour couvrir la structure de contrle Nombre total des chemins de contrle effort de mise en uvre dune technique de test structurel
Npath
Saisir_direction
piloter
traiter_probleme
...
...
Traitement_reconfiguration
Traitement_urgenc
...
...
Le test dintgration
But : vrifier les interactions entre composants (se base sur
larchitecture de la conception)
Le test dintgration
Stratgies possibles (si architecture sans cycles)
big-bang : tout est test ensemble. Peu recommand ! top-down : de haut en bas. Peu courant. Ecriture uniquement de drivers de tests. bottom-up : la plus classique. On intgre depuis les feuilles.
Le test dintgration
3 stratgies: bottom-up, Top-down, Big-Bang.
D D S T
Driver Stub Composant test Composant sous test Interface sous test Interface teste
Le test dintgration
Bottom-up
D D D T T
Le test dintgration
D D D D T T T
T T T
T T
T T T
T T
T T
T T
Le test dintgration
D
T T T T
T T T
T T
T T
Le test dintgration
Top-Down D T S S S S D
Le test dintgration
D T
Le test dintgration
D T T T T T T T T D
S S
S S S
T S
Le test dintgration
D T T T T T T T T T T D
T T
T T
T T
T T
T T
Le test dintgration
intgration Big-Bang intgration Top-down intgration bottom-up intgration backbone intgration par domaines de collaboration