Bibliographie
Ø Le blog de Martin Fowler qui regorge de billets intéressants sur les test et le
génie logiciel de manière générale
Compléments sur les tests
Ø « Practical Unit Testing »
Ø Ce support a été réalisé à partir des supports de cours de S. Mossert, P. Collet,
I. Blasquez, C. Nebut
2
La gestion des exceptions
La gestion des exceptions – A l’aide d’annotation
Ø Dans le cours précédent nous avons la base pour réaliser des tests unitaires à
Ø La solution la plus simple consiste à utiliser le passage par des annotations
l’aide de JUnit
Repose essentiellement sur l’utilisation d’assertion
Ø En Java (et dans les autres langages qui les supportent), il est en général de
bonne pratique de tester les exceptions qui peuvent être levées
On s’appuie sur les spécifications pour déterminer les cas d’erreur et on vérifie
ensuite celles-ci lors des tests
Ø Avec JUnit il existe plusieurs solutions pour faire cela
En utilisation des annotations spécifiques
En s’appuyant sur la gestion classique à base de Try…catch..
En passant sur des règles
On modifie l’annotation @Test en spécifiant en paramètre la classe d’exception
que l’on s’attend à recevoir au cours du test
@Test(expected = Exception.class)
Ø Cette solution fonctionne dans la plupart des cas simples mais elle présente
quand même quelques limitations
Le test passe si n’importe quelle méthode lève l’exception ce qui ne permet d’être
sur que c’est bien l’instruction attendue qui la lève
3
4
La gestion des exceptions – Try catch
La gestion des exceptions – Les règles
Ø Cette méthode consiste à passer par une nouvelle méthode offerte par JUnit:
Ø Le passage par des règles est proche de la solution précédente
fail()
Il permet de choisir l’exception à tester mais également le message renvoyé
On l’utilise après la méthode qui doit normalement lever l’exception
ú Si jamais on passe à l’instruction suivante après l’exécution de la méthode cela veut dire
que le test a échoué
Ø Dans le bloc catch on effectue ensuite une assertion sur l’exception retournée
On vérifie en général le message à l’aide d’assertThat (JUnit 4.4 ou supérieur)
La gestion des exceptions – Les règles
Listes des Matchers disponibles :
Il s’appuie sur des objets Matchers qui sont disponibles dans la librairies
Harmcrest
ú Par défaut un sous ensemble de cette librairie est disponible dans JUnit 4.4 et supérieur
6
Les doublures de test
Ø Définition: Une doublure de test désigne tout objet qui remplace un objet réel
pour pouvoir réaliser un test
En anglais on parle de Mock, Stub, dummy, spy, fake…
Ø Une doublure permet de reproduire l’état et/ou le comportement d’un objet
dont on dépend pour pouvoir faire un test
Exemple:
ú Si on veut tester une voiture, on va avoir besoin d’un moteur
ú Pour voir si la voiture avance et recule correctement on va utiliser une doublure de
Publicité
moteur qui va faire avancer de 1 et un autre qui va faire reculer de 1
Ø Pour réaliser ces doublures on va pouvoir utiliser
Des classes écrites manuellement
des outils automatisés comme Mockito, EasyMock … qui vont générer ces classes
8
5
7
Les doublures de test
Les doublures de test – Dummy
Ø Il existe différents termes pour désigner les doublures de tests chacun ayant
Ø Un objet Dummy simule l’implémentation d’un objet mais ne fait rien
un rôle différent
Dummy : des objets que l'on fait circuler sans jamais réellement les utiliser
ú Habituellement ils servent juste à remplir des listes de paramètres.
Stub : (ou bouchons en français) proposent en général une réponse unique à un
appel de méthode et ne sont utilisés que dans le cadre des tests
Mock (ou simulacres) sont des objets préprogrammés avec des attentes qui
constituent une spécification des appels qu’ils s’attendent à recevoir
Spy : ce sont des bouchons qui font de la vérification de comportement
ú Exemple: combien de fois une méthode est-elle appelée?
Fake : ce sont des objets qui ont des implémentations fonctionnelles qui sont
souvent des simplifications par rapport à la version finale
Ø Un très bon article de Martin Fowler (Uncle Bob) détaille ces différences:
https://bruno-orsier.developpez.com/mocks-arent-stubs/ (version française)
Doublure la plus simple qui retourne en générale des objets vides
Juste utilisés comme paramètres d’appel des méthodes à tester
Ø Exemple (source: https://blog.cleancoder.com/uncle-
bob/2014/05/14/TheLittleMocker.html)
Interface métier
Le dummy
9
10
Les doublures de test – Dummy
Les doublures de test – Stub
La classe à tester
Ø Le stub contrairement au précédent peut être utilisé car il fournit une
implémentation minimale
Il fourni toujours la même réponse prédéfinie
Son implémentation tiens compte du contexte du test qui va l’utiliser
Il est utilisé dans le cadre de test en boite blanche, c’est-à-dire que l’on connait le
comportement attendu en sortie d’une méthode
Exemple
Le test utilisant le Dummy
Ø Le fait de renvoyer null permet d’assurer que le Dummy ne sera pas utilisé
ú Si on veut faire des tests nécessitant de ne PAS être évalué, il faut écrire un autre Stub
pour autre chose que les tests pour lesquels il a été conçu
11
12
Il va pouvoir être utilisé par tous les tests qui ont besoin d’avoir une
authentification pour pouvoir être évalués
Les doublures de test – Spy
Les doublures de test – Mock
Ø L’objectif d’une doublure de type Spy est de fournir des informations sur
Ø L’objet Mock est un espion amélioré qui fournit des méthodes permettant de
l’utilisation de la doublure
contrôler l’état du test
Il espionne l’utilisation du bouchon et sinon fonctionne comme un stub classique
Publicité
Permet de savoir quelle méthode a été appelée, combien de fois…
Exemple
Il connait le comportement de l’objet
ú C’est peu comme si le test était introduit à l’intérieur de la doublure
Exemple
ú Il renvoie true comme le précédent mais s’assure également que le passage dans la
méthode authorize a bien été réalisé
13
14
Les doublures de test – Fake
Les doublures de tests avec Mockito
Ø Un fake (ou imposteur en français) est une doublure plus générique que les
Ø Mockito est un des frameworks les plus utilisés pour réaliser des doublures de
bouchons
Il possède un vrai comportement métier
tests en Java
Il suffit d’ajouter un ensemble de librairies pour pouvoir l’utiliser
Il est souvent utilisé pour faire une abstraction d’une dépendance comme un
Documentation: http://mockito.org
service externe ou une base de donnée par exemple
ú Il met en place des raccourcis qui fait qu’il est inutilisable en production
Exemple
Ø Exemple de classe à tester
Ø La création du mock peut se faire de deux manières
15
16
Par injection
Par appel d’une méthode statique
Les doublures de tests avec Mockito
Les doublures de tests avec Mockito
Ø Mockito fourni un ensemble de méthode permettant de définir et vérifier les
comportements que doivent prendre les doublures
Spécification à l’aide du mot clé When
ú Pour les fonctions
« When + thenReturn
w Equivalent à
w Il est possible de spécifier une suite de test à passer
« When + thenThrow
« Il est possible d’enchainer les deux pour avoir des comportements successifs
Les doublures de tests avec Mockito
Ø Mockito propose également des méthodes pour créer simplement des
doublures d’espionnage pour des objets réels
Ø Pour vérifier les valeurs qui sont fournies en argument Mockito s’appuie la
méthode equals()
Il est également possible d’utiliser des Matchers lorsque les valeurs des
paramètres n’ont pas d’importance
ú Exemple de matchers: anyInt() qui fourni un entier aléatoire
Attention: Si vous utilisez des matchers dans votre expression alors tous les
arguments doivent être des matchers
17
19
Vérification à l’aide du mot clé Verify
ú C’est une forme d’assertion propre à Mockito
ú Lève une exception si la vérification échoue ce qui fait échouer le test
ú Exemples
Les doublures de tests avec Mockito
Liste de matchers courants
Publicité
ú any(), static <T> T anyObject()
ú anyBoolean(), anyDouble(), anyFloat(), anyInt(), anyString()…
ú anyList(), anyMap(), anyCollection(), anyCollectionOf(java.lang.Class<T> uneClasse),
anySet(), java.util.Set<T> anySetOf(java.lang.Class<T> uneClasse)
Ø Pour les méthodes de type void, on utilise doXXX
doThrow pour les exceptions
doNothing
18
20
Les doublures de tests avec Mockito
Les doublures de tests avec Mockito
Ø Certaines de ces méthodes doXXX permettent d’interagir avec les fonctions
doReturn qui renvoie un objet lors de l’appel d’une fonction
doAnswer va renvoyer une réponse qui tienne compte des paramètres fournis
ú Par exemple elle va permettre d’ajouter des éléments dans une liste fournie en
paramètre
Source: https://stackoverflow.com/questions/28836778/usages-of-dothrow-doanswer-donothing-and-
doreturn-in-mockito
21
22
Que faut-il tester?
Que faut-il tester?
Ø Right-BICEP
Right : Est-ce que les résultats sont corrects?
B (Boundary) : Est-ce que les conditions limites sont correctes? Que ce passe-t-il
lorsque l’on fournit des données non correctement formatées ou vides ou nulles
ou non conforme …
I (Inverse) : Est-ce que l’on peut vérifier la relation inverse?
C (Cross-Check) : Est-ce que l’on peut vérifier le résultat autrement ? Par exemple
on teste la fonction de racine carrée en utilisant la fonction de mise au carré
E (Error condition) : Est-ce que l’on peut forcer l’apparition d’erreurs?
P (Performance) : Est-ce que les performances obtenues sont correctes?
Ø CORRECT (utilisé pour établir les bornes
C (Conformance) : Est-ce que la valeur est dans le format attendu?
O (Ordering) : Est-ce que l’ensemble des valeurs est dans un ordre approprié ?
R (Range): Est-ce que la valeur est dans l’intervalle [minValue, maxValue] ?
R (Reference) : Est-ce que le code utilise un service externe qui n’est pas sous le
contrôle du test?
E (Existence) : Est-ce que la valeur existe?
C (Cardinality) : Est-ce qu’il y a assez de valeurs?
T (Time): Est-ce que tout se passe dans l’ordre? Au moment prévu? Dans le délais
prévu?
23
24
Le patron de test AAA (Arrange, Act and Assert)
Ø Il s’agit d’un patron pour écrire ses test unitaires
Devient un standard de fait
Ø Arrange
Déclaration des variables, création des instances des objets à tester
Ø Act
Appelle de la méthode à tester sur l’objet
Ø Assert
Assertion sur le résultat obtenue après l’exécution de la méthode
25