Upload
nguyenhuong
View
222
Download
1
Embed Size (px)
Citation preview
1
1
Tests
Frédéric MOALUniversité d’Orléans
Master M1 MIAGE 2011/2012
Partie 1
Fondamentaux des tests
2
2
Fondamentaux des tests
� Qu’est-ce que le testing ?� Origine et coûts des défauts logiciels� Pour quelle réalité ?� Rôle des tests dans le développement et
la maintenance� Planification, contrôle, exécutions et
critères d'arrêt des tests � Aspects sociologiques du métier de
testeur
Défaillances
Qu’est-ce que le Testing ?
Le Testing est l’ensemble des méthodes, processuset outils permettant de détecter les défaillances d’unlogiciel.
Défauts Fonctionnels
g Une absence de fonction.g Une incohérence d’IHM.g …
Défauts Techniques
g Un défaut de traitement.g Un défaut de communication
inter-composants…
3
Origine des défauts logiciels
� L’être humain à cause� des échéanciers serrés� de la complexité fonctionnelle� de la complexité du code et des infrastructures � des modifications de technologies � de multiples interactions entre les systèmes� ...
� Les conditions d’environnement � radiations� magnétisme� champs électroniques � Pollution� …
Pour quelle réalité ?Un décalage entre injection des défauts et détectio n des défaillances
70%
60%
50%
40%
30%
20%
10%
Conception Fabrication Qualification Exploitation
70%
20%
10%
4%17%
60%
19%
Introduction des défaillances
Détection des défaillances70% des défaillancesproviennent de la conception
ou de l’expression des besoins.
60% des défaillances ne sont détectées qu’à
l’occasion des « tests systèmes » et des « tests d’acceptation utilisateur ».
Source « National Institute of Standards & Technologies »
4
Pour quelle réalité ?Un coût toujours croissant des tests de régression
Coût d’une campagne de tests d’une évolutionFonction de la taille (fonctionnelle et/ou technique) de l’évolution
Soit une évolution de 100 jours développement
100 * 0,3 = 30 jours
Coût de la campagne de tests de régression exhaustifs associéeFonction de la taille du Système d’information
Notre évolution de 100 jours au sein d’un SI pesant 5000 jours
(5000-100) * 0,3 * 0,45 = 661 jours
g Pilotage des tests par les risquesg Industrialisation
Bonification
g Traçabilitég Automatisation
Bonification
Répartition des défauts affectant les projets logic iels
� D’autres études révèlent des problèmes de même nature� 82 % des travaux de correction et de reprise sont liés aux
erreurs de définition des exigences
� Les problèmes de spécification des besoins représentent 44 % des causes d’annulation de projets
� Seulement 54 % des exigences initiales sont effectivement réalisées
� Seulement 45 % des exigences réalisées sont finalement utilisées
5
CMMi : Globally address Cost of Software Quality
Cost as % of Development
0
10
20
30
40
50
60
70
1 2 3 4 5
CMMi Levels
TCoSQ
Lab N. Conf
Field N. Conf.
Testing
Prevention
g CMMi est un cadre permettant d’industrialiser les tests et le QA procedures, dans un cycle de développement logiciel.
g Les stratégies de test doivent prendre en compte TOUS les composants du coût : pre-release and post-release non conformance, appraisal (testing), assurance (quality control), prevention both at development and organization level.
Cos
ts
Quality Level 100%
Failure Costs
Total Quality Costs
Costs forprevention
and detection
Minimum
Source: Juran, 1988
Rôle des tests dans le développement et la maintena nce
Les processus de test représente de 30% à 50% des budgets projet mais lesdéfauts « latents » générant des anomalies critiques coûtent cher
Schedule
Selon un rapport de la firme Coverity, les logiciels propriétaires affichentencore une densité de 20-30 défauts par 1,000 lignes de code (KLOC),
un nombre inchangé depuis les années ’60, malgré le QA. (2004)
Encore aujourd’hui (2003), alors que l’industrialisation de la production logicielle a permisd’améliorer la productivité, 50% des projets ne tiennent pas leurs objectifs de coût et qualité
� S’assurer que le logiciel répond aux
exigences – couverture fonctionnelle
� Maîtriser les risques opérationnels
� Contrôler le coût des mise en production
� Établir la confiance dans le système
� Aider à l’éradication des anomalies
� Construire la qualité – est-elle suffisante?
� Crédibilité, réputation et être fiable
6
Rôle des tests dans le développement, la maintenanc e
� Des tests rigoureux des systèmes et de la documentation� aide à réduire les risques d’occurrence de problèmes dans
l’environnement opérationnel
� contribuent à la qualité des systèmes logiciels
si les défauts découverts sont corrigés avant la livraison du système pour un usage opérationnel.
� Les tests de logiciels peuvent aussi être nécessaire� pour respecter des exigences légales ou contractuelles
� atteindre des normes industrielles spécifiques..
Planification, contrôle, exécution et critères d'ar rêt des tests
� Décider de combien de test est suffisant devrait prendre en compte� le niveau de risque, incluant les aspects
� techniques� commerciaux � projet� humain,
� Les contraintes telles le temps et le budget.
� Les tests doivent fournir suffisamment d’informations� pour que les responsables puissent prendre des décisions informées
concernant la mise en production du logiciel ou du système en cours de tests,
� pour l’étape de développement suivante ou la livraison aux clients.
7
Planification, contrôle, exécution et critères d'ar rêt des tests
� Un nombre de principes de tests ont été suggérés au cours des 40 dernières années et offrent des indications communes à tous les tests :� Principe 1 – Les tests montrent la présence de défauts
� Principe 2 – Les tests exhaustifs sont impossibles
� Principe 3 – Tester tôt
� Principe 4 – Regroupement des défauts
� Principe 5 – Paradoxe du pesticide
� Principe 6 – Les tests dépendent du contexte
� Principe 7 – L’illusion de l’absence d’erreurs
Planification, contrôle, exécution et critères d'ar rêt des tests
� La planification des tests se compose des tâches majeures suivantes:� Déterminer la portée et les risques, et identifier les objectifs des tests.� Déterminer les approches de tests
� techniques, � objets de tests, � couverture, � identification et interfaces avec les équipes concernées par les tests,� outils de tests
� Déterminer les ressources de tests requises� personnel, � environnement de tests et Infrastructures.
� Implémenter la politique de test et/ou la stratégie de tests.� Planifier les tâches d’analyse et de conception des tests.� Planifier l’implémentation, l’exécution et l’évaluation des tests.� Déterminer les critères de sortie des tests.
8
Planification, contrôle, exécution et critères d'ar rêt des tests
� Le contrôle des tests se compose des tâches majeures suivantes:�Mesurer et analyser les résultats�Mesurer et documenter l’avancement, la
couverture des tests et les critères de sortie� Initier des actions correctives�Décider
Planification, contrôle, exécution et critères d'ar rêt des tests
� Evaluer les critères de sortie contient les tâches majeures suivantes:�Vérifier les registres de tests en fonction des
critères de sortie spécifiés dans la planification des tests.
�Evaluer si des tests supplémentaires sont requis ou si les critères de sortie doivent être changés.
�Ecrire un rapport de synthèse des tests pour les responsables.
9
Aspects sociologiques du métier de testeur
� Plusieurs niveaux d’indépendance peuvent être définis avec des tests conçus par :� la (les) personne(s) qui a (ont) écrit le logiciel à
tester (niveau faible d’indépendance).�une (des) autre(s) personne(s) du groupe (p.ex.
de l’équipe de développement).�une (des) personne(s) d’un groupe différent au
sein de la même organisation (p.ex. équipe de test indépendante).
�une (des) personne(s) d’une organisation ou société différente (p.ex. sous-traitance ou certification par un organisme externe).
Aspects sociologiques du métier de testeur
�L’identification de défaillances pendant les tests peut être perçue comme une critique contre le produit et contre son(ses) auteur(s). Les tests sont, de ce fait, souvent vus comme une activité destructrice
�Rechercher des défaillances dans un système requiert de la curiosité, du pessimisme professionnel, un oeil critique, une attention au détail, une bonne communication avec ses pairs en développement, et de l’expérience sur laquelle baser sa recherche d’erreurs
10
Aspects sociologiques du métier de testeur
� Les relations entre le test et le développement nécessitent donc de :�Commencer par une collaboration plutôt que par
des conflits �Rappeler à chacun l’objectif commun de
systèmes de meilleure qualité.�Communiquer les découvertes sur le produit de
façon neutre et factuelle sans critiquer la personne responsable,.
�Essayer de comprendre ce que ressent une autre personne et pourquoi elle réagit comme elle le fait.
�Confirmer que l’autre personne a compris ce que l’on a dit et vice versa.
Partie 2
Tester pendant le cycle de vie logiciel
20
11
��������
2. Tester pendant le cycle de vie logiciel
� Préambule� Tests et modèles en V (ISO/CEI 12207) - Tests et modèles
itératifs� Niveaux de tests
� tests unitaires� tests d’intégration locale� tests système� tests d’acceptation
� Cible des tests� tests fonctionnels, � tests non fonctionnels, � tests de l’architecture logicielle, � tests de non régression
� Tests de maintenance, spécificité et mise en oeuvre
Que fait-on ?• des tests fonctionnels• des tests structurels • des tests de robustesse/performances • des tests d'ordonnancement • des test unitaires • des tests boite noire, boite blanche • des tests aux limites• des tests « métiers »• des tests de réception• des test de non régression• débogage• Tests dynamique, statiques
EXB
CF
CT
Réalisation Tests unitaires
Intégration
Validation
Réception
Préambule : Les questions autour du test
Qui fait les tests ?• MOA• MOE• Développeur• Spécificateur• Client• Fournisseur• Utilisateurs finaux•…
Quels sont les éléments de références ?• Exigences MOA• Cahiers des charges• Dossiers de spécifications fonctionnels• Dossiers de conceptions détaillées• Normes• Règles de l’art (explicites/implicites) • Règles de « bon sens »• Exigences techniques particulières• ...
Quels sont les objectifs de tests ?Quand fait-on les tests ? Doit-on outiller les tests ?
12
��������
2. Tester pendant le cycle de vie logiciel (2h)
� Préambule� Tests et modèles en V (ISO/CEI 12207) - Tests et modèles
itératifs� Niveaux de tests
� tests unitaires� tests d’intégration locale� tests système� tests d’acceptation
� Cible des tests� tests fonctionnels, � tests non fonctionnels, � tests de l’architecture logicielle, � tests de non régression
� Tests de maintenance, spécificité et mise en oeuvre
V&V – Construire la qualité en amont Testing – Optimiser la stratégie et les approches
1. Définir•Audit d’exigence•Traçabilité des exigences de test•Préparer Risk Based Testing•Planifier Stratégie Dynamic Testing
2. Développer•Tests Statiques de code (artefacts)•Tests sous surveillance
3. Tester•Techniques avancées de qualification•Exécuter Risk Based Tests
4. Intégrer & Recetter•Gestion critères de recette•Tests de processus métier•Co-ordination des tests bout-à-bout
MeilleureQualité
Plus grandeFiabilité
MOA
MOE
Tests et cycles en V : Positionnement des activités
13
Stratégie de tests initialeProtocole de réception initial
Dossier des résultats de réception
Dossier des résultats d'intégration
Définition des exigences
Conception fonctionnelle
Conception technique
Tests unitaires
Intégration
Validation
Réalisation
Plan d'intégration
Stratégie de tests finaleProtocole de réception final
Plan de validation et de réception
Plan de tests unitairesDossier des résultats de tests unitaires
Réception
Dossier des résultats de validation
Livraison incrémentale
Construction incrémentale
Stratégie évolutive
PHASE 1Définition
des exigencespilote, système
PHASE 2Développement
de pilote
PHASE 3Mise en servicepilote / système
Stratégie de testsProtocole de réceptionPlan de validation et deréception
Plan de tests TU+TIDossier des résultats TU
Dossiers desrésultats TI + TV+ réception
Tests : Cycles en V et Modèles itératifs
Séquences de test devant être mises en œuvre dans l e cadre d’un
projet
TESTUNITAIRE
TESTD’INTEGRATION
LOCALE
TESTSYSTEME (qualification)
TEST DE RECETTEUTILISATEUR
TEST D’INTEGRATION GLOBALE&
PREPARATION MISE EN PRODUCTION
Ordonnancement des séquences d’exécution(1)
et d’analyse des résultats des tests
(1) Ne présage pas du calendrier de fabrication du patrimoine nécessaire à l’exécution de ces tests
Equipe
de développement
Equipede test
Equipe Utilisateurs
TESTDIRECTORNON PERTINENT
TESTDIRECTOREST UN PLUS
TESTDIRECTOR S’IMPOSEEventuellement transfert, voire partage
du référentiel TestDirector
La déclinaison « test » des spécifications détailléesLa déclinaison « test » de l’architecture du logiciel
La déclinaison « test » des spécifications internes
14
Principes de synchronisation des activités de développement et de qualification
EXECUTIONNON REGRESSION
Itération n-1, n-2, n-x
INTEGRATIONLOCALE
Itération n
PROGRAMMATIONTEST UNITAIRE
Itération n
CONCEPTIONItération n
EXECUTIONDES TESTSItération n
SPECIFICATIONDES TESTSItération n
ELABORATIONPLAN DE TEST
Itération n
ELABORATION PLANDE NON REGRESSION
Itération n-1
AUTOMATISATIONNON REGRESSION
Itération n-1
Temps
Equipe de développement
Equipe de test
SPECIFICATIONItération n+1
��������
2. Tester pendant le cycle de vie logiciel (2h)
� Préambule� Tests et modèles en V (ISO/CEI 12207) - Tests et modèles
itératifs� Niveaux de tests
� tests unitaires� tests d’intégration locale� tests système� tests d’acceptation
� Cible des tests� tests fonctionnels, � tests non fonctionnels, � tests de l’architecture logicielle, � tests de non régression
� Tests de maintenance, spécificité et mise en oeuvre
15
Les Tests Unitaires
� De niveau composants élémentaires� Assure les fondations de construction du logiciel pour
� limiter les écarts par rapport à TOUTES les spécifications techniques et détaillées du composant à tester
� assurer la fiabilité de la phase de codage� s’assurer que chaque composant élémentaire remplis entièrement et
complètement la fonction définie
� dans une certaine mesure, vérifier le respect des normes de développement et de mise en œuvre des composants élémentaires
� Les principaux tests :
� Vérification du format des champs
� Vérification du caractère obligatoire ou facultatif des champs
� Vérification de tous les contrôles croisés entre champs
� Vérification des contrôles effectués sur liste de valeur
� Vérification des valeurs aux limites
� Vérification des règles d’ergonomie
� Vérification que les structures de données sont correctement mises à
jour
� Vérification du fonctionnement structurel des composants un à un
(tests boite blanche)
� …
Les Tests Unitaires
16
Les Tests Unitaires
� Préparer à partir du DCT du composant
� Préciser (Valider) le périmètre de l’objet des tests � Qu’est-ce qui fait partie du composant, qu’est-ce qui n’en fait pas partie
� Identifier les cas de tests et préciser les résultats attendus� Rechercher les règles de gestion� Rechercher les éléments pouvant donner lieu à « bug »
� Identifier les jeux d’essais et données de tests� Données à fournir au composant� Données instanciées en bases
� Définir les pré-requis et outils complémentaires� environnement, � « bouchons », � version des socles techniques, � lanceurs � Moyens d’accès au données avant/après
� Valider la couverture de tests prévus/périmètre à couvrir
Les Tests Unitaires
� Exécuter � Installer dans l’environnement de test
� Le composant à tester� Les pré-requis� Les données nécessaire
� Exécuter scrupuleusement chacun des cas identifiés en préparation� Identifier les résultats OK / NOK� Tracer le déroulement du cas pour être en mesure de :
� Fournir la preuve du test� Rejouer à l’identique un test (non régression)
� Le Test Unitaire n’est à faire qu’une fois le composant complètement codé (*)
� CF exemple JUnit
17
��������
2. Tester pendant le cycle de vie logiciel (2h)
� Préambule� Tests et modèles en V (ISO/CEI 12207) - Tests et modèles
itératifs� Niveaux de tests
� tests unitaires� tests d’intégration locale� tests système� tests d’acceptation
� Cible des tests� tests fonctionnels, � tests non fonctionnels, � tests de l’architecture logicielle, � tests de non régression
� Tests de maintenance, spécificité et mise en oeuvre
Les Tests d’Intégration Locale
� S'assurer du bon fonctionnement lors de l'assemblage � logiciel / logiciel � logiciel / données reprises� logiciel / matériel� logiciel / reste du S.I
� Conforter le découpage effectué en conception
� Construire l’application à partir des composants élémentaires préalablement testés unitairement
18
Les Tests d’Intégration Locale
� Vérifier l’enchaînement correct des composants
� Vérifier les IHM « aux limites » techniques :� Comment réagit l’IHM en cas de saisie de valeurs extrêmes, quelles soient numériques
ou alphanumériques ?
� Vérifier l’intégrité globale des données manipulées et mises à jour dans la base de données� Une donnée saisie par l’utilisateur doit être instanciée correctement en base� Une donnée de la base doit être restituée correctement à l’utilisateur
� Vérifier que les séquences d’arrêt prématuré, volontaire ou involontaire, sont correctement traitées
� Valider les règles d’habilitation (autorisation ou limite d’accès au composant ou à l’un de ses fonctions élémentaires)
Chacun des composants est vu comme une boite noire dont on ne cherche pas à connaître le fonctionnement interne mais le fonctionnement en relation avec les autres composants
Les Tests d’Intégration Locale
� Préparer toujours à partir des DCT� Identifier les points d’interface entre les composants élémentaires
� Zones de communication entre deux composants IHM� Zones de communication entre services IHM et service métier� Echange de fichier� Echange de flux� Interface interne / externe au projet ou à l’application…
� Identifier les règles de dialogue au niveau de chaque interface� Données fournies� Données restituées� Gestions des codes retour� Mode de dialogue synchrone / asynchrone� Traitement de masse / Traitement unitaire� Fonctionnement TP – Batch TP/Batch
� Identifier les versions de comptabilité des composants
� En déduire les cas de test et scénarios
19
Les Tests d’Intégration Locale
� Exécuter� Assembler les composants dans l’environnement ad hoc
� Débouchonner� Mettre en place les composants à tester dans les versions définies� Les prérequis� Les données nécessaire
� Exécuter scrupuleusement chacun des cas identifiés en préparation� Identifier les résultats OK / NOK� Tracer le déroulement du cas pour être en mesure de :
� Fournir la preuve du test� Rejouer à l’identique un test (non régression)
� Les tests d’Intégration Locale peuvent débuter dès que 2 composants ayant une relation entre eux sont testés Unitairement
��������
2. Tester pendant le cycle de vie logiciel (2h)
� Préambule� Tests et modèles en V (ISO/CEI 12207) - Tests et modèles
itératifs� Niveaux de tests
� tests unitaires� tests d’intégration locale� tests système� tests d’acceptation
� Cible des tests� tests fonctionnels, � tests non fonctionnels, � tests de l’architecture logicielle, � tests de non régression
� Tests de maintenance, spécificité et mise en oeuvre
20
Les Tests Système (qualification)
� Il est de type « boite noire » et s’appuie sur une exigence fonctionnelle
� Il vérifie qu’a une sollicitation métier, le ou les résultats obtenus sont bien ceux escomptés, mais aussi que les limites fonctionnelles du logiciel sont gérées� � On prouve que ça marche, que le logiciel tourne selon ses spécifications
� Il vérifie qu’aux « étourderies » de l’utilisateur, des parades efficaces sont actives� Ex : L’utilisateur peut saisir deux fois le même code article sur deux lignes de
commande différentes ; il convient donc d’envisager ce cas de test…� � On prouve la robustesse fonctionnelle du logiciel
� A contrario il n’a pas vocation à vérifier le fonctionnement des objets sur lesquels l’utilisateur n’interagit pas
� Bien sûr, il n’a pas pour but de palier aux insuffisances de tests unitaires et de tests d’intégration locale
��������
2. Tester pendant le cycle de vie logiciel (2h)
� Préambule� Tests et modèles en V (ISO/CEI 12207) - Tests et modèles
itératifs� Niveaux de tests
� tests unitaires� tests d’intégration locale� tests système� tests d’acceptation
� Cible des tests� tests fonctionnels, � tests non fonctionnels, � tests de l’architecture logicielle, � tests de non régression
� Tests de maintenance, spécificité et mise en oeuvre
21
Les Tests d’Acceptation
� S'assurer du bon fonctionnement du logiciel dans son ensemble par rapport aux :�attendus METIER �spécifications fonctionnelles�exigences MOA/utilisateurs
et en condition la plus proche possible de l’opérationnel
��������
2. Tester pendant le cycle de vie logiciel (2h)
� Préambule� Tests et modèles en V (ISO/CEI 12207) - Tests et modèles
itératifs� Niveaux de tests
� tests unitaires� tests d’intégration locale� tests système� tests d’acceptation
� Cible des tests� tests fonctionnels, � tests non fonctionnels, � tests de l’architecture logicielle, � tests de non régression
� Tests de maintenance, spécificité et mise en oeuvre
22
Cible de tests : tests fonctionnels
� Les tests fonctionnels sont axés sur des exigences fonctionnelles
� Une exigence fonctionnelle � décrit un objectif, une finalité du système en fixant clairement les
frontières.� est issue d’un besoin métier qu’elle décompose en un enchaînement
logique d’actions, compréhensibles par l’utilisateur, exploitables par les équipes de conception et de développement mais pouvant également être testées par l’équipe de qualification.
� décline le cas d’utilisation usuel (le besoin est satisfait dans son intégralité sans qu’aucun événement ne soit venu perturber le déroulement du processus).Associé à ce cas d’utilisation « standard » un certain nombre d’autres cas d’utilisation dits « alternatifs » seront documentés avec la même rigueur que le cas d’utilisation usuel ; leurs origines peuvent être :
� métier « produit non disponible en stock » � technique « liaison réseau interrompue »
��������
2. Tester pendant le cycle de vie logiciel (2h)
� Préambule� Tests et modèles en V (ISO/CEI 12207) - Tests et modèles
itératifs� Niveaux de tests
� tests unitaires� tests d’intégration locale� tests système� tests d’acceptation
� Cible des tests� tests fonctionnels, � tests non fonctionnels, � tests de l’architecture logicielle, � tests de non régression
� Tests de maintenance, spécificité et mise en oeuvre
23
Cible de tests : tests non-fonctionnels
� Les tests non-fonctionnels incluent, mais pas uniquement les � tests de performance, � tests de charge,� tests de stress, � tests d’utilisabilité, � tests d’interopérabilité, � tests de maintenabilité, � tests de fiabilité,� les tests de portabilité.
� Ce sont les tests de “comment” le système fonctionne.� Ils peuvent être effectués à tous les niveaux de test. � Le terme de tests non-fonctionnels décrit les tests requis
pour mesurer les caractéristiques des systèmes et logiciels qui peuvent être quantifiés sur une échelle variable, telles que les temps de réponse pour les tests de performances.
��������
2. Tester pendant le cycle de vie logiciel (2h)
� Préambule� Tests et modèles en V (ISO/CEI 12207) - Tests et modèles
itératifs� Niveaux de tests
� tests unitaires� tests d’intégration locale� tests système� tests d’acceptation
� Cible des tests� tests fonctionnels, � tests non fonctionnels, � tests de l’architecture logicielle,� tests de non régression
� Tests de maintenance, spécificité et mise en oeuvre
24
Cible de test : architecture logicielle (tests structurels)
� Les tests structurels (boîte blanche) peuvent être effectués à tous les niveaux de tests. Ils :� sont utilisés de façon optimale après les techniques basées sur les
spécifications, � aident à mesurer l’ampleur des tests via l’évaluation de la couverture
d’un type de structure.
� La couverture � indique à quel point une structure a été exercée par une suite de
tests, � est exprimée en pourcentage des éléments couverts. A tous les
niveaux de tests, mais spécialement dans les tests de composants et les tests d’intégration,
� des outils peuvent être utilisés pour mesurer la couverture
��������
2. Tester pendant le cycle de vie logiciel (2h)
� Préambule� Tests et modèles en V (ISO/CEI 12207) - Tests et modèles
itératifs� Niveaux de tests
� tests unitaires� tests d’intégration locale� tests système� tests d’acceptation
� Cible des tests� tests fonctionnels, � tests non fonctionnels, � tests de l’architecture logicielle, � tests de non régression
� Tests de maintenance, spécificité et mise en oeuvre
25
Cible de tests : les tests de non régression
� Quand un défaut est détecté et corrigé, le logiciel devrait être retesté pour confirmer que le défaut original a été correctement ôté.
� Le test de régression � est la répétition des tests sur un programme déjà testé, après des
modifications, pour mettre à jour tout défaut introduit ou découvert en résultat de ce(s) changement(s).
� sont exécutés quand le logiciel, ou son environnement, est modifié.
Cible de tests : les tests de non régression
� Leur étendue est basée sur le risque de ne pas trouver d’anomalie dans un logiciel fonctionnant auparavant.
� Les tests devraient être répétables pour pouvoir être utilisés pour des tests de régression.
� Les tests de régression� peuvent être exécutés à tous les niveaux de tests, et s’appliquent aux
tests fonctionnels, non-fonctionnels et structurels. � sont exécutées de nombreuses fois � généralement évoluent lentement, � donc sont de bons candidats à l’automatisation.
26
Partie 3
Les techniques de tests
51
3. Techniques de tests
� Techniques statiques et revues de code� Techniques « boites noires »� Techniques « boites blanches »� Impact du choix d’une technique de test
27
Techniques statiques et revues de code
� Objectif : trouver des défauts dans le code source et les modèles logiciels
� N’exécutent pas le logiciel testé. � Elles sont :
�manuelles (revues) �automatisées (analyse statique).
� Trouve des défauts plutôt que des défaillances
� Peut détecter des défauts difficiles à trouver par les tests
Techniques statiques et revues de code
� Revues� Les revues varient de très informelles à très formelles
� Revue informelle� Walkthrough� Revue technique� Inspection
� Facteurs de succès des revues� un objectif prédéfini et clair� des personnes impliquées et adéquates� des défauts trouvés bien acceptés, et exprimés objectivement� des aspects personnels et psychologiques traités � des techniques de revue adaptées
� aux types et au niveau de livrable logiciel,
� aux types et niveau de réviseurs.� des check-lists ou rôles� Des formations sont données sur les techniques de revue, � L’encadrement supporte un bon processus de revue � L’ accent est mis sur l’apprentissage et l’amélioration du processus.
28
Techniques statiques et revues de code
� Les phases d’une revue formelle�Planification�Lancement �Préparation individuelle�Réunion de revue�Correction�Suivi
Techniques statiques et revues de code
� L’analyse statique outillée vérifie le code programme � complexité� flux de contrôle � flux de données, � sorties générées telles que HTML et/ou XML.
� Elle permet � la détection rapide d’erreurs avant l’exécution des tests.� une information avancée sur certains aspects louches du code ou de
la conception, par le calcul de métriques.� la détection de dépendances et d’inconsistances dans les modèles
logiciels tels que de liens.� l’amélioration de la maintenabilité du code et de la conception.� la prévention des défauts, si les leçons sont prises en compte lors du
développement.
29
Techniques statiques et revues de code
� Les défauts typiques découverts par les outils d’analyse statique incluent� Référencement d’une variable avec une valeur indéfinie� Interface inconsistante entre modules et composants� Variables qui ne sont jamais utilisées� Code non accessible (code mort)� Violation des standards de programmation� Vulnérabilités de sécurité� Violation de syntaxe dans le code ou le modèle logiciel.
� Ils sont typiquement utilisés par des développeurs et par les concepteurs
Techniques « boites noires »
Boîte noire =
sans référence à la structure interne du composant ou du logiciel
30
Techniques « boites noires »
� Les techniques de conception de tests �Partitions d’équivalence�Analyse des valeurs limites�Tables de décision�Diagrammes de transition d’états�Cas d’emplois
Techniques « boites blanches »
boîte blanche=
analyse de la structure du composant ou du système
31
Techniques « boites blanches »
� Niveau composant : la structure est celle du code lui-même � instructions, � décisions � branches
� Niveau intégration : la structure peut être un arbre (ou graphe) d’appel c’est à dire un diagramme où des modules appellent d’autres modules.
� Niveau système : la structure peut être � une structure de menus, � des processus métiers (commerciaux, fabrication …)� une structure d’une page web
Techniques « boites blanches
� Test des instructions et couverture � Dans les tests de composants, la couverture des
instructions est l’évaluation du pourcentage d’instructions exécutables qui ont été exercées par une suite de cas de tests.
� Test des décisions et couverture� La couverture des décisions, liées aux tests de
branches, est l’évaluation des pourcentages de résultats de décisions (p.ex. les options Vrai et Faux d’une instruction IF) qui ont été traitées par une suite de cas de tests.
32
Impact du choix d’une technique de test
� Le choix des techniques de tests à utiliser dépend d’un nombre de facteurs, incluant :� le type de système, � les standards réglementaires, � les exigences client ou contractuelles, � le niveau de risque, � Le type de risques, � les objectifs de test, � la documentation disponible, � la connaissance des testeurs, � le temps disponible et le budget, � le cycle de vie de développement utilisé, � l’utilisation de cas d’utilisation� l’expérience sur les défauts découverts précédemment.
� Quelques techniques sont plus applicables que d’autres à certaines situations et niveaux de tests, d’autres sont applicables à tous les niveaux de tests.
Partie 4
Gestion des tests
64
33
4. Gestion des tests
� Tâches du responsable des tests � Tâches des testeurs� Estimation des tests� Planification des tests� Critères de sorties� Suivi et contrôle du déroulement des tests� Gestion de configuration� Gestion des anomalies
Tâches du responsable des tests� Coordonner la stratégie et le plan du test.
� Apporter le point de vue du test aux autres activités du projet.
� Planifier les tests (en considérant le contexte et les risques) � sélection des approches de test,� estimation du temps, de l’effort et des coûts du test,� acquisition des ressources, � définition des niveaux de test, les cycles, l’approche et les objectifs � planification de la gestion d’anomalies.
� Démarrer la spécification, la préparation, l’implémentation et l’exécution des tests
� Surveiller et contrôler l’exécution.
� Adapter le planning en fonction des résultats et de l’avancement du test
34
Tâches du responsable des tests� Entreprendre les actions nécessaires pour résoudre les problèmes
� Mettre en place une gestion de configuration adéquate du logiciel de test à des fins de traçabilité.
� Introduire des mesures appropriées pour mesurer l’avancement du test et évaluer la qualité du test et du produit.
� Décider ce qui devrait être automatisé, à quel degré et comment.
� Sélectionner les outils pour aider le test
� Organiser la formation des testeurs à l’usage des outils.
� Décider de la mise en oeuvre de l’environnement de test.
� Établir des rapports de synthèse du test
Tâches des testeurs� Passer en revue les plans du test et y contribuer.� Analyser, passer en revue et évaluer, quant à leur testabilité,
� les exigences utilisateurs, � les spécifications et les modèles.
� Créer des spécifications de test.� Mettre en place l’environnement de test� Préparer et obtenir les données de test.� Implémenter des tests à tous les niveaux,
� exécuter et consigner les tests, � évaluer les résultats� documenter les écarts vis-à-vis des résultats attendus.
� Employer � les outils d’administration ou de gestion des tests� les outils de surveillance des tests en fonction du besoin.
� Automatiser les tests � Mesurer les performances des composants et systèmes � Passer en revue les tests développés par d’autres.
35
Estimation des tests� Deux approches de l’estimation de l’effort de test :
� basé sur des mesures issues de projets antérieurs ou similaires ou basée sur des valeurs typiques.
� par le détenteur des tâches de tests ou par des experts.
� L’estimation de l’effort de test doit prendre en compte� les objectifs de l’entreprise. � les caractéristiques, nature complexité et taille du domaine, du produit, du
métier � la qualité des exigences, de la documentation et autres informations utilisées � les exigences de fiabilité et de sécurité� les caractéristiques du processus de développement � la stabilité de l’organisation et le savoir-faire des personnes impliquées � les outils employés et le processus de test� les contraintes de temps� les résultats du tests : nombre de défauts et volume des reprises exigées.� les aspects réglementés,
Planification des tests
� Définir et prendre des décisions quant à� l’approche générale du test (stratégie de test), � la définition des niveaux de test et ce qui doit être testé� comment évaluer les résultats des tests et quand arrêter les tests (critères de sortie)� quels rôles vont exercer quelles activités.
� Intégrer et coordonner des activités de test dans les activités du cycle de développement
� Assigner les ressources aux différentes tâches définies.� Définir la documentation du test pour permettre une préparation et une exécution
reproductibles des tests� volume, � niveau de détail des procédures de test � structure et modèles.
� Sélectionner les mesures pour � suivre et contrôler la préparation et l’exécution du test, � éliminer des défauts � Résoudre les problèmes relatifs aux risques..
36
Critères de sortie
� l’objectif des critères de sortie est de définir quand arrêter le test,
� les critères de sortie :� Des mesures d’exhaustivité, comme la couverture de code, de
fonctionnalités ou de risques.
� L’estimation de la densité des anomalies ou des mesures de fiabilité.
� Le coût.
� Les risques résiduels, � anomalies non corrigées � manque de couverture du test dans certaines parties� ...
� Un calendrier, par exemple, basé sur la date de mise sur le marché
� ...
Suivi et contrôle du déroulement des tests
objectif du suivi du test =
fournir un retour et une visibilité sur les activités de test.
37
Suivi et contrôle du déroulement des tests
� mesures de test habituelles :� pourcentage de préparation des cas de test (cas de test préparés /
planifiés /)� pourcentage de préparation de l’environnement de test.� pour l’exécution de cas de test
� nombre de cas de test exécutés ou non � nombre de cas de test réussis ou échoués.� couverture des exigences, des risques ou du code
� Les informations sur les défauts � densité des défauts, � défauts trouvés et corrigés, � taux des défaillances et résultats du retest.
� Confiance subjective des testeurs dans le produit� Dates des jalons du test� Coût du test, y compris le coût de l’avantage de trouver le prochain
défaut comparé à celui de l’exécution du test suivant.
Gestion de configuration
objectif =
établir et maintenir l’intégrité des produits
du logiciel ou du système durant le cycle de vie du projet et du produit.
(composants, données et documentation)
______________aider le testeur à
identifier de manière unique (et à reproduire) l’élément testé,
les documents de test, les tests.
38
Gestion de configuration
� éléments du matériel de test � identifiés, � sous contrôle de versions,
� changements � identifiés et retraçables, � reliés les uns aux autres � reliés aux éléments de développement (objets de
test),
= la traçabilité maintenue pendant tout le processus du test.
� documents identifiés et éléments du logiciel référencés de manière non ambiguë dans la documentation de test
Gestion des anomalies
� l’un des objectifs du test est de découvrir des défauts
� les différences entre les résultats attendus et les résultats effectifs doivent être consignées en tant qu’anomalies.
� les anomalies devraient être suivis depuis leur découverte et classification jusqu’à leur correction et la confirmation de leur résolution.
� pour pouvoir gérer tous les anomalies jusqu’à la fin d’un projet, une organisation devrait établir un processus et des règles pour leur classification.
39
Gestion des anomalies
� objectifs des rapports d’anomalies � fournir aux développeurs et aux autres parties
un retour sur le problème concerné et permettre l’identification, la localisation et la correction nécessaires.
�Fournir aux responsables du test le moyen de suivre la qualité d’un système sous test et l’avancement du test.
�Fournir des idées pour l’amélioration du processus de test.
Gestion des anomalies
� informations sur une anomalie (si elles sont disponibles)� Résultats attendus et effectifs.� Date de la découverte de l’anomalie.� Identification ou élément de configuration du logiciel ou système.� Processus du cycle de vie du logiciel ou du système au cours duquel
l’anomalie a été observé� Description de l’anomalie.� Degré de l’impact sur les intérêts des détenteurs d’enjeux� Sévérité de l’impact sur le système� Urgence ou priorité de la correction� Etat de l’anomalie (par exemple, ouvert, soumis, doublon, en attente de
correction, corrigé en attente de test de confirmation, clôturé).� Conclusions et recommandations� Problèmes globaux, comme d’autres parties pouvant être impactées par
une modification résultant de l’anomalie.� Historique des modifications, tels que la séquence des actions
entreprises par des membres de l’équipe du projet afin de localiser l’anomalie, de le corriger et d’en confirmer la correction.
40
Partie 5
Les outils de support aux tests
79
5. Outils de support aux tests
� Outils de support et de gestion des tests � Outils d’aide aux tests statiques � Outils d’aide à la spécification des tests � Outils d’aide à l’exécution et au suivi des
tests � Outils de support des performances et de
surveillance
A noter : Quelques types d’outils peuvent être intrusifs
41
Outils de support et de gestion des tests
� Les fonctionnalités� Assistance à la gestion des tests et des activités de test effectuées.� Interface avec les outils d’exécution, outils de gestion des défauts et
outils de gestion des exigences.� Contrôle de version indépendant ou interface avec un outil de gestion
de configuration externe.� Support pour la traçabilité des tests, des résultants de tests et
incidents vers les documents source, tels les spécifications d’exigences.
� Enregistrement des résultats de test et génération des rapports d’avancement.
� Analyse quantitative (métriques) liées aux tests
� 3 types d’outils� Outils de gestion des exigences� Outils de gestion d’incidents� Outils de gestion de configuration
Outils d’aide aux tests statiques
� Outils d’assistance au processus de revue� archiver des informations relatives aux processus de revue,
garder et diffuser les commentaires des revues,
� informer sur les efforts et défauts
� gérer les références vers les règles de revue et/ou les checklists
� assurer le traçabilité entre les documents et le code source
� fournir de l’aide aux revues en ligne
� Outils d’analyse statique � recherche de défauts avant l’analyse dynamique.
� respect des standards de codage.
� analyse des structures et de leurs dépendances
� aide à la compréhension du code.
� calculer des métriques à partir du code (p.ex. complexité)
42
Outils d’aide aux tests statiques
� Outils de modélisation�valider des modèles du logiciel. �Par exemple,
� vérificateur de modèle de bases de données peut trouver des défauts ou inconsistances dans le modèle de données ;
� d’autres outils de modélisation peuvent découvrir des défauts dans un modèle d’états ou un modèle objet.
�peuvent souvent aider à générer quelques cas de test basés sur les modèles
Outils d’aide aux tests statiques
principal avantage des outils d’analyse statique et des outils de modélisation
= Rentabilité (Retour sur Investissement) procurée en découvrant d’avantages de
défauts plus tôt dans le processus de
développement.
43
Outils d’aide à la spécification des tests
� Outil de conception des tests� génèrent des entrées de test ou des tests réels à partir des
exigences, d’une interface utilisateur graphique (GUI), de modèles de conception (états, données ou objets) ou à partir du code.
� peut aussi générer les résultats attendus (p.ex. utilisation d’un oracle de tests).
� peuvent faciliter la génération des tests en offrant des cadres structurés, parfois appelés “test frame”, qui génèrent des tests ou des bouchons.
� Les tests générés à partir d’un modèle d’état ou d’un modèle objet � utiles pour vérifier l’implémentation du modèle dans le logiciel, � rarement suffisants pour vérifier tous les aspects du logiciel ou
du système concerné. � peuvent faire gagner un temps précieux et fournir une
exhaustivité accrue des tests par la complétude des tests que l’outil peut générer.
Outils d’aide à la spécification des tests
� Outil de préparation des données�agissent sur des bases de données, fichiers
ou transferts de données afin d’élaborer des données de tests utilisables lors de l’exécution des tests.
�s’assurer que les données réelles transférées vers l’environnement de tests sont rendues anonymes de façon à protéger leur contenu.
44
Outils d’aide à l’exécution et au suivi des tests
� Outils d’exécution des tests� Outils de tests dans un cadre unitaire
Comparateurs de tests� Outils de mesure de couverture � Outils de sécurité informatique
Outils d’aide à l’exécution et au suivi des tests
� Outils d’exécution des tests� permettent l’exécution automatique, ou semi-automatique, des
tests
� utilise des entrées archivées et des résultats attendus, par le biais d’un langage de script.
� permet répéter les tests avec des données différentes
� permet de tester une partie différente du système avec des étapes similaires.
� peuvent aussi être utilisés pour enregistrer des tests et dans ce cas peuvent être référencés comme des outils de capture et de rejeu
� En général, ces outils comprennent � des possibilités de comparaison dynamique
� proposent des information de suivi de chaque exécution des tests.
45
Outils d’aide à l’exécution et au suivi des tests
� Outils de tests dans un cadre unitaire � peut faciliter le test des composants ou parties de
systèmes en simulant l’environnement où s’exécute l’objet en cours de test.
� peuvent aussi être utilisés pour fournir un cadre d’exécution où les langages, systèmes d’opération ou matériels doivent être testés ensemble.
� aident à l’exécution des tests de composants en parallèle avec la construction du code.
Outils d’aide à l’exécution et au suivi des tests
� Comparateurs de tests� déterminent les différences entre les fichiers, bases de données
ou résultats de tests.
� Outils de mesure de couverture � peuvent être soit intrusifs, soit non-intrusif selon la technique
demesure utilisée, ce qui est mesuré et le langage de développement.
� mesurent le pourcentage de types de structures de code exercés (p.ex. instructions, branches ou décisions, et d’appels de modules ou de fonctions).
� indiquent de quelle manière le type de structure analysé a été parcouru par un jeu de tests.
� Outils de sécurité informatique� recherchent des virus informatiques et des attaques de déni de
service (denial of service). � stressent le système en y cherchant des vulnérabilités
spécifiques.
46
Outils de support des performances et de surveillan ce
� Outils d’analyse dynamique � détectent des défauts qui ne se manifestent que lors de l’exécution du
logiciel, telles les dépendances temporelles ou les fuites de mémoire.
� Outils de tests de performances / outils de tests de stress� surveillent et indiquent le comportement du système soumis à une
variété de conditions d’utilisation simulées. � simulent une charge sur une application, une base de données, ou un
environnement système, tel qu’un serveur ou un réseau. � sont souvent basés sur une répétition automatisée de tests, contrôlée
par des paramètres.
� Outils de surveillance� ne sont pas strictement des outils de tests, � fournissent de l’information pouvant être utilisée à des fins de tests et
qui n’est pas disponible par d’autres moyens.� analysent continuellement, vérifient et informent sur l’utilisation de
ressources système spécifiques, et alertent en cas de problèmes de service potentiels.
Bénéfices potentiels et risques lies aux outils de tests
� Le simple achat, ou la location d’un outil ne garantit par le succès� chaque type d’outil nécessite des efforts supplémentaires pour
atteindre des bénéfices réels et durables. � Les bénéfices potentiels à l’utilisation d’outils
� réduction du travail répétitif � réintroduction des mêmes données de tests, � vérification du respect de standards de codage).� répétitivité et cohérence accrues � Evaluation objective � Facilité d’accès aux informations au sujet des tests ou de leur exécution
� Les risques liés à l’utilisation d’outils � Attentes irréalistes placées dans l’outil � Sous-estimation du temps, du coût et de l’effort pour l’introduction
initiale d’un outil� Sous-estimation du temps et de l’effort nécessaires pour obtenir de
l’outil des bénéfices significatifs et continus de l’outil � Sous-estimation de l’effort requis pour maintenir les acquis générés par
l’outil.� Confiance excessive dans l’outil
47
Tests unitaires :exemple de JUnit
JUnit
� un framework open source (junit.org) pour le test unitaire de programmes Java qui permet d’automatiser les tests
� Deux versions du framework :JUnit 3.X :
classes de tests héritent de TestCaseJUnit 4.X :
utilisation des annotations Java (5+)94
49
Ecriture d’une classe de test
� Un exemple simple de Classe à tester :
Test
s un
itaire
s
Ecriture d’une classe de test� Classe de test :
� Création des objets qui vont interagir lors du test� Code qui agit sur les objets impliqués dans le test� Vérification que le résultat obtenu correspond bien
au résultat attendu
Test
s un
itaire
s
50
Ecriture d’une classe de test
static void assertTrue(boolean test)
méthode JUnit : vérifie que test == true et dans le cas contraire lance une exception (en fait une Error) de typeAssertionFailedError
L’exécuteur de tests JUnit attrape ces objets Errors et indique les tests qui ont échoué
Exécution des tests
� Résultat d’une exécution sous Eclipse :
100
51
Ecriture d’une classe de test
Exécution d’un test
� Pour exécuter un testTestResult result = (new
CounterTest("testIncrement")).run();
� Pour exécuter une suite de testsTestSuite suite = new TestSuite();suite.addTest(new CounterTest("testIncrement"));suite.addTest(new CounterTest("testDecrement"));TestResult result = suite.run();
� En utilisant l’introspectionTestSuite suite = new TestSuite(CounterTest.class);TestResult result = suite.run();
52
Résultats d’un test
� JUnit propose des outils pour exécuter suite de tests et afficher les résultats� junit.textui.TestRunner : affichage textuel� junit.swingui.TestRunner : affichage graphique
� Ajouter à la classe de test une methode statique suitepour rendre une suite accessible à un "exécuteur de test" (TestRunner) :
public static Test suite() {TestSuite suite = new TestSuite();suite.addTest(new CounterTest("testIncrement"));suite.addTest(new CounterTest("testDecrement"));return suite;}
� Autre solution (introsepection)junit.textui.TestRunner.run(CounterTest.class);
� De nombreux IDE intègrent JUnit : NetBeans, JBuilder, Eclipse
tous les tests d’un package� TestSuite contient des objets Test
� Des TestCase mais aussi des TestSuite
� Une classe AllTest� Teste toutes les suite de tests du package
public class AllTests {public static Test suite() {TestSuite suite =
new TestSuite("Test for default package");suite.addTest(new TestSuite(TokenizerTest.class));suite.addTest(new TestSuite(NodeTest.class));suite.addTest(new TestSuite(ParserTest.class));suite.addTest(new TestSuite(TreeTest.class));return suite;}
}
53
tous les tests de sous-package
� Dans chaque package définir une suite qui inclus les suites des sous packages
public class AllTests_{public static Test suite() {
TestSuite suite =new TestSuite("All helix.* and subpackages tests");
suite.addTest(helix.edb.AllTests_.suite());suite.addTest(helix.def.AllTests_.suite());
return suite;}
}
Les méthodes assert
� static void assertTrue(String message , boolean test )� Le message optionnel est inclus dans l’Error
� static void assertFalse(boolean test )� static void assertFalse(String message , boolean test )
� vérifie que test == true
� assertEquals(expected , actual )� assertEquals(String message , expected , actual )
� méthode largement surchargée: arg1 et arg2 doivent être tout deux des objets ou bien du même type primitif
� Pour les objets, utilise la méthode equals (public boolean equals(Object o) sinon utilise ==
54
Les méthodes assert
� assertSame(Object expected , Object actual )� assertSame(String message , Object expected , Object
actual )� Vérifie que expected et actual référencent le même objet (==)
� assertNotSame(Object expected , Object actual )� assertNotSame(String message , Object expected , Object
actual )� Vérifie que expected et actual ne référencent pas le même objet
(==)
Les méthodes assert
� assertNull(Object object )� assertNull(String message , Object object )
� Vérifie que objet est null
� assertNotNull(Object object )� assertNotNull(String message , Object object )
� Vérifie que objet n’est pas null
55
Les méthodes assert
� fail()� fail(String message )
� Provoque l’échec du test et lance une AssertionFailedError� Utile lorsque les autres méthodes assert ne correspondent pas
exactement à vos besoins ou pour tester que certaines exceptions sont bien lancées
try {
// appel d’une méthode devant lancer une Exception
fail("Did not throw an ExpectedException");
}
catch (ExpectedException e) { }
Un exemple version Junit 4
56
Exemple de classepublic class Operations {
public static long additionner(final long...pNombres) {long lRetour = 0;for(final long lNombre : pNombres) {
lRetour += lNombre;}return lRetour;
}// Cette méthode ne fonctionne pas correctement public static long multiplier(final long...pNombres) {
long lRetour = 0;for(final long lNombre : pNombres) {
lRetour *= lNombre;}return lRetour;
}}
111
Exemple de classe de Testpublic class TestSimple {
@Testpublic void additionAvecDeuxNombres() {
final long lAddition = Operations.additionner(10, 20);Assert.assertEquals(30, lAddition);
}@Testpublic void additionAvecCinqNombres() {
final long lAddition = Operations.additionner(256, 512, 1024, 2048, 4096);Assert.assertEquals(7936, lAddition);
}@Testpublic void mutiplicationAvecDeuxNombres() {
final long lMultiplication = Operations.multiplier(10, 20);Assert.assertEquals(300, lMultiplication);
}public void testMutiplicationAvecCinqNombres() {
final long lMultiplication = Operations.additionner(256, 512, 1024, 2048, 4096);Assert.assertEquals(1125899906842624L, lMultiplication);
}}
112
57
Exécution des tests
� Résultat d’une exécution sous Eclipse :
113
Test d’exception
public static long diviser(final long...pNombres) {if(pNombres.length < 2) {
throw new IllegalArgumentException("Il faut au moins deux nombres en entrée");
}long lRetour = pNombres[0];for(int i=1;i<pNombres.length;i++) {
lRetour /= pNombres[i];}return lRetour;
}
114
58
Test d’exception
public class TestThrowable {
@Test(expected=IllegalArgumentException.class)public void divisionAvecUnNombre() {
Operations.diviser(1);}
@Test(expected=ArithmeticException.class)public void divisionAvecDeuxNombresDontUnZero() {
Operations.diviser(10, 0);}
@Test(expected=ArithmeticException.class)public void divisionAvecDeuxNombres() {
Operations.diviser(10, 5);}
}115
Test d’exception
� Run :
116
59
Test de durée d’exécution
public class TestDureeLimitee {
@Test(timeout=1000)
public void dureeRespectee() {
}
@Test(timeout=1000)
public void dureeNonRespectee() throws InterruptedException {
Thread.sleep(10000);
}
}
117
Ignorer un test
public class TestIndisponibilite {
@Test
public void nonIgnore1() {
}
@Test
public void nonIgnore2() {
Assert.fail("Echec");
}
@Ignore
@Test
public void ignore() {
Assert.fail("Echec ignoré");
}
} 118
60
Méthodes pré/post tests
public class TestAvantApres {@Beforepublic void avantTest() {
System.out.println("------------------------");System.out.println("Avant Test");
}@Afterpublic void apresTest() {
System.out.println("Après Test");System.out.println("------------------------");
}@Testpublic void premierTest() {
System.out.println("Premier Test");}
…}
119
Méthodes pré/post Classe de test
public class TestAvantApresEnsembleTests{@BeforeClasspublic void avantTests() {
System.out.println("------------------------");System.out.println("Avant tous les Tests");
}@AfterClasspublic void apresTests() {
System.out.println("Après tous les Tests");System.out.println("------------------------");
}@Testpublic void premierTest() {
System.out.println("Premier Test");}
…}
120
61
JUnit 4
� Introduit de nouveaux tests et une syntaxe par « contrats »
� Exemple :
121
JUnit 4
import java.io.Serializable;import org.hamcrest.core.IsInstanceOf;import org.junit.Assert;import org.junit.Test;
public class TestContratClasseInstance {@Testpublic void classeDeString() {
Assert.assertThat("texte", IsInstanceOf.instanceOf(String.class));}@Testpublic void classeDeSerializable() {
Assert.assertThat("texte", IsInstanceOf.instanceOf(Serializable.class));}
…}
122
62
JMock
� Les assertions par contrat sont désormais intégrées à JUnit, mais sont à l'origine développées par JMock.
� La librairie originale comprend des contrats supplémentaires
123
JMock
� Ces contrats sont séparés en 7 groupes : � core (contrats intégrés dans JUnit et déjà vus dans les chapitres
précédents) : contrats de base sur les objets et les valeurs, ainsi que les contrats composés.
� beans : contrats sur les beans Java et leurs valeurs.
� collection : contrats sur les tableaux et les collections.
� number : contrats de comparaison numérique.
� object : contrats de contrôle des objets et des classes.
� text : contrats de comparaison de textes.
� xml : contrats sur les documents XML.
� Pour pouvoir les utiliser, il faut rajouter les jar : "jmock-2.5.1.jar ", "hamcrest-core-1.1.jar " et "hamcrest-library-1.1.jar ".
124
63
Contrats de Bean
� Le contrats "HasProperty" vérifie qu'un bean possède bien les getter et setter correspondants à une propriété
� Le contrat "HasPropertyWithValue" vérifie que la valeur d'une propriété d'un bean respecte un contrat passé en paramètre.
125
Exemple de contrat de Bean
� Deux classes « Bean » :
public class BeanSansPropriete {}
public class BeanAvecPropriete {private Integer prop;public void setProp(Integer pProp){prop = pProp;}public Integer getProp(){return prop;}
}
126
64
Exemple de contrat de Beanpublic class TestContratBean {
@Test
public void beanSansPropriete() {assertThat(new BeanSansPropriete(), hasProperty("prop"));
}@Test
public void beanAvecPropriete() {assertThat(new BeanAvecPropriete(), hasProperty("prop"));
}@Test
public void beanAvecBonneValeur() {final BeanAvecPropriete lBean = new BeanAvecPropriete();lBean.setProp(10);assertThat(lBean, hasProperty("prop", equalTo(10)));
}@Test
public void beanAvecMauvaiseValeur() {final BeanAvecPropriete lBean = new BeanAvecPropriete();assertThat(lBean, hasProperty("prop", equalTo(10))); 127
Résultat contrats de Bean
128
65
Principes
� Integration continue – Pendant le développement, le programme marche toujours – peut être qu’il ne fait pas tout ce qui est requis mais ce qu’il fait, il le fait bien.
� TDD Test Driven Development :pratique qui se rattache à l’eXtreme Programming
“Any program feature without an automated test simply doesn’t exist.” from Extreme Programming Explained, Kent Beck
Test Tips
� Code a little, test a little, code a little, test a little . . .� Run your tests as often as possible, at least as often as
you run the compiler ☺� Begin by writing tests for the areas of the code that
you’re the most worried about . . .write tests that have the highest possible return on your testing investment
� When you need to add new functionality to the system, write the tests first
� If you find yourself debugging using System.out.println(), write a test case instead
� When a bug is reported, write a test case to expose the bug
� Don’t deliver code that doesn’t pass all the tests