From e546907d4ef0db94b755db25a92ed785df091d1c Mon Sep 17 00:00:00 2001 From: Arnaud Tournier Date: Tue, 1 Aug 2017 13:12:42 +0200 Subject: [PATCH] yop --- formation-programmation-java/cours-javaee.ad | 18 +++++++- .../cours-javaee.html | 43 ++++++++++++++++++- 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/formation-programmation-java/cours-javaee.ad b/formation-programmation-java/cours-javaee.ad index 03c0dad..20f7ed1 100644 --- a/formation-programmation-java/cours-javaee.ad +++ b/formation-programmation-java/cours-javaee.ad @@ -1342,7 +1342,7 @@ Maven utilise cette convention pour exécuter automatiquement les tests se trouv Pour un projet maven, c'est le plugin `surefire` qui est en charge des tests (dans la phase _test_). -=== JUnit 4 +=== JUnit 4 - Annotations Un ensemble d'annotations (package `org.junit`) est utilisé pour configurer une classe de test : @@ -1356,7 +1356,12 @@ Un ensemble d'annotations (package `org.junit`) est utilisé pour configurer une |`@Before`, `@After` |Méthode exécutée avant et après chaque test +|=== + +=== Annotations +[cols="2*"] +|=== |`@BeforeClass`, `@AfterClass` |Méthode exécutée avant et après l'initialisation de la classe de tests. Doivent être _statique_. @@ -1366,7 +1371,7 @@ Un ensemble d'annotations (package `org.junit`) est utilisé pour configurer une |`@Test(expected=SQLException.class)` |Le test échoue si l'exception n'est pas levée -|`@Test(timeouot=100)` +|`@Test(timeout=100)` |Le test échoue s'il ne termine pas en moins de 100ms. |=== @@ -1386,6 +1391,14 @@ Les assertions de JUnit sont des méthodes statiques de la classe `org.junit.Ass |`assertTrue(message, condition)` |Vérifie que `condition` est vrai +|=== + +=== Assertions + +[cols="2*"] +|=== +|Méthode +|Description |`assertFalse(...)` |Vérifie que la condition est fausse @@ -1406,6 +1419,7 @@ Le framework JUnit est disponible sur Maven Central : junit junit 4.12 + test ---- diff --git a/formation-programmation-java/cours-javaee.html b/formation-programmation-java/cours-javaee.html index d2b16b4..c1a2e8b 100644 --- a/formation-programmation-java/cours-javaee.html +++ b/formation-programmation-java/cours-javaee.html @@ -393,6 +393,47 @@

Les données sont gérées de manière transactionnelle.

Cet aspect transactionnel est pris en charge par les EJB.

+

Tester son code

Définition

Code qui exécute un autre code pour valider son comportement et/ou son état.

+

Utilité : validation automatique, détection des régressions, documentation, indication de performance.

+

Différentes catégories de test

  • Tests unitaires : valide une partie très spécifique de l’application, en général une classe ou une méthode. On simule parfois l’environnement du code à tester (mock).

  • Tests d’intégration : on valide le comportement de l’application dans son ensemble. On déploie l’application dans un environnement conforme à la production et on teste par les bouts.

  • Tests de performance : s’assurer des bonnes performances de l’application (throughput, req/s, …​).

+

On distingue deux autres catégories : tests d'état et tests comportementaux.

Outils pour les tests

JUnit

+

TestNG

JUnit

junit.org

+

Dépôt Git Hub.

Exemple

public class MyTests {
+    @Test
+    public void multiplicationOfZeroIntegersShouldReturnZero() {
+        MyClass tester = new MyClass(); // MyClass is tested
+
+        // assert statements
+        assertEquals("10 x 0 must be 0", 0, tester.multiply(10, 0));
+        assertEquals("0 x 10 must be 0", 0, tester.multiply(0, 10));
+        assertEquals("0 x 0 must be 0", 0, tester.multiply(0, 0));
+    }
+}

Conventions

Les classes de test pour un projet maven se trouvent dans src/test/java. +Les resources de test dans src/test/resources.

+

Il est courant d’ajouter le suffixe Test aux noms des classes de tests. +Maven utilise cette convention pour exécuter automatiquement les tests se trouvant dans le bon répertoire.

+

Pour un projet maven, c’est le plugin surefire qui est en charge des tests (dans la phase test).

JUnit 4

Un ensemble d’annotations (package org.junit) est utilisé pour configurer une classe de test :

+

Annotation

Description

@Test

Identifie une méthode de test

@Before, @After

Méthode exécutée avant et après chaque test

@BeforeClass, @AfterClass

Méthode exécutée avant et après l’initialisation de la classe de tests. Doivent être statique.

@Ignore

Ignore un test

@Test(expected=SQLException.class)

Le test échoue si l’exception n’est pas levée

@Test(timeouot=100)

Le test échoue s’il ne termine pas en moins de 100ms.

Assertions

Pour valider un test, on utilise les assertions de JUnit. Une assertion non validée dans un test positionne le test en échec.

+

Les assertions de JUnit sont des méthodes statiques de la classe org.junit.Assert.

+

Méthode

Description

fail(message)

Fait échouer le test

assertTrue(message, condition)

Vérifie que condition est vrai

assertFalse(…​)

Vérifie que la condition est fausse

assertEquals(message, expected, actual)

Vérifie que actual est égal à expected

+

assertSame(), assertNotSame(), assertNull(), assertNotNull()…​

Utilisation avec Maven

Le framework JUnit est disponible sur Maven Central :

+
<dependency>
+    <groupId>junit</groupId>
+    <artifactId>junit</artifactId>
+    <version>4.12</version>
+</dependency>

Exemple

Voici un exemple de mise en place de test unitaire.

Mocking

Parfois, il n’est pas possible d’isoler complètement une classe du reste de l’application (tout est lié).

+

On a alors recours à des outils de mock qui permettent de remplacer les dépendances du code à tester +par des bouchons simulant l’environnement du test (voir le framework Mockito).

Tests d’intégration

Ceux-ci sont les plus difficiles à mettre en place car il faut déployer +l’application dans un environnement équivalent à celui de production (base de donnée, configuration, clustering, …​).

Arquillian

Arquillian (site) est un outil qui facilite la mise en place des tests d’intégration :

+
  • Gère le lancement et l’arrêt d’un AS complet.

  • Produit une archive contenant le code à tester à la volée.

  • Déploie l’archive dans le conteneur de test.

  • Exécute les tests d’intégration.

  • Produit un rapport d’exécution.

+

S’intègre à JUnit et TestNG.

+

Avantanges : on n’a plus besoin de mocker les dépendances, tout est en place !

+

Inconvénients : lent puisque qu’on bootstrappe tout l’environnement de l’application.

Exemple

Voici un guide de mise en place de test d’intégration avec +Arquillian. On lance un Wildfly embarqué pour être 'iso-prod'.

+

Voir ce projet pour un exemple concret de mise en place.

Tests de performance

S’assurer des bonnes performances de l’application :

+
  • nombre de requêtes par seconde,

  • latence,

  • capacité de traitement,…​

+

Exemple d’outil : gatling.io[Gatling].

Couverture de code

En général on veut s’assurer que l’ensemble des tests (unitaires et intégration) couvrent l’ensemble du code applicatif.

+

Exemple : mettre en place Mockito.

CDI

Contextual Dependency Injection

Pour fonctionner un composant a besoin d’autres composants, ceux sont ses dépendances.

Les composants ne sont plus responsables de récupérer ces dépendances (eg. instances, services statiques, etc…​) car c’est l’outil de gestion des dépendances qui s’en charge pour eux.

Weld est l’implémentation de référence de la norme CDI, réalisé par RedHat.

Java EE 6, CDI 1.0, Weld 1.1 Java EE 7, CDI 1.2, Weld 2.4 JAVA EE 8, CDI 2.0, Weld 3.0

Pour JBoss, la dépendance Maven est la suivante :

<groupId>javax.enterprise</groupId>
@@ -403,7 +444,7 @@
 </dependency>

===

Beans sans constructeur par défaut sont toujours des bean si le constructeur est annoté avec @Inject

Annotation @Inject : applicable à un constructeur, méthode ou attribut pour déclencher l’injection de dépendance et indiquer à CDI d’utiliser ce constructeur pour créer les instances de ce bean.

Le conteneur CDI choisit l’objet à injecter en fonction du type du point d’injection et ne prend pas en compte le nom du champ, de la méthode ou du paramètre.

Définition du bean

  • classe qui contient de la logique applicative,

  • appelé directement depuis du code Java, ou bien depuis des expressions EL,

  • a accès aux ressources transactionnelles,

  • les dépendances entre beans sont gérées par le conteneur d’application,

  • la plupart des beans sont stateful et contextuels,

  • son cycle de vie est géré par le conteneur.

-

Important : contextuel et cycle de vie géré par l’AS.

Définition

Plus formellement :

+

Important : contextuel et cycle de vie géré par l’AS.

Définition

Plus formellement :

A bean comprises the following attributes:

  • A (nonempty) set of bean types

  • A (nonempty) set of qualifiers

  • A scope

  • Optionally, a bean EL name

  • A set of interceptor bindings

  • A bean implementation

Types du bean

public class BookShop
       extends Business