Recherche

Coder's IO

Tag

Test

JSONassert

 

A l'heure du déploiement massif d'API REST et de l'utilisation intensive du format JSON, il est très utile de pouvoir tester de manière simple mais efficace les différents flux que nous mettons à disposition.

Malgré la simplicité du format Json, la mise en place de test unitaire est toujours un peu fastidieuse sur ce format.
En effet, la représentation du flux est sous forme de chaîne de caractères. Comparer deux flux strictement identiques cela ne pose aucun problème. 
Par contre deux flux identiques sur le contenu mais dans un ordre différent cela se complique. 
Pour traiter ce cas, il va falloir parcourir chacun des éléments et ensuite faire des comparaisons un à un afin de vérifier que tous les éléments d'un flux sont bien présents dans le second. Je vous laisse imaginer le code à écrire et surtout à relire ultérieurement.

C'est précisément là que la librairie JSONassert intervient.
Cet outil permettra de faire des comparaisons de flux Json au niveau de la structure mais aussi des données.

L'exemple présenté sur le site de la librairie est assez éloquent : 

JSONObject data = getRESTData("/friends/367.json");
String expected = "{friends:[{id:123,name:\"Corby Page\"},{id:456,name:\"Carter Page\"}]}";
JSONAssert.assertEquals(expected, data, false);

La librairie propose deux types de vérification : une vérification stricte qui impose que les flux soient strictement identiques et l'autre qui tolérera que tous les champs résultats ne soient pas dans les champs attendus (très pratique pour vérifier quelques champs importants, sans vérifier tout le contenu du flux JSON). Dans tous les cas, l'ordre des champs n'a pas d'importance. Le deuxième mode est recommandé.

Actuellement, la librairie supporte comme framework de test  _JUnit_.

Comme toute bonne librairie, un quick start est proposé afin de rapidement prendre en main l'outil. Vous trouverez aussi un CookBook également très utile pour répondre aux cas classiques.

JSONassert est disponible sur les repos traditionnels Maven.

Bons tests !

#java #json #test

Catch-Exception

 

Dans les tests unitaires, il existe plusieurs façons de vérifier que le comportement des exceptions répond bien aux attentes.

Pour information j'utilise fest-assert pour la gestion des assertions ; même si l'information n'est pas capitale, cela permet de savoir de quoi on parle 😉

Voici un premier exemple qui présente la manière basique d'effectuer cette vérification : 

   @Test
    public void first_way_to_exception() throws Exception {

        //case 1
        try {
            ms.computeSomething(1, 1);
            fail("should throw an exception!");
        } catch (Exception e) {

        }

       //case 2
        try {
            ms.computeSomething(1, 2);
        } catch (Exception e) {
            fail("no exception should be threw");
        }

    }

Dans le cas 1, on va vérifier que le fil d’exécution du test unitaire passe bien dans le block catch, ce qui voudrait dire qu’une exception a bien été levée et correspond au comportement attendu.
Si l’invocation de la méthode du service ne lançait pas d’exception alors le test échouerait avec la méthode fail(..) 

Cette solution très pragmatique et qui fonctionne bien, implique la mise en place de pas mal de lignes de code qui présente peu d’intérêt pour le test unitaire en lui-même.

Avec l’évolution du JDK et de JUnit, il est possible d'avoir recours aux annotations. En effet, l'ajout du paramètre expected dans l'annotation @Test permet d'exprimer de manière plus synthétique le fait que le lancement d'une exception est attendu par le test. Voici un exemple d'implémentation : 

  @Test(expected=OneException.class)
   public void second_way_to_exception() throws Exception {
        ms.computeSomething(1, 1);
   }

Cette solution est plus concise, néanmoins elle ne permet pas de manipuler l'exception levée pour, par exemple, analyser le message contenu dans l'exception à l'instar de la première solution.

La troisième solution repose sur une librairie nommée catch-exception.
Cette librairie permet d'obtenir, en quelque sorte, un mix des deux solutions précédentes.
c'est-à-dire que le code écrit restera (très) concis et que cela permettra de faire une analyse fine de l'exception que l'on souhaite traiter. 
Voici un exemple : 

 @Test
 public void third_way_to_exception() throws Exception {
        catchException(ms).computeSomething(1, 1);

         assertThat(caughtException())
             .isInstanceOf(OneException.class)
             .hasMessage(EVERYONE_ARE_EQUALS_TO_1);
 }
    
Cette librairie fournit une manipulation à la Mockito (très expressive). Il est d'ailleurs très facile de comprendre l'exemple.
La première ligne du test va encapsuler l'instance de l'objet que l'on souhaite surveiller. Ensuite, on enregistre la méthode que l'on souhaite contrôler.

Après, on écrit l'assertion. Dans ce cadre, on a accès à un ensemble d'informations (comme son type, le contenu du message, etc..)

Des trois solutions, c'est naturellement la dernière que je retiendrai.

Vous trouverez plus de détails dans le lien attaché à ce post.

    #java #test_unitaire #exception

Connaitre les outils de tests c’est bien!

 

Assurer la qualité d’une application passe inévitablement par la mise en place d’une couverture de test. Qu’ils soient unitaires, d’intégration, fonctionnels, etc.

Avoir cette volonté est une très bonne chose. Encore faut-il savoir le faire correctement… 🙂
La première brique à cet ambitieux édifice est le test unitaire. Mais sait-on réellement écrire des tests unitaires pertinents, qui ont du sens, qui couvrent correctement le code de notre application ?

En Java, il existe pas mal de frameworks de tests permettant de mettre une couverture de tests en place.

Pour répondre aux questions ci-dessus, +David Gageot  a créé deux formations permettant d’apprendre ou de se perfectionner dans ce domaine :
– les tests de A à Z
– Bootcamp tests / TDD

Ces deux formations sont respectivement dispensées sur 2 et 4 jours.
L’objectif de ces formations est d’apprendre ou se perfectionner dans l’art d’écrire des tests unitaires (entre autres).

Vous trouverez tous les détails sur le lien attaché à ce post.

N’hésitez pas à tester 😉

#java   #formation   #test   #unitaire  

PowerMock

 

Les tests unitaires sont un point central dans un projet informatique; Ils garantissent (en partie) la stabilité du code couvert.
Ils doivent avertir le développeur d'un changement de comportement d’une portion de code. Dans certain cas ce changement est normal car une règle métier a changée;dans d'autre cas cela peut être dû à un impact collatéral sur composant, à priori, sans rapport avec l'évolution qui vient d'être faite.
 
Avoir une couverture de test unitaire la plus large possible sur l'ensemble du code de notre application permet de se prémunir des régression potentielle.
 
La famille des outils permettant d'écrire des tests unitaires est assez grande. On y trouve différents frameworks permettant d'adresser l'ensemble des contraintes que l'on peut rencontrer lorsque l'on écrit des tests unitaires.

Dans les applications que nous développons, nous travaillons généralement avec des APIs externes, du code legacy, etc.
Ce type de code, sur lequel nous n’avons pas forcément la main, peut poser des problèmes lors de l’écriture d’un test unitaire dépendant de ces composants.
Dans les bonnes pratiques d’écriture de test unitaire, il faut bouchonner (mocker) tout ce qui n’est pas directement lié au code à tester.

Pour cela, on utilise des frameworks de mock comme : 
– EasyMock,
– Mockito,
– JMock.

Ce sont les plus connus. Avec ces outils on pourra bouchonner : 

– Tous les composants fournissant une interface,
– Aussi les composants basés sur des classes non finale.

Sur ces bouchons on ajoutera des comportements permettant de positionner un contexte d’exécution au test unitaire cible. Les comportements seront du type :

Lorsque tu appelles telle méthode de ma classe, renvoies moi tel objet
Cette méthode ne jamais être appelée
Cette méthode doit être appelée au moins N fois

Bon c’est un tout petit rappel sur la mission attribuée à un framework de mock.

Malgré les possibilités offertes par ces frameworks, il existe des limitations : 

– Mocker une classe déclarée finale,
– Mocker des méthodes déclarées privées,
– Mocker des méthodes statique,
– By-passer le constructeur d’une classe,
– Mocker partiellement une classe.

Toutes ces problématiques sont adressées par PowerMock et de manière très élégante.
En effet, à l’aide de deux annotations, toute la puissance de l’outil se retrouve dans vos tests unitaires et vous évite d’installer pas mal de plomberie pour pouvoir tester dans de bonnes conditions votre code.

PowerMock s’intégre parfaite (des extensions sont proposées) avec EasyMock, Mockito et aussi TestNG.

La dernière release du projet a été faite au mois de mai de cette année.
Le wiki fournit beaucoup de documentation et d’exemples, ce qui permet de prendre l’outil en main très rapidement.

Je pense qu’il apporte un vrai plus dans l’écriture de test unitaire. Il repousse les limites imposées par le langage et permet de rendre nos tests beaucoup plus robuste et exhaustif.

Mettez les bouchons doubles! 🙂 

Il existe, dans le même registe, JDave : http://jdave.org/

#java #test #mockito #powermock #mock #test #unitaire

DumdSter : Email testing

 

Toutes les applications sur lesquelles nous travaillons ont toujours le besoin d’émettre des mails.
En règle générale, ces mails servent à notifier ou informer des utilisateurs. 
Bien souvent, le contenu du mail est dynamique, ainsi que les paramètres d’envoi tels que l’émetteur, le destinataire, le sujet, etc…
Bien entendu, la gestion des mails est assurée par un composant générique, développé par nos soins ou dans 95% des cas, fourni par un framework tiers (ex: Spring).

Associé à ce coté dynamique, on a des règles métier. Je pense que vous voyez où je veux en venir.
Afin de garantir la cohérence par rapport à ces règles et surtout détecter les régressions en cas d’évolution, il est impératif d’écrire les tests unitaires et d’intégration qui vont bien.

Tester un envoi de mail, n’est pas toujours évident dans le sens où le résultat produit est un mail qu’il faut réussir à intercepter une fois qu’il a été construit et envoyé.

Dumbster est un outil permettant d’adresser ce besoin de manière efficace et très simple.
L‘objectif est de permettre au sein d’un test unitaire/test d’intégration de démarrer un serveur SMTP afin d’intercepter les mails envoyés.
Le fait d’avoir un serveur de ce type à disposition facilite grandement les choses. 

La mise en place sur un projet est d’une simplicité déconcertante. Elle se résume aux étapes suivantes : 
– ajouter la dépendance dans votre pom (ou dans le classpath pour un projet non mavenisé)
– démarrer le serveur smtp au début du test (1 ligne)
– envoyer vos mails
– récupérer vos mails (1 ligne)
– traiter le résultats avec vos assertions
– arrêter le serveur smtp (1 ligne).

Sans exagération, ce n’est pas plus compliqué que cela. Il n’y a aucune configuration à faire.
Plus concrètement, voici un exemple de code mettant en œuvre l’outil. 

SimpleSmtpServer server = SimpleSmtpServer.start();

// envoi des mails

// récupération du nombre de messages reçus par le serveur
int receivedEmailSize = server.getReceivedEmailSize();

// récupération des emails de manière effective
Iterator emails = server.getReceivedEmail();

//traitement des mails reçus

SimpleSmtpServer.stop();

Cela ne nécessite pas plus de travail que cela.

Ce projet va bientôt avoir 10 ans d'existence, la dernière release a été faite en novembre 2005. Il ne semble plus y avoir beaucoup d’activité sur le projet, cependant le service rendu par cet outil est précis et fonctionne bien.

Étant donné l'âge de l’outil, bon nombre d’entre vous connaissent probablement déjà l’outil ; dans ce cas n’hésitez pas à donner vos impressions sur l’outil.

#java #smtp #test #fake #integration

Devoxx France : FluentLenium, une autre façon de faire du Selenium

+Mathilde Rigabert Lemée nous a présenté, lors d’un quickie (session au format de 15mn) le framework FluentLenium.
Il a été inspiré par des outils comme Geb (Groovy) et Capybara (Ruby).

L’objectif de ce framework est de venir simplifier et rendre “fluent” l’écriture d’un test Selenium.
Il utilise toute la puissance des sélecteurs de CSS1, CSS2, CSS3 (dans la limite des possibilités offertes par Sélénium) pour l’écriture de tests.

Elle nous a aussi expliqué les bonnes pratiques à mettre en œuvre avec cet outil, notamment la notion de FluentPage qui permet de fournir des informations essentielles sur le contexte du test. Ceci en opposition à un test sélénium qui, par son coté verbeux, dilue ces informations.

Cet outil intègre des frameworks d’assertion connus du marché comme Fest-assert, Hamcrest, Junit assertion.

Actuellement, il est en cours d’intégration avec le framework Play 2.0.

Ce projet est hébergé sur GitHub, je vous recommande d’aller y faire un tour pour tester ce outil ou alors pour contribuer au projet.

#java #selenium #fluentlenium #dsl #test

XmlUnit

Dans la famille Unit, j’avais déjà évoqué DBUnit et MoreUnit. Aujourd’hui, je vais vous présenter XMLUnit.
Cet outil est une extension du célèbre framework de tests JUnit.
Cette extension, comme son nom l’indique, offre la possibilité d’effectuer des tests sur la vérification et la validation de fichiers au format XML.

Vous me direz sûrement : mais à quoi nous sert les DTDs et XSDs, sinon à faire ce travail de validation ? Et je vous répondrais que cette validation s’attache à vérifier uniquement la structure du document (si la balise A est bien avant la balise B et si l’attribut, obligatoire, est bien présent dans la balise Z).
XmlUnit nous permet d’aller plus loin et de vérifier le contenu du fichier XML.

Imaginons un service qui va émettre une requête au format XML. Pour créer cette requête, le système va extraire des données et les mettre en forme dans un fichier XML afin de pouvoir l’adresser au service concerné.

Pour couvrir le code générateur du fichier XML par des tests unitaires pertinents, il va falloir être capable de vérifier que le fichier généré est conforme en termes de structure et de données relativement aux spécifications du service.
A l’aide de XmlUnit, cette tâche va être simplifiée. Il faudra fournir en entrée un fichier XML représentant la requête attendue et le fichier qui a été généré par le système.

Ce que je viens d’écrire ci-dessus est la principale fonctionnalité du framework, mais celui-ci est aussi capable de :
– donner les différences entre deux fichiers XML (ce que nous venons de voir)
– d’effectuer une validation partielle d’un fichier XML (via une classe de Validator)
– de valider le résultat d’une transformation via XSLT (via une classe Transform)
– d’évaluer une expression XPath sur une partie d’un fichier XML (via une interface XpathEngine
– etc

XmlUnit est aussi capable de travailler avec du HTML.

Pour mettre en oeuvre cela, l’outil fournit une classe XMLTestCase et un jeu d’assertions dédiées à la validation XML.
Le site fournit pas mal d’exemples de la vraie vie, ce qui permet de monter rapidement en compétence.

C’est un des outils qu’il est toujours utile d’avoir dans sa trousse à outils.
La dernière release remonte à septembre 2009. Il existe aussi une version pour la plateforme .Net (dernière release avril 2009)

#java #test #xml #unit

Java Puzzle

Qu’est ce qu’un Java Puzzle ?
Un Java Puzzle est une sorte de test permettant de challenger ses compétences en java. L’auteur du puzzle fournit un bout de code ainsi qu’un objectif à atteindre.
Le code contiendra une portion qui donne l’impression que l’objectif fixé est impossible à réaliser.
Les règles du jeu sont simples et pleines de bon sens. Elles sont au nombre de 5 :

1 – Le but est d'atteindre une ligne particulière dans le code proposé. Copier et modifier le code pour rendre la ligne accessible ne compte pas.
2 – Pour compiler et exécuter le programme, toutes les versions du JDK sont autorisées (sauf celles qui auraient pu être modifiées pour réussir le puzzle)
3 – Aucun argument n’est accepté sur la ligne de commande exceptée -Djava.security.manager
4 – La solution doit être contenue dans un seul fichier .java
5 – Il est interdit d’exploiter des failles de sécurité de java. Il est possible d’écrire n’importe quel type de code (même pas propre), du moment que les règles ci-dessus sont respectées.

L’idée est d’utiliser des astuces du langage, des comportements extrêmes de java pour parvenir à ses fins.

Dans le lien, vous trouverez plusieurs puzzles sur lesquels vous pourrez tester vos connaissances avancées du langage.

Apprendre en s’amusant, beau concept non ?

Enfin, sachez que +Joshua Bloch a écrit un livre rassemblant des java puzzles : http://www.javapuzzlers.com/

#java #puzzle #test #challenge

DBUnit

DBunit permet de fournir un contexte de base de données pour vos tests. Bien sûr, il existe des possibilités de mocker les sources de données externes afin de limiter les dépendances ; ceci est valable dans le cadre de tests unitaires. Lorsque l’on passe aux tests d’intégration, il est vraiment intéressant de décrire des cas réels.
C’est là que DBUnit intervient.

Cet outil vous permettra de charger un ensemble de données cohérent dans votre base de données pour lancer vos tests. Une fois les tests terminés, la base de données retrouvera son état initial. L’objectif est de s’assurer qu’à chaque campagne de test, la base de données contienne les données nécessaires pour assurer un contexte d'exécution fiable pour les cas de test.

La création des jeux de tests se fait de 2 manières :
– soit manuellement en écrivant les fichiers xml,
– soit en exportant les données depuis la base vers des fichiers au format xml.

Il s’intègre avec Maven au travers d’un plugin.

Bien que le projet n’ait pas évolué depuis 2010, les fonctionnalités qu’il propose sont vraiment très utiles et ont toutes leur place dans votre boîte à outils.

#java #test #integration #dbunit #db

Créez un site Web ou un blog gratuitement sur WordPress.com.

Retour en haut ↑

Concevoir un site comme celui-ci avec WordPress.com
Commencer