Skip to content

Commit

Permalink
yop
Browse files Browse the repository at this point in the history
  • Loading branch information
ltearno committed Aug 1, 2017
1 parent 609bb06 commit e546907
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 3 deletions.
18 changes: 16 additions & 2 deletions formation-programmation-java/cours-javaee.ad
Original file line number Diff line number Diff line change
Expand Up @@ -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 :

Expand All @@ -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_.

Expand All @@ -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.
|===

Expand All @@ -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
Expand All @@ -1406,6 +1419,7 @@ Le framework JUnit est disponible sur Maven Central :
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
----

Expand Down
43 changes: 42 additions & 1 deletion formation-programmation-java/cours-javaee.html
Original file line number Diff line number Diff line change
Expand Up @@ -393,6 +393,47 @@
<div class="ulist"><ul><li><p>Présentation,</p></li><li><p>Métier,</p></li><li><p>Données.</p></li></ul></div>
<div class="paragraph"><p>Les données sont gérées de manière transactionnelle.</p></div>
<div class="paragraph"><p>Cet aspect transactionnel est pris en charge par les EJB.</p></div></section></section>
<section><section id="_tester_son_code"><h2>Tester son code</h2></section><section id="_définition_2"><h2>Définition</h2><div class="paragraph"><p>Code qui exécute un autre code pour valider son comportement et/ou son état.</p></div>
<div class="paragraph"><p>Utilité : validation automatique, détection des régressions, documentation, indication de performance.</p></div>
<div class="paragraph"><p><a href="http://www.vogella.com/tutorials/JUnit/article.html">Introduction aux tests</a>.</p></div></section><section id="_différentes_catégories_de_test"><h2>Différentes catégories de test</h2><div class="ulist"><ul><li><p>Tests unitaires : valide une partie très spécifique de l&#8217;application, en général une classe ou une méthode. On simule parfois l&#8217;environnement du code à tester (<em>mock</em>).</p></li><li><p>Tests d&#8217;intégration : on valide le comportement de l&#8217;application dans son ensemble. On <em>déploie</em> l&#8217;application dans un environnement conforme à la production et on teste par les <em>bouts</em>.</p></li><li><p>Tests de performance : s&#8217;assurer des bonnes performances de l&#8217;application (<em>throughput</em>, <em>req/s</em>, &#8230;&#8203;).</p></li></ul></div>
<div class="paragraph"><p>On distingue deux autres catégories : tests d'<em>état</em> et tests <em>comportementaux</em>.</p></div></section><section id="_outils_pour_les_tests"><h2>Outils pour les tests</h2><div class="paragraph"><p>JUnit</p></div>
<div class="paragraph"><p>TestNG</p></div></section><section id="_junit"><h2>JUnit</h2><div class="paragraph"><p>junit.org</p></div>
<div class="paragraph"><p>Dépôt <a href="https://github.com/junit-team/junit">Git Hub</a>.</p></div></section><section id="_exemple_6"><h2>Exemple</h2><div class="listingblock"><div class="content"><pre class="highlight"><code class="java language-java">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));
}
}</code></pre></div></div></section><section id="_conventions"><h2>Conventions</h2><div class="paragraph"><p>Les classes de test pour un projet <em>maven</em> se trouvent dans <code>src/test/java</code>.
Les resources de test dans <code>src/test/resources</code>.</p></div>
<div class="paragraph"><p>Il est courant d&#8217;ajouter le suffixe <code>Test</code> aux noms des classes de tests.
Maven utilise cette convention pour exécuter automatiquement les tests se trouvant dans le bon répertoire.</p></div>
<div class="paragraph"><p>Pour un projet maven, c&#8217;est le plugin <code>surefire</code> qui est en charge des tests (dans la phase <em>test</em>).</p></div></section><section id="_junit_4"><h2>JUnit 4</h2><div class="paragraph"><p>Un ensemble d&#8217;annotations (package <code>org.junit</code>) est utilisé pour configurer une classe de test :</p></div>
<table class="tableblock frame-all grid-all" style="width:100%"><colgroup><col style="width:50%"><col style="width:50%"></colgroup><tbody><tr><td class="tableblock halign-left valign-top"><p class="tableblock">Annotation</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Description</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock"><code>@Test</code></p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Identifie une méthode de test</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock"><code>@Before</code>, <code>@After</code></p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Méthode exécutée avant et après chaque test</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock"><code>@BeforeClass</code>, <code>@AfterClass</code></p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Méthode exécutée avant et après l&#8217;initialisation de la classe de tests. Doivent être <em>statique</em>.</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock"><code>@Ignore</code></p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Ignore un test</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock"><code>@Test(expected=SQLException.class)</code></p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Le test échoue si l&#8217;exception n&#8217;est pas levée</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock"><code>@Test(timeouot=100)</code></p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Le test échoue s&#8217;il ne termine pas en moins de 100ms.</p></td></tr></tbody></table></section><section id="_assertions"><h2>Assertions</h2><div class="paragraph"><p>Pour valider un test, on utilise les assertions de JUnit. Une assertion non validée dans un test positionne le test en échec.</p></div>
<div class="paragraph"><p>Les assertions de JUnit sont des méthodes statiques de la classe <code>org.junit.Assert</code>.</p></div>
<table class="tableblock frame-all grid-all" style="width:100%"><colgroup><col style="width:50%"><col style="width:50%"></colgroup><tbody><tr><td class="tableblock halign-left valign-top"><p class="tableblock">Méthode</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Description</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock"><code>fail(message)</code></p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Fait échouer le test</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock"><code>assertTrue(message, condition)</code></p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Vérifie que <code>condition</code> est vrai</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock"><code>assertFalse(&#8230;&#8203;)</code></p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Vérifie que la condition est fausse</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock"><code>assertEquals(message, expected, actual)</code></p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Vérifie que <code>actual</code> est égal à <code>expected</code></p></td></tr></tbody></table>
<div class="paragraph"><p><code>assertSame()</code>, <code>assertNotSame()</code>, <code>assertNull()</code>, <code>assertNotNull()</code>&#8230;&#8203;</p></div></section><section id="_utilisation_avec_maven"><h2>Utilisation avec Maven</h2><div class="paragraph"><p>Le framework JUnit est disponible sur Maven Central :</p></div>
<div class="listingblock"><div class="content"><pre class="highlight"><code>&lt;dependency&gt;
&lt;groupId&gt;junit&lt;/groupId&gt;
&lt;artifactId&gt;junit&lt;/artifactId&gt;
&lt;version&gt;4.12&lt;/version&gt;
&lt;/dependency&gt;</code></pre></div></div></section><section id="_exemple_7"><h2>Exemple</h2><div class="paragraph"><p>Voici un <a href="http://www.vogella.com/tutorials/JUnit/article.html#exercise-using-junit">exemple</a> de mise en place de test unitaire.</p></div></section><section id="_mocking"><h2>Mocking</h2><div class="paragraph"><p>Parfois, il n&#8217;est pas possible d&#8217;isoler complètement une classe du reste de l&#8217;application (tout est lié).</p></div>
<div class="paragraph"><p>On a alors recours à des outils de <em>mock</em> qui permettent de remplacer les dépendances du code à tester
par des <em>bouchons</em> simulant l&#8217;environnement du test (voir le framework <a href="http://site.mockito.org/">Mockito</a>).</p></div></section><section id="_tests_d_intégration"><h2>Tests d&#8217;intégration</h2><div class="paragraph"><p>Ceux-ci sont les plus difficiles à mettre en place car il faut <em>déployer</em>
l&#8217;application dans un environnement <em>équivalent</em> à celui de production (base de donnée, configuration, clustering, &#8230;&#8203;).</p></div></section><section id="_arquillian"><h2>Arquillian</h2><div class="paragraph"><p><em>Arquillian</em> (<a href="http://arquillian.org/invasion/">site</a>) est un outil qui facilite la mise en place des tests d&#8217;intégration :</p></div>
<div class="ulist"><ul><li><p>Gère le lancement et l&#8217;arrêt d&#8217;un AS complet.</p></li><li><p>Produit une archive contenant le code à tester à la volée.</p></li><li><p>Déploie l&#8217;archive dans le conteneur de test.</p></li><li><p>Exécute les tests d&#8217;intégration.</p></li><li><p>Produit un rapport d&#8217;exécution.</p></li></ul></div>
<div class="paragraph"><p>S&#8217;intègre à <code>JUnit</code> et <code>TestNG</code>.</p></div>
<div class="paragraph"><p>Avantanges : on n&#8217;a plus besoin de mocker les dépendances, tout est en place !</p></div>
<div class="paragraph"><p>Inconvénients : lent puisque qu&#8217;on bootstrappe tout l&#8217;environnement de l&#8217;application.</p></div></section><section id="_exemple_8"><h2>Exemple</h2><div class="paragraph"><p>Voici un <a href="http://arquillian.org/guides/testing_java_persistence/">guide</a> de mise en place de test d&#8217;intégration avec
Arquillian. On lance un Wildfly embarqué pour être 'iso-prod'.</p></div>
<div class="paragraph"><p>Voir ce <a href="https://github.com/ltearno/BibliothequeAudio">projet</a> pour un exemple concret de mise en place.</p></div></section><section id="_tests_de_performance"><h2>Tests de performance</h2><div class="paragraph"><p>S&#8217;assurer des bonnes performances de l&#8217;application :</p></div>
<div class="ulist"><ul><li><p>nombre de requêtes par seconde,</p></li><li><p>latence,</p></li><li><p>capacité de traitement,&#8230;&#8203;</p></li></ul></div>
<div class="paragraph"><p>Exemple d&#8217;outil : gatling.io[Gatling].</p></div></section><section id="_couverture_de_code"><h2>Couverture de code</h2><div class="paragraph"><p>En général on veut s&#8217;assurer que l&#8217;ensemble des tests (unitaires et intégration) couvrent l&#8217;ensemble du code applicatif.</p></div>
<div class="paragraph"><p>Exemple : mettre en place <a href="http://site.mockito.org/">Mockito</a>.</p></div></section></section>
<section><section id="_cdi"><h2>CDI</h2><div class="paragraph"><p>Contextual Dependency Injection</p></div><div class="paragraph"><p>Pour fonctionner un composant a besoin d&#8217;autres composants, ceux sont ses <em>dépendances</em>.</p></div><div class="paragraph"><p>Les composants ne sont plus responsables de récupérer ces dépendances (eg. instances, services statiques, etc&#8230;&#8203;) car c&#8217;est l&#8217;outil de <em>gestion des dépendances</em> qui s&#8217;en charge pour eux.</p></div><div class="paragraph"><p><code>Weld</code> est l&#8217;implémentation de référence de la norme CDI, réalisé par <em>RedHat</em>.</p></div><div class="paragraph"><p>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</p></div><div class="paragraph"><p>Pour JBoss, la dépendance Maven est la suivante :</p></div><div class="listingblock"><div class="content"><pre class="highlight"><code class="java language-java">&lt;groupId&gt;javax.enterprise&lt;/groupId&gt;
Expand All @@ -403,7 +444,7 @@
&lt;/dependency&gt;</code></pre></div></div><div class="paragraph"><p>Doc : <a href="https://docs.jboss.org/weld/reference/1.0.0/en-US/html/beanscdi.html" class="bare">https://docs.jboss.org/weld/reference/1.0.0/en-US/html/beanscdi.html</a></p></div><div class="paragraph"><p>===</p></div><div class="paragraph"><p>Beans sans constructeur par défaut sont toujours des bean si le constructeur est annoté avec <code>@Inject</code></p></div><div class="paragraph"><p>Annotation <code>@Inject</code> : applicable à un constructeur, méthode ou attribut pour déclencher l&#8217;injection
de dépendance et indiquer à CDI d&#8217;utiliser ce constructeur pour créer les instances de ce bean.</p></div><div class="paragraph"><p>Le conteneur CDI choisit l&#8217;objet à injecter en fonction du type du point d&#8217;injection et ne prend pas
en compte le nom du champ, de la méthode ou du paramètre.</p></div></section><section id="_définition_du_bean"><h2>Définition du bean</h2><div class="ulist"><ul><li><p>classe qui contient de la logique applicative,</p></li><li><p>appelé directement depuis du code Java, ou bien depuis des expressions EL,</p></li><li><p>a accès aux ressources transactionnelles,</p></li><li><p>les dépendances entre beans sont gérées par le conteneur d&#8217;application,</p></li><li><p>la plupart des beans sont <em>stateful</em> et <em>contextuels</em>,</p></li><li><p>son cycle de vie est géré par le conteneur.</p></li></ul></div>
<div class="paragraph"><p>Important : <strong>contextuel</strong> et <strong>cycle de vie géré par l&#8217;AS</strong>.</p></div></section><section id="_définition_2"><h2>Définition</h2><div class="paragraph"><p>Plus formellement :</p></div>
<div class="paragraph"><p>Important : <strong>contextuel</strong> et <strong>cycle de vie géré par l&#8217;AS</strong>.</p></div></section><section id="_définition_3"><h2>Définition</h2><div class="paragraph"><p>Plus formellement :</p></div>
<div class="paragraph"><p>A bean comprises the following attributes:</p></div>
<div class="ulist"><ul><li><p>A (nonempty) set of bean types</p></li><li><p>A (nonempty) set of qualifiers</p></li><li><p>A scope</p></li><li><p>Optionally, a bean EL name</p></li><li><p>A set of interceptor bindings</p></li><li><p>A bean implementation</p></li></ul></div></section><section id="_types_du_bean"><h2>Types du bean</h2><div class="listingblock"><div class="content"><pre class="highlight"><code class="java language-java">public class BookShop
extends Business
Expand Down

0 comments on commit e546907

Please sign in to comment.