La gestion des exceptions et les doublures de test

Page 1 sur 7Lecteur de document UniversityLib

La gestion des exceptions et les doublures de test

Programmation, Tests unitaires, JUnit · course

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