163
Formation « Total Tests »

Formation Total Tests Chez IPPON Enterprise Java Delivery

Embed Size (px)

DESCRIPTION

Formation Total Tests Chez IPPON Enterprise Java Delivery

Citation preview

  • Formation Total Tests

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Licence Cette formation vous est fournie sous licence Creative Commons Attribution-

    NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0) Vous tes libres de :

    copier, distribuer et communiquer le matriel par tous moyens et sous tous formats Selon les conditions suivantes :

    Attribution : Vous devez crditer l'Oeuvre, intgrer un lien vers la licence et indiquer si des modifications ont t effectues l'Oeuvre. Vous devez indiquer ces informations par tous les moyens possibles mais vous ne pouvez pas suggrer que l'Offrant vous soutient ou soutient la faon dont vous avez utilis son Oeuvre.

    Pas dUtilisation Commerciale : Vous n'tes pas autoriser faire un usage commercial de cette Oeuvre, tout ou partie du matriel la composant.

    Pas de modifications : Dans le cas o vous effectuez un remix, que vous transformez, ou crez partir du matriel composant l'Oeuvre originale, vous n'tes pas autoris distribuer ou mettre disposition l'Oeuvre modifie.

    http://creativecommons.org/licenses/by-nc-nd/4.0/deed.fr

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Sommaire Jour 1

    Garantir la qualit de son code avec les tests (5h) Introduction aux tests Les stubs Les mocks Les assertions Les tests d'intgration Le TDD / le BDD TP 1 : exercice sur le TDD/BDD TP 2 : utilisation des stubs/mocks/tests d'intgration

    Sonar, tests automatiss et couverture de test (2h) L'outillage TP : installation de Sonar et analyse d'un projet

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Sommaire Jour 2

    Les tests de performance (2,5h) Problmes habituels de performance Gatling vs JMeter Monitoring et profiling TP : Ralisation d'un plan de test et dcouverte de 3

    problmes classiques Les tests fonctionnels classiques (2,5h)

    Prsentation de Selenium TP : Ralisation d'un plan de test avec Selenium

    Les tests fonctionnels modernes (2h) Prsentation d'AngularJS, Karma et phantom.js TP : Ralisation d'un test avec Karma

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Objectifs Comprendre l'intrt d'une mthodologie

    pilote par les tests Comprendre les diffrents types de tests :

    stubs, mocks, tests d'intgration, etc... Connatre les principales APIs Avoir une vue d'ensemble des pratiques et

    outils disponibles

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Installation des TPs L'installation des TPs ncessite de tlcharger

    des dpendances Maven A la racine des TPs, lisez le fichier README Excutez mvn dependency:go-offline pour tout

    tlcharger (cela va prendre du temps) Excutez mvn clean compile

    Les TPs sont tous de la mme forme Un projet exercice avec la racine un fichier

    README vous expliquant l'exercice raliser Un projet solution avec la solution Vous pouvez tricher en faisant un diff des deux

    projets

  • Jour 1 : garantir la qualit de son code

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Pourquoi faire des tests ? Les tests permettent

    D'viter les bugs D'avoir le courage de refactorer De mieux coder

    Et surtout ils facilitent la maintenance Plus vous voyez un bug tardivement, plus il vous

    cotera cher Sur la dure, faire des tests doit coter moins cher

    que de ne pas en faire !

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Objectifs des tests Les tests doivent couvrir un maximum de

    lignes de code de lapplication Il ne sagit pas de tout tester, mais

    de bien tester les lignes importantes Si une mthode utilise des

    branchements conditionnels, il faut plusieurs tests pour valider tous les cas possibles

    Ces tests doivent tre rapides et automatiss

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Tests unitaires contre tests dintgration

    Il y a deux types de tests Test dun composant unique (mtier ou technique),

    en isolation du reste des autres composants : ce sont les tests unitaires Cela exclut lutilisation de Spring, Hibernate, etc

    Test dun ensemble de composants dans un environnement comparable la production : ce sont les tests dintgration Cela inclut lutilisation de Spring, etc, sans doute avec

    une configuration dinfrastructure spcifique Les tests unitaires et les tests dintgration ne

    sont pas exclusifs : il faut utiliser les deux conjointement pour bien tester

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Tests unitaires Les tests unitaires permettent de tester une

    mthode ou une classe en isolation du reste de lapplication D'o le succs des architectures bases sur

    Spring IoC : les composants n'ont pas de lien en dur les

    uns vers les autres AOP : une seule fonctionnalit par mthode. Par

    exemple, pas de code technique grant la scurit ou les transactions

    Une mthode = une fonctionnalit

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Exemple de test simple JUnit permet de lancer facilement toutes les

    mthodes marques @Test Maven les lance ensuite dans sa phase test On utilise des assertions pour valider Astuce : les imports

    statiques permettent dutiliser directement les mthodes JUnit dans la classe tester

    @Testpublic void testEquals() { Todo todo1 = new Todo(); todo1.setTodoId("001"); Todo todo2 = new Todo(); todo2.setTodoId("001"); assertEquals(todo1, todo2); Todo todo3 = new Todo(); todo3.setTodoId("003"); assertNotSame(todo1, todo3);}

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Les assertions Les assertions servent valider une instance

    d'objet ou une valeur Par exemple, on va valider que le prnom de

    l'utilisateur est bien John JUnit fournit des assertions de base (galit,

    erreur, etc...) Mais pour raliser facilement des assertions

    complexes, mieux vaut s'quiper d'un outillage spcialis Hamcrest, FEST-Assert, AssertJ

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Quelques exemples d'assertions Ces assertions sont fournies par JUnit

    assertEquals assertSame assertTrue assertNotNull fail

    assertEquals(expected, printedCart);

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Hamcrest La librairie la plus ancienne, encore trs

    populaire Permet d'ajouter des Matchers Plus riche que les assertEquals de JUnit

    Teste des String, Collections, nombres, JavaBeans, ou mme equals et toString

    Simple tendre, pour crer vos propres Matchers mtier

    assertThat(expectedPrice, comparesEqualTo(shoppingCart.getNetPrice()));

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    FEST-Assert Se veut tre un successeur de Hamcrest, mais

    n'est plus activement dvelopp aujourd'hui Permet de faire le mme type de tests, mais

    avec une API fluent Plus simple coder avec son IDE (auto-

    compltion) Vous pouvez enchaner les assertions

    assertThat(shoppingCart.getNetPrice()) .isEqualByComparingTo(expectedPrice);

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    AssertJ La librairie la plus rcente, et actuellement la

    plus populaire C'est donc notre recommandation Fork de FEST-Assert, auquel il ressemble

    beaucoup

    assertThat(shoppingCart.getGrossPrice()) .isEqualByComparingTo(expectedPrice);

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Exemples avec AssertJ Test de la taille d'une collection

    Test de la prsence d'une instance dans la collection

    Enchanement d'assertions

    assertThat(userRepository.findAll()).contains(john);

    assertThat(userRepository.findAll()) .hasSize(2) .contains(john);

    assertThat(userRepository.findAll()).hasSize(2);

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Les fixtures Il est frquent d'avoir plusieurs tests qui

    utilisent le mme ensemble d'objets Crer des variables de classe (communes pour

    tous les tests) Annoter une mthode @Before pour initialiser les

    variables Annoter une mthode @After si vous voulez

    nettoyer des ressources aprs un test

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Exemple de fixture

    @Beforepublic void setup() { User user = new User(); user.setLogin("user"); user.setFirstName("John"); user.setLastName("Testeur"); user.setPassword("test"); userRepository.saveAndFlush(user);}

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Les suites de tests Il est utile de regrouper ses tests : un

    ensemble de tests est une Test Suite Permet de lancer tous les tests d'un coup depuis

    son IDE

    @RunWith(Suite.class)@Suite.SuiteClasses({ TestClass1.class, TestClass2.class})public class TestSuite { // Vide}

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Les plugins dans les IDEs JUnit est intgr dans tous les IDEs majeurs

    (Eclipse, Netbeans, Intellij) Un simple clic droit sur un test doit permettre de le

    lancer Vous devez aussi avoir une interface graphique

    spcialise pour voir l'volution des tests Vous devez pouvoir galement dbugger les tests

    directement, voire mme les profiler ou avoir leur couverture de code

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Exemple Exemple d'un test en erreur dans IntelliJ

    IDEA :

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Pause Questions/Rponses sur les notions de

    base que nous venons de voir Diffrence entre test unitaire et test d'intgration Assertions Utilisation dans un IDE

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Allons plus loin Pour l'instant nous n'avons vu que des tests

    simples Avec des objets Java basiques

    Dans un vrai projet, vous allez avoir des dpendances plus complexes Base de donnes, serveur JMS...

    Pour que votre test unitaire fonctionne, il va falloir bouchonner ces dpendances externes

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Astuce: comment injecter dans un champ ? (1/2)

    Pour tester unitairement un Bean Spring ayant des dpendances Il ne faut pas utiliser Spring (sinon ce ne serait plus un test

    unitaire) Il faut donc injecter manuellement ses dpendances

    Cette injection est vidente si lon utilise linjection par Setter ou par Constructeur

    Mais comment faire dans le cas d'une injection de dpendances dans un champ :

    @Injectprivate TodoListsService todoListsService

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Astuce: comment injecter dans un champ ? (2/2)

    Spring propose cet utilitaire :

    Il injecte une variable todoListsService dans le champ nomm todoListsService du Bean todosService

    Comme quoi les variables prives ne sont pas si prives que a...

    ReflectionTestUtils.setField(todosService,"todoListsService",todoListsService);

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Des Stubs ou des Mocks ? En Franais on confond les deux

    termes sous le nom de bouchon Ils sont ncessaires pour tester

    les dpendances, en particulier celles injectes par Spring

    Un Stub : une implmentation vide dune dpendance Exemple : pour un DAO, faire une implmentation

    qui naccde pas en base de donnes mais renvoie toujours les mmes valeurs

    Un Mock : une implmentation gnre par une librairie spcialise, qui la cre la vole en fonction de linterface respecter. Le mock vrifie galement le comportement (nombre d'appels, etc)

    http://martinfowler.com/articles/mocksArentStubs.html

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Exemple de Stub Le Stub implmente la mme interface que la

    dpendance injecte Le Stub peut tre une classe anonyme (exemple ci-

    dessous), pour viter de crer trop de fichiers Cela peut tre galement une vraie classe, afin de pouvoir

    le rutiliser sur plusieurs testsAccountService accountService = new AccountService();accountService.setUserService(new UserService() { public User getCurrentUser() { User user = new User(); user.setLogin("test"); user.setFirstName("Julien"); return user; }});assertEquals(accountService .getCurrentUser().getFirstName(), "julien");

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Choix d'un framework de Mock 3 frameworks principaux

    EasyMock JMock Mockito

    Mockito est aujourd'hui le plus populaire Syntaxe plus simple apprendre Plus concis

    EasyMock et Mockito peuvent tre tendus avec PowerMock Permet de mocker les mthodes statiques

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Utilisation de EasyMock EasyMock permet de gnrer

    automatiquement une implmentation partir dune interface

    Cette implmentation fonctionne ensuite comme un magntoscope : On liste les mthodes qui vont tre appeles : ce

    sont les mthodes expect() On dit ensuite EasyMock que lon va jouer ce

    scnario : cest la mthode replay() En fin de test, on demande EasyMock de valider

    que le scnario sest droul comme prvu : cest la mthode verify()

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Exemple de Mock avec EasyMock

    @Testpublic void testCreateTodo() { TodosService todosService = EasyMock.createMock(TodosService.class);

    TodoListsService todoListsService = EasyMock.createMock(TodoListsService.class); EntityManager em = EasyMock.createMock(EntityManager.class); ReflectionTestUtils.setField(todosService, "em", em); ReflectionTestUtils.setField(todosService, "todoListsService", todoListsService);

    TodoList todoList = new TodoList(); todoList.setListId("001"); todoList.setName("Test Todo List");

    ....

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Exemple de Mock avec EasyMock

    ....

    Todo todo = new Todo(); todo.setTodoId("0001"); todo.setDescription("Test description");

    EasyMock.expect(todoListsService.findTodoList("001")) .andReturn(todoList);

    todoListsService.updateTodoList(todoList); em.persist(todo); EasyMock.replay(em); EasyMock.replay(todoListsService); todosService.createTodo("001", todo); assertNotNull(todo.getCreationDate()); assertEquals(todoList, todo.getTodoList()); assertTrue(todoList.getTodos().contains(todo)); EasyMock.verify(em); EasyMock.verify(todoListsService);}

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Utilisation de Mockito Mockito reprend les principes d'EasyMock

    Gnration d'un Mock partir d'une classe ou interface

    Ajout des comportements prvus Vrification des attentes

    Son API est plus concise Il n'y a pas de phase de replay

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Exemple de Mock avec Mockito

    @Testpublic void testAdminAuthentication() {

    // mock repository UserRepository userRepository = mock(UserRepository.class);

    // stubbing when(userRepository.findOne("admin")).thenReturn(admin);

    // test UserDetails userDetails = userDetailsService.loadUserByUsername("admin");

    // verification verify(userRepository).findOne("admin");

    }

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Les mocks partiels avec Mockito

    Vous pouvez crer un mock partiel (appel spy ), permettant de simuler uniquement une mthode d'un objet existantList list = new LinkedList();List spy = spy(list);

    //optionally, you can stub out some methods:when(spy.size()).thenReturn(100);

    //using the spy calls real methodsspy.add("one");spy.add("two");

    //prints "one" - the first element of a listSystem.out.println(spy.get(0));

    //size() method was stubbed - 100 is printedSystem.out.println(spy.size());

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Les Mocks, en rsum Les Mocks sont aujourdhui trs populaires

    Ils vitent davoir coder des Stubs Ils sont plus simples maintenir que des Stubs : on ne

    code que les mthodes ncessaires au test Il est plus simple de les faire changer de comportement Ils permettent des tests plus puissants : on vrifie que les

    Mocks ont bien t appels comme on la dfini Ils restent plus complexes coder Il faut utiliser une librairie spcialise

    Mockito : https://github.com/mockito/mockito EasyMock : http://easymock.org/

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Les tests d'intgration On peut galement lancer des tests

    d'intgration depuis JUnit C'est un abus de langage de les appeler tests

    unitaires Mais il est commun de les catgoriser comme des

    tests unitaires : Ils sont lancs depuis JUnit mvn test ne permet pas non plus de faire la

    diffrence

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Rappel Il y a deux types de tests

    Test dun composant unique (mtier ou technique), en isolation du reste des autres composants : ce sont les tests unitaires

    Cela exclut lutilisation de Spring, Hibernate, etc Test dun ensemble de composants dans un

    environnement comparable la production : ce sont les tests dintgration

    Cela inclut lutilisation de Spring, JPA, etc... sans doute avec une configuration dinfrastructure spcifique

    Si vous utilisez Java EE, cela inclut votre serveur d'application

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Tests d'intgration avec Spring Les tests dintgration incluent Spring

    Avec un application context rduit, comprenant uniquement un ensemble de classes que lon veut tester

    Avec une configuration dinfrastructure spcifique : une base de donnes en mmoire ou une instance spcifique de la base de donnes cible

    Spring propose une intgration JUnit qui simplifie grandement ce type de configuration Les alternatives Spring ont gnralement des

    mcanismes similaires

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Support des tests dintgration dans Spring SpringJUnit4ClassRunner permet dintgrer Spring dans un

    test JUnit Lannotation @ContextConfiguration permet alors de localiser

    la configuration de Spring et de lancer lapplication context On peut ainsi tester son application Spring avec JUnit, sans

    serveur dapplications Toutes les fonctionnalits gres par Spring fonctionnent de

    manire identique : connexion la base de donnes, transactions...

    On peut activer le debugging et le profiling, qui peuvent tre faits directement dans lIDE

    Cest videmment beaucoup plus rapide excuter que de dployer lapplication sur un serveur dapplications

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Exemple de test dintgration@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations= {"classpath*:/META-INF/application-context-test.xml"})public class IntegrationTest { @Inject private UserService userService;

    @Test public void createUser() { User user = new User(); user.setLogin("test_user"); user.setFirstName("First name"); userService.createUser(user); User userFoundInDatabase = userService.findUser("test_user"); assertEquals("First name", userFoundInDatabase.getFirstName()); }}

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Utilisation avec Spring Boot Cette configuration est similaire avec Spring

    Boot, utilisant la configuration Java (souvent appele JavaConfig), au lieu de la configuration XML classique @RunWith(SpringJUnit4ClassRunner.class)@SpringApplicationConfiguration(classes = Application.class)@ActiveProfiles("dev")public class IntegrationTest { @Inject private UserService userService;

    @Test public void createUser() { ... }}

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Astuce 1 : lancer lapplication context une seule fois

    Spring ne lance quun seul application context par classe Toutes les mthodes de test dune classe donne

    utilisent la mme instance Cela permet d'acclrer les tests : sinon on

    lancerait beaucoup plus dapplication contexts Cela ne doit pas avoir dautre impact

    En effet, vos Beans sont senss tre thread safe

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Astuce 2 : rollback des transactions dans les tests dintgration

    Par dfaut, toute mthode de test annote @Transactional va tre rollbacke la fin du test Inutile de nettoyer la base de donnes aprs un

    test Le test sera galement plus performant Le rollback nest possible qu la condition que

    personne ne commite explicitement pendant le test !

    @Test@Transactionalpublic void createUser() { // Mme code que prcdemment}

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Les tests d'intgration avec Arquillian

    Dans un contexte Java EE, on ne peut pas simuler le serveur d'applications

    Arquillian est un framework permettant de dployer ses tests sur un serveur d'applications, et de les excuter distance Les tests sont toujours raliss avec JUnit Ils sont lancs depuis votre IDE, ou depuis Maven Mais ils vont s'excuter sur un serveur distant

    Arquillian fonctionne aujourd'hui avec JBoss et Glassfish

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Exemple de test d'intgration avec Arquillian

    @RunWith(Arquillian.class)public class PersonRepositoryIT {

    @Inject private PersonRepository personRepository;

    // Code de gestion des dploiements et gestion des transactions // enlevs pour plus de lisibilit

    @Test public void shouldCreateAPerson() { Person person = new Person(); person.setLogin("test-login"); person.setFollowersCount(10); person.setAvatarUrl("http://avatar.url");

    personRepository.createOrUpdatePerson(person);

    Person testPerson = personRepository.findPerson("test-login"); assertNotNull(testPerson); assertEquals(10, testPerson.getFollowersCount()); assertEquals("http://avatar.url", testPerson.getAvatarUrl()); assertEquals(0, testPerson.getRepositories().size()); }

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Arquillian dans la pratique Arquillian est un projet jeune, avec parfois des bugs Les tests d'intgration restent complexes

    Il faut un serveur d'applications disponible en parallle

    Il faut grer les transactions la main (le code prcdent a t simplifi ce niveau)

    Les tests sont plus lents car il faut dployer l'application sur le serveur

    Cependant le framework est trs pratique Permet de tester son application en conditions

    relles Evite d'avoir coder des Mocks

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Validation des donnes en base

    Pour les tests d'intgration nous avons besoin d'un jeu de donnes de test

    Dans les TPs nous utilisons Liquibase Permet de crer le jeu de donnes ou de mettre

    jour une base existante Est indpendant de la base de donnes, on peut

    utiliser HSQLDB : base embarque MySQL : plus lourd mettre en place, mais plus simple

    auditer en cas de problme Et nous validons les donnes via notre code

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    DBUnit DBUnit permet de charger les donnes en base

    Plugin Maven pour faciliter son utilisation Intgration Spring disponible

    DBUnit peut vrifier l'tat des donnes en base suite au passage des tests Automatique et plus complet que nos tests prcdents Plus lourd excuter Maintenir les jeux de donnes en XML est fastidieux

    DBUnit contourne le cache de 2nd niveau Ne pas oublier de l'invalider avant un test Permet de tester les vraies donnes, et pas leur valeur

    en cache

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Pause Les stubs vs les mocks Mockito et EasyMock Les tests d'intgration Spring Test Context vs Arquillian

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Le TDD Test-Driven Development

    Dveloppement pilot par les tests Mthodologie de travail :

    Ecrire un test avant d'crire du code de production N'crire que le test ncessaire pour avoir une

    erreur (et les erreurs de compilation sont bien des erreurs)

    N'crire que le code de production ncessaire corriger les erreurs

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Processus de dveloppement

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Avantages du TDD Code plus simple lire Code plus simple dbugger Meilleur design : le TDD vous pousse mieux

    penser et mieux dcouper vos objets Revient en thorie moins cher : fait baisser les

    cots de maintenance

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Problmes lis au TDD C'est la mme personne qui crit les tests et le

    code Il faut maintenir les tests, ce qui peut tre un

    travail part entire Donne parfois un faux sentiment de scurit

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Le BDD Behavior Driven Developement

    Bas sur le TDD L'ide est de fournir des outils communs aux

    dveloppeurs et aux fonctionnels, pour les faire travailler ensemble

    Permet de dcrire ses tests en langage naturel, en dcrivant un comportement attendu

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Exemple de scnario BDD

    Feature: Basic Arithmetic Background: A Calculator Given a calculator I just turned on Scenario: Addition When I add 4 and 5 Then the result is 9 Scenario: Another Addition When I add 4 and 7 Then the result is 11

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Cucumber Cucumber est un outil permettant de faire du

    BDD http://cukes.info/

    A la base c'est un outil Ruby, mais il existe une version Java https://github.com/cucumber/cucumber-jvm

    C'est avec Cucumber que nous allons raliser notre TP

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Comment lancer des tests? Vous pouvez les lancer depuis Maven

    mvn test Attention, si vous distinguez certains types de

    tests (tests unitaires/tests d'interface graphique/tests de performance), Maven n'a pas cette finesse

    Vous devez pouvoir les lancer directement depuis votre IDE Clic droit sur la classe Run as JUnit test...

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP 1 Ippon shopping Bienvenue chez Ippon Shopping ! Nous allons raliser trois user stories

    Elles ont t dfinies par notre client Les tests ont dj t raliss A vous de coder chaque tape

    Le TP et les instructions suivre sont disponibles dans le rpertoire 01_tdd/exercice

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Correction TP 1 Qui a utilis l'hritage pour grer la TVA?

    Item

    FoodItem JudoItem

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Correction TP 1 Pourquoi utiliser des BigDecimal?

    (1/3+1/12+1/8+1/30) = 0.6083333332(1/3+1/12+1/8) = 0.541666666666666(1/3+1/12) = 0.416666666666666

    Java double:0.60833333333333330.54166666666666660.41666666666666663

    Java float:

    0.608333350.54166670.4166667

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP 2 Test d'intgration avec base de donnes

    embarque Utilisation de AssertJ Utilisation de Mockito Utilisation conjointe de toutes ces techniques

    pour tester un service REST Le TP 2 est disponible dans

    02_mocks_vs_integration/exercice

  • Jour 1 : Sonar, tests automatiss et couverture de tests

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Pourquoi faire des tests automatiss ? Les tests automatiss permettent de coder plus

    efficacement Lautomatisation permet un feedback rapide Permet de corriger un bug juste aprs lavoir

    caus Facilite le dbuggage

    vite de polluer lapplication et dimpacter les autres dveloppeurs

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    L'intgration continue Lutilisation dun serveur dintgration continue

    est essentielle pour excuter ces tests Aujourdhui il ny a plus de

    question se poser : utilisez Jenkins ! http://jenkins-ci.org/

    Ce serveur vous alerte si les tests ne fonctionnent pas Vous vite dupdater votre projet si un de vos

    collgues a commit des bugs

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Bonne pratique Toujours faire passer les tests unitaires avant

    de commiter Renforce largument que ces tests doivent tre

    rapides Certains IDE proposent cette fonctionnalit (ils

    refusent de commiter sil y a des erreurs) Certaines quipes vont plus loin : elles

    commitent dans un repository intermdiaire, et leur code nest ensuite pouss dans le repository principal que si les tests passent

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    La couverture de code La mesure principale utilise pour savoir si les

    tests permettent de bien vrifier la qualit d'un code

    Ncessite un outillage N'est qu'un indicateur : nous allons voir que ce

    n'est pas parfait...

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Que compte-t-on ? Les classes testes Les mthodes testes Les lignes testes

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Attention tester les embranchements

    Un code qui contient des embranchements (if ... then else) possde plusieurs chemins d'excution qu'il faut tester Plusieurs tests par mthode, si ncessaire Tester les cas d'utilisation rares permet

    souvent de trouver des bugs que les testeurs humains ne voient pas

    N'oubliez pas non plus les blocs de gestion d'erreur (try catch finally)

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    L'outillage Il faut un outillage qui instrumente le code lors

    des tests, et qui est capable de gnrer un rapport JaCoCo http://www.eclemma.org/jacoco/ Cobertura : http://cobertura.sourceforge.net/ Emma : http://emma.sourceforge.net/ Atlassian Clover (payant) :

    http://www.atlassian.com/software/clover/overview

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Comment truquer le systme Faites un test d'intgration qui lance une

    grande partie du systme Appelez quelques mthodes qui ont beaucoup

    de lignes Appelez la fin un assertTrue(true);

    La couverture de code n'est qu'un outil, rien ne vaut une vraie revue de code faite par un humain

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP 3: analyse Sonar Installation de Sonar Analyse de notre projet dans Sonar Le TP 3 est disponible dans

    03_sonar/exercice

  • Jour 2 : les tests de performance

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Pourquoi tester la performance? Rassurer la DSI (POC - comparatifs) Prvenir les drives du systme en utilisation relle :

    Anticiper la monte en charge des utilisateurs Anticiper l'augmentation du volume de donnes Anticiper l'utilisation croissante de la bande passante Dimensionner/valider l'infrastructure matrielle (suivi du

    taux d'occupation de la CPU / mmoire) Corriger les problmes dmontrs par les tests (on ne corrige

    pas l'aveugle ) : Evite de monter une usine gaz Evite des dpenses inutiles, l o les problmes ne sont

    pas importants

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Quand tester la performance? Le plus tt possible Lors de la phase de lancement, cela permet

    de : Valider l'architecture Dfinir la volumtrie des donnes ,leur rpartition

    et leur typologie Lors de l'laboration :

    Mise au point des tests et limination des risques En production :

    Supervision / Monitoring

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Les types de test Tests standards : assurer le bon

    fonctionnement en condition normale Tests de stress et de monte en charge:

    valider la tenue et limites lors de pic de charge (mise en vidence des dead locks et fuites de mmoire)

    Tests d'endurance/robustesse : valider le fonctionnement sur la dure (dgradation des temps de rponses, fuite de mmoire ou blocage)

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Mthodologie Tester dans un environnement contrl (de prfrence isol)

    au plus proche de la production (environnement systme et typologie des donnes).

    Prparation des tests

    Mesure des performances

    Identification, Analyse et priorisation

    Correction desproblmes

    Supervision

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Matrise de la mesure La mesure sert l'identification d'un problme Et aussi la validation de sa rsolution :

    Ncessite une comparaison par rapport une baseline Cela implique :

    Gel (peu envisageable) ou utilisation d'une branche Enregistrement des conditions de mesure (version, tat du

    matriel, environnement systme, configuration, paramtres JVM)

    Jeux de donnes identique (dump), statistiques DB identiques Matrise du niveau de LOG, aspects actifs (tissage lger) Gestion de l'historique des mesures ; classification des rsultats Disponibilit / exclusivit : pas de pollution des tirs Quels KPI : temps de rponse, nombres de requtes, taux CPU,

    consommations mmoire, nombre de sessions/connections...

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Identification, analyse, priorisation L'identification des problmes se fait suivant des SLA ralistes

    L'analyse ne doit pas tre base sur des hypothses ou convictions mais sur des faits : les rsultats.

    Les problmes / goulets d'tranglement (bottlenecks) doivent tre qualifis en terme de:

    Risques doccurrences Importance ( % temps consomm) % de prsence sur les diffrents scnarios Corrlation avec la popularit du scnario Cot de correction et tests

    Prioriser en agrgeant ces critres, par exemple:

    Favoriser une correction 2j/H pour 30 % de gain par rapport une 15j/H pour 50 % de gain

    Favoriser une correction 10j/H sur un goulet au niveau du framework reprsentant 10 % de gain sur 70 % des scnarios plutt qu'une 5j/H pour 80 % de gain sur un scnario mineur

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Jeux de donnes Travailler le plus tt possible avec des donnes de

    production. Si les donnes sont sensibles, s'appuyer dessus en masquant / remplaant les attributs sensibles

    Respecter la rpartition relle de la typologie des donnes (induit des chemins d'excution diffrents ainsi que des plans d'excutions de requtes diffrents)

    Variabiliser les types d'utilisateurs injects suivant diffrents profils

    Variabiliser les objets/ressources accds afin de ne pas travailler exclusivement avec les caches

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Choix des scnarios Identifier les cas d'utilisations critiques :

    Les plus frquemment utiliss (s'aider de statistiques si dj en production)

    Les plus vitaux (la facturation, la paie...) Les plus risqus (qui peuvent pnaliser le systme

    dans son intgralit, ex. : les recherches) Choix de scnarios ralistes mais ne pas tre

    perfectionniste (cots inutiles) Attention au cot de maintien d'un nombre trop lev de

    scnarios faire voluer en phase de dveloppement Attention aux scnarios faisant appels des services

    extrieurs (plus complexes) : risques de ban ou faux positifs

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Choix des outils Support de la technologie (http, https...) Type des licences (prix) Efficacit, fonctionnalits, limites Simplicit d'utilisation (industrialisation,

    langage de scripting, interface utilisateur...) Contraintes de scurit (accs aux

    environnements - supervision)

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Outils de test: Loader/InjecteursLes plus utiliss sur le march : HP Load Runner (Commercial) JMeter (licence Apache)

    Fondation Apache Maturit GUI facile utiliser

    Gatling (licence Apache) Scripts Scala, avec un DSL Recorder raliste, injection volue d'utilisateurs Rapports dtaills

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Outils de profiling/monitoringPermettent de suivre l'activit des threads, consommation de la mmoire de la JVM, activit du GC etc...

    Outils gratuits : JConsole : inclus JDK5+, monitoring JMX uniquement JVisualVM : inclus JDK6+ : monitoring JMX + profiling basique

    mmoire/thread (prsente des limites avec trop de threads) Java Mission Control : inclus JDK7+ monitoring JMX

    avanc, profiler ( flight recorder ) payant Netbeans profiler : ncessite l'IDE, profiler complet

    Outils payants : JProfiler : le plus complet (facilit de dtection des deadlocks

    etc.) Yourkit : plus simple utiliser et moins cher que JProfiler

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Limites physiquesSuivre l'utilisation des ressources physiques :

    Charge ou % d'utilisation des CPU Mmoire physique Usage disque I/O Nombres de connections Taux d'erreurs

    Outils :

    Perfmon, sysinternals, vmstats, iostat, sysstat, topas, top, nmon

    TraceRoute, netstat, tcpdump, wireshark...

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Outils de supervision Gratuits

    Metrics + Graphite Hyperic

    Commerciaux Dynatrace AppDynamics New Relic

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Le monitoring avec JMX (1/2) Solution standard de monitoring en Java

    Activation explicite dans la ligne de commandes en lanant votre application Java

    Permet de voir de nombreuses informations Donnes du serveur d'applications : Tomcat, JBoss... Librairies exposant des MBeans : Hibernate, ehcache... Services de l'application elle-mme : Beans Spring,

    EJBs... Rcupration des informations par le biais d'un

    des clients classiques JConsole VisualVM

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Monitorer JPA avec JMX (2/2) Informations rcolter avec JMX pour une application JPA

    Statistiques sur l'utilisation du cache L2 Nombre de hits pour chaque cache Hits ratios pour chacun Nombre dvictions du cache 60% de hits minimum pour justifier de l'utilisation d'un cache sur une entit JPA

    Statistiques sur l'utilisation du pool de connexions Nombre de connexions maximal Nombre de connexions en attente ( idle ) Nombre de connexions supprimes

    Les statistiques Hibernate (3.x) Trs compltes Sont dsactives par dfaut

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    HEAPHEAP

    Sources potentielles de ralentissement

    CacheCache

    JDBC / Pool connexion

    ThreadsThreadsSessionsSessions

    CacheCache

    WebApp/EJBWebApp/EJB

    SessionSession

    PB INFRAPB INFRA

    GCGC

    ConcurrenceConcurrenceBandwidthBandwidth

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Suivi des mtriques Notre application possde dj une dpendance sur les librairies

    Metrics (http://metrics.codahale.com/) Afin d'effectuer un suivi sur l'ajout/suppression d'un item dans notre

    panier (parmi les actions les plus utilises, donc suivre de prs), nous allons ajouter l'annotation @Timed sur l'ensemble des mthodes publiques de notre controller Rest grant le panier.

    Lancez l'application partir du main() de la classe fr.ippon.shopping.Application en prcisant l'argument de JVM :

    -XX:MaxPermSize=256m Rendez-vous sur l'URL http://localhost:8080 et connectez-vous l'aide

    du user/password : admin/admin . Le menu metriques est maintenant accessible dans administration , le slectionner.

    TP Optimiser Ippon shopping

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP Optimiser Ippon shopping

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP Optimiser Ippon shopping

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP Optimiser Ippon shopping

    Suivi des mtriques L'cran des mtriques est personnalisable

    applicativement ; celui que nous visualisons est la vue par dfaut.

    Il est possible de suivre l'tat des bases et autres systmes externes, l'tat de la JVM, les statistiques sur les mthodes annotes, ainsi que les statistiques EhCache.

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP Optimiser Ippon shoppingSuivi des mtriques Rendez-vous sur la page d'accueil, ajoutez, supprimez des produits,

    revenez sur les statistiques afin de visualiser le temps consomm et constater que la mthode addToCart() est consommatrice.

    Note : Pour ce TP, nous avons ajout un morceau de code peu efficace, ce qui permet de visualiser aisment le problme. Cependant dans un contexte normal c'est en environnement de production aprs l'utilisation concurrente de l'application par de nombreux utilisateurs que l'on obtient des statistiques qui prennent du sens.

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP Optimiser Ippon shopping

    Sampling avec VisualVM Lancez VisualVM prsent dans JDK_HOME/bin/jvisualvm Dans la liste des VM locales, ouvrir celles correspondant notre

    programme et se placer sur l'onglet sampler , puis cliquez sur CPU.

    Dans notre exemple, on identifiera facilement le code consommateur.

    Supprimez les 4 lignes de code qui n'apportent rien et polluent le code. Relancez le serveur afin de constater la disparition du problme.

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP Optimiser Ippon shoppingNote: Ici un simple sampling permet l'analyse de notre

    problme, on privilgiera cette approche qui est plus lgre et ne ncessite pas d'instrumentation du code, et qui est base sur une multitude de thread dump lgers et de stacktrace.

    Dans des situations moins videntes, nous utiliserons le profiling qui lui ncessite une instrumentation, mais est beaucoup plus prcis : il compte chaque invocation de mthodes. De plus, on peut dmarrer et arrter le profiling sur une priode bien dfinie.

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP Optimiser Ippon shoppingCration d'un plan de test avec Gatling (Enregistrement 1/2)

    Tlchargez Gatling sur http://gatling-tool.org/ et dcompressez le. Afin d'apprhender plus facilement les scripts Scala, nous allons

    utiliser l'enregistreur (recorder) de Gatling qui se trouve dans /bin. Nous laissons tous les rglages par dfaut de l'enregistreur, except

    le nom de classe que nous appelons AddSuppressItemsSimulation et nous le lanons l'aide du bouton Start. Une fentre apparat, elle contient la liste des URL accdes et permet d'ajouter un Tag utile pour ajouter un commentaire sur les diffrents scenarii (crez en un). L'enregistreur se comporte comme un proxy.

    Paramtrez donc le proxy du navigateur en spcifiant le port (8000 si vous l'avez laiss par dfaut sur l'enregistreur).

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP Optimiser Ippon shoppingCration d'un plan de test avec Gatling (Enregistrement 2/2)

    Droulez le scnario suivant : ajoutez 2 produits dans un premier temps puis supprimez-les. Lorsque le scnario est termin, effectuez un stop and save dans la fentre enregistreuse.

    Le script AddSuppressItemsSimulation.scalaAddSuppressItemsSimulation.scala est gnr dans user-files\simulations.

    On remarque dans le fichier que le Tag a t ajout sous forme de commentaire et que mme les temps d'attente entre les actions ont t enregistrs (pause).

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP Optimiser Ippon shopping

    Cration d'un plan de test avec Gatling (Rejeux 1/3) Le fichier Scala gnr est directement

    exploitable en l'tat. Lancez /bin/gatling.[bat|sh], choisissez le numro correspondant notre scnario et laissez le reste par dfaut.

    Le fichier Scala est d'abord compil puis l'excution se lance. Une fois termin, les rsultats sont gnrs et visualisables via /results/[nomClasseScalaLowerCase][DateExecution]/index.html

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP Optimiser Ippon shopping

    Cration d'un plan de test avec Gatling (Rejeux 2/3) Dans notre cas nous n'avons qu'un seul utilisateur, les

    graphiques ne sont pas trs parlants, nous allons modifier l'injecteur afin de simuler un nombre variant d'utilisateurs :

    setUp(scn.inject(nothingFor(1 seconds), atOnce(2 users), ramp(5 users) over (3 seconds), constantRate(7 usersPerSec) during (4 seconds), rampRate(15 usersPerSec) to(3 usersPerSec) during(2 seconds))) .protocols(httpProtocol)

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP Optimiser Ippon shopping

    Cration d'un plan de test avec Gatling (Rejeux 3/3) Remplacez les RawFileBody() qui peuvent tre

    simplifis avec leurs contenus directement dans une String

    //.body(RawFileBody("RecordedSimulation_request_1.txt"))).body(StringBody("7")))

    Relancez et regardez de nouveau les rsultats, observez le nombre de requtes excutes en fonction du nombre d'utilisateurs

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP Optimiser Ippon shopping

    Cration d'un plan de test avec Gatling (Paramtrage du scnario 1/2) Pour tester les problmes de locks, modifiez le script afin de

    stresser notre application : Nous allons rpter 80 fois notre scnario : modifiez le

    scnario scn (on donne un nom notre scnario), en pensant l'accolade fermante !

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP Optimiser Ippon shoppingCration d'un plan de test avec Gatling

    (Paramtrage du scnario 2/2) Mettez en commentaire toutes les pauses (trop d'attente cacherait les problmes inhrents aux locks)

    Remplacez l'injecteur afin d'ajouter plus d'utilisateurs (on vitera de trop en mettre, afin d'avoir un nombre de threads raisonnable au niveau du serveur, sinon VisualVM aura du mal effectuer des dumps) :

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP Optimiser Ippon shopping

    Cration d'un plan de test avec Gatling (Excution et interprtation 1/2) Le but n'est pas d'obtenir des graphes mais d'observer un

    comportement avec un outil de profiling (ici VisualVM). Lancer gatling avec l'option -nr, afin de ne pas gnrer de rapport

    qui pourrait impacter nos mesures ; on prcisera aussi directement la classe a excuter :

    gatling.[bat|sh]-nr-sAddSuppressItemsSimulation Lancez VisualVM et placez-vous sur l'onglet Thread . Le test

    devrait mettre en avant de srieux problmes de locks (Monitor en rouge), s'ils sont assez nombreux cela garantira que la gnration d'un dump de la stack trace des threads en cours d'excution (bouton Thread Dump ), contiendra l'tat BLOCKED.

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP Optimiser Ippon shopping

    Cration d'un plan de test avec Gatling (Excution et interprtation 2/2) Attention si l'activit est trop grande (souvent d un trop

    grand nombre de threads au niveau du serveur), il se peut que le dump mette du temps tre gnr... Copiez le contenu dans un diteur afin de faire une recherche sur BLOCKED.

    La stacktrace devrait vous permettre d'identifier le code synchronized provocant le lock. Effectuez la correction et relancez le test pour voir si les problmes sont rsolus il est probable que quelques monitors apparaissent

    encore mais l'erreur principale devrait tre corrige

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP Optimiser Ippon shoppingCration d'un plan de test avec Gatling (Fuites

    mmoire 1/4) L'objectif est de simuler de nombreux utilisateurs pendant une priode

    plus longue afin de suivre l'volution de la mmoire dans le temps. Nous allons voir les limites de VisualVM en tant qu'outil d'analyse. Pour

    cela la session utilisateur est de 30s ce qui permet de librer les 'shopping cart' rgulirement et donc voir plus facilement s'il n'y a pas d'autres fuites mmoires sur notre application. Le problme a t exagr afin de le constater plus aisment.

    Dans le fichier Scala, dcommentez les pauses en mettant des temps de l'ordre du dixime de secondes. Redfinir le repeat un nombre raliste (3). Enfin, injectez 3000 utilisateurs raison d'une monte de 30 utilisateurs sur 3s toutes les secondes :

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP Optimiser Ippon shoppingCration d'un plan de test avec Gatling (Fuites mmoire 2/4)

    Lancez le test et laissez le tourner. Sur VisualVM, ouvrez l'onglet Monitor et observez l'activit du GC (Garbage Collector) dans la vue CPU ainsi que l'volution de la Heap .

    Quand l'activit est importante, le GC n'arrive plus librer assez de ressources et la progression est linaire, ce qui caractrise trs souvent la fuite mmoire.

    Effectuez un profiling de la mmoire (il est conseill de le lancer avant le dmarrage du test). On constate que ce sont les chanes de caractres qui ne cessent de crotre, cependant VisualVM ne nous permet pas d'en dduire la classe qui en est l'origine. Mme si le problme portait sur un objet mtier, nous aurions su quelle classe tait concerne mais nous n'aurions pas devin la source.

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP Optimiser Ippon shoppingCration d'un plan de test avec Gatling (Fuites mmoire 3/4)

    VisualVM tant insuffisant pour ce type de problme, nous nous tournerons vers des outils de profiling plus avancs. Nous vous recommandons en particulier : JProfiler Yourkit

    Dans le slide suivant, il nous est possible l'aide de JProfiler et de sa vue heap walker de dduire que le code l'origine du problme se trouve sur le champ static stringList du CartResource. Aprs analyse du code on voit que cette liste n'est pas utilise (cre seulement pour l'exercice), nettoyez le code inutile et relancez le test pour constater que la fuite mmoire a disparu.

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP Optimiser Ippon shoppingCration d'un plan de test avec Gatling (Fuites mmoire 4/4)

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP Optimiser Ippon shopping

    [Optionnel] Cration d'un plan de test avec JMeter (1/5) Tlchargez la dernire version de JMeter sur

    http://jmeter.apache.org/ et dcompressez-la. Lancez /bin/jmeter.[bat|sh] en mode admin

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP Optimiser Ippon shopping[Optionnel] Cration d'un plan de test avec JMeter (2/5)

    Configuration du plan de travail et de test :

    1. Dans le plan de test : Ajouter->Moteurs d'utilisateurs->Groupe d'units

    2. Dans le plan de test : Ajouter->Configurations->Paramtre http par dfaut

    3. Dans le groupe d'unit : Ajouter->Contrleur logique->Contrleur enregistreur

    4. Dans le groupe d'unit : Ajouter->Configurations->Gestionnaire de cookie httpCeci nous servira nettoyer les cookies chaque itration afin de ne pas rutiliser le mme panier (penser cocher la case)

    5. Dans le plan de travail : Ajouter->Element hors test->Enregistreur script de test http(s)

    1) Dfinir le port du proxy 80002) Cocher la capture des enttes, ajout d'assertion (facultatif), suivre les redirections3) Ajouter le motif a exclure .*\.gif

    6. Dans l'enregistreur script : Ajouter->Rcepteur->Arbre de rsultat

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP Optimiser Ippon shopping[Optionnel] Cration d'un plan de test avec JMeter (3/5)

    Lancez sur l'enregistreur et cliquez sur le bouton Lancer ; comme pour Gatling un proxy va tre cr, il faudra donc activer l'utilisation d'un proxy au niveau du navigateur.

    Naviguez dans l'application. Dans l'arbre de rsultat on voit l'ensemble des requtes effectues et

    leurs dtails. Stoppez l'enregistreur et observez le contrleur enregistreur, il contient

    automatiquement le jeu effectu (attention bien nettoyer les actions intermdiaire parasites si vous tes all sur d'autres sites).

    Configurez les assertions gnres sous les requtes HTTP, cela permettra de s'assurer que les tirs de test ont bien le retour attendu et ainsi dtecter un retour vide si le serveur est stopp ou si le code a chang. Exemple d'assertion : motif contient , motif tester grossPrice":80

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP Optimiser Ippon shopping[Optionnel] Cration d'un plan de test avec JMeter (4/5)

    Ajoutez des rcepteurs de type Rapport consolid ou Arbre de rsultat afin de suivre la bonne excution de nos tests.

    Attention lors de la mesure, il est conseill de dsactiver les assertions ainsi que tous les rcepteurs ou autres lments qui ne servent qu' l'interprtation des rsultats ; ainsi la mesure ne sera pas parasite et donc plus prcise.

    Afin de lancer les tests il suffira d'appuyer sur le bouton lecture et tous les lments non dsactivs s'excuteront.

    Si l'on veut modifier le nombre d'utilisateurs, la dure de monte en charge ou le nombre d'itrations (l'option infini peut tre intressante pour la dtection de fuite mmoire), on peut l'effectuer sur le groupe d'units.

    Maintenant on pourra regarder sur Metrics et suivre l'excution du tir sur VisualVM, comme on l'a fait prcdemment avec Gatling.

    Sur le slide suivant un exemple du plan de travail une fois cr et les tests prts tre drouls

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP Optimiser Ippon shopping[Optionnel] Cration d'un plan de test avec JMeter (5/5)

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP Optimiser Ippon shopping

    Superviser l'aide de JMX (1/5) Ajoutez une ressource JMX l'aide des annotations

    @ManageResource et @ManageAttribute afin de lire le nom du dernier item ajout par les utilisateurs dans un panier.

    Ouvrez JConsole et vrifiez que la ressource est bien affiche dans l'onglet beans et que sa valeur d'attribut volue lorsque vous naviguez dans l'application

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP Optimiser Ippon shopping

    Superviser l'aide de JMX (2/5) Il est possible d'exporter des objets java sous forme de MBean,

    cependant attention ne pas trop en mettre afin de ne pas dgrader les performances.

    Vous avez dj votre disposition des ressources fournies par la JVM, Metrics , hibernate ou mme votre serveur d'application

    Dans notre TP, un Decorateur dans la classe HibernateStatsConfiguration.java a t ajout afin de palier l'absence de contrleur JMX sur les statistiques Hibernate dans sa version 4.0 .

    Lancez le dernier scnario cr sur Gatling et constatez dans les statistiques Hibernate que le nombre d'entits charges en base de donnes augmente rapidement

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP Optimiser Ippon shoppingSuperviser l'aide de JMX (3/5)

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP Optimiser Ippon shoppingSuperviser l'aide de JMX (4/5)

    Notre test insre des items dans un panier, nous allons donc regarder les statistiques au niveau de nos items

    Allez dans les oprations et utilisez getEntityStatisticsString() avec les classes fr.ippon.shopping.domain.Item et fr.ippon.shopping.domain.JudoItem Seule la classe rellement instancie (pas le parent) est

    comptabilise Le nombre de load() est trop important. Si l'on avait activ

    les logs (dans application.yml : jpa.show_sql=true), on aurait aussi pu constater de nombreux appels sur la mme requte de type select .

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP Optimiser Ippon shopping

    Superviser l'aide de JMX (5/5) Ajoutez un cache en vous aidant des autres classes du

    domaine pour exemple. Relancer les tests et vrifiez maintenant que seul le

    cache de second niveau est sollicit Vrifiez l'tat du cache grce aux statistiques

    Metrics

  • Jour 2 : les tests fonctionnels avec Selenium

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Prsentation de Selenium Selenium permet de raliser des tests

    d'interface graphique Selenium se charge de lancer un navigateur D'effectuer des actions utilisateurs (clics...) Et de contrler le DOM suite ces actions

    On teste ainsi l'interface finale propose l'utilisateur

    Son excution peut tre automatise Il est relativement lourd mettre en place et

    utiliser

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Selenium vs HP Quality Center HP Quality Center est une suite complte,

    permettant en particulier de tester des interfaces Web

    Selenium est un concurrent Open Source A l'origine, HP Quality Center = Mercury Quality

    Center Le Selenium est un antidote l'empoisonnement

    au Mercure... Les deux solutions sont excellentes, le

    principal lment discriminant est le prix

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Selenium IDE Pour dmarrer facilement, il existe un plug-in

    Firefox nomm Selenium IDE , qui enregistre les actions utilisateurs

    Il faut ensuite optimiser le code gnr, et rajouter des assertions

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Selenium WebDriver WebDriver permet de directement contrler un

    navigateur avec du code Il faut crire les tests comme des tests

    unitaires normaux Il existe des bindings dans les principaux

    langages de programmation Et en particulier en Java !

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Installation de WebDriver Le plus simple est d'ajouter les dpendances

    dans Maven Utilisez le scope test pour ne pas polluer votre

    classpath

    org.seleniumhq.selenium selenium-firefox-driver 2.39.0 test

    org.seleniumhq.selenium selenium-support 2.39.0 test

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Lancement des tests Attention lorsque vous lancez Selenium

    Selenium est relativement lourd Il faut lancer le serveur d'applications Il faut lancer le navigateur

    Vous ne pourrez peut-tre pas le lancer sur votre serveur d'intgration continue Pas d'interface graphique ? Etudiez le plugin

    phantom.js Pour ces raisons, on le configure souvent

    dans un profil part Selenium n'est pas lanc par dfaut quand on fait

    un mvn test

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Cration du WebDriver Vous devez choisir une implmentation du

    WebDriver pour lancer vos tests

    @Beforepublic void before() throws Throwable { FirefoxProfile profile = new FirefoxProfile();

    profile.setPreference("browser.cache.disk.enable", false); profile.setPreference("browser.cache.memory.enable", false); profile.setPreference("browser.cache.offline.enable", false); profile.setPreference("network.http.use-cache", false); profile.setPreference("intl.accept_languages", "no,en-us,en");

    driver = new FirefoxDriver(profile); driver.manage().deleteAllCookies();}

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Slectionner des lments (1/2) Le principal travail avec Selenium est de

    trouver les bons lments dans le DOM Vous pouvez les slectionner par ID ou class

    Le plus simple Mthode familire aux utilisateurs de JQuery

    By.id("cartGrossPrice")

    By.cssSelector("#list-item .dropdown-menu li a")

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Slectionner des lments (2/2) Vous pouvez aussi utiliser une expression

    XPath

    Ou directement du JavaScript

    By.xpath("//input")

    ((JavascriptExecutor)driver) .executeScript("return $('.test')[0]");

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Attention aux IDs! Le plus simple (et sr!) reste l'utilisation des

    IDs Ce qui peut poser problme, car certains

    frameworks les gnrent Ils fluctuent donc en fonction des dveloppements,

    ce qui rend les tests impossibles C'est le cas notamment avec JSF et avec GWT

    Il faut donc forcer ces IDs Cela rajoute un cot supplmentaire aux

    dveloppements Complexe rajouter aprs coup

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Remplir un formulaire Pour remplir un champ texte il faut le

    slectionner et lui envoyer les caractres :

    Pour une drop-down list :

    Astuce pour les lments cods en CSS

    WebElement element = driver.findElement(By.id("login-id"));element.sendKeys("jdoe");

    Select select = new Select(driver.findElement(By.id("state")));

    select.selectByIndex(1);

    element.sendKeys("and user", Keys.ARROW_DOWN);

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Gestion de la navigation Vous pouvez utiliser votre WebDriver pour

    aller sur une page :

    Et pour cliquer sur des lments de cette page :

    driver.get("http://localhost:8080/shopping/index.html");

    driver.findElement(By.id("add-product-2-btn")).click();

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Comment attendre? L'un des problmes principaux de Selenium est qu'il faut

    attendre Attendre que le DOM se mette jour Attendre qu'une requte Ajax rponde

    Vous devez donc utiliser une mthode d'attente, avec un timeout

    (new WebDriverWait(driver, 10)) .until( ExpectedConditions .textToBePresentInElementLocated( By.id("cartGrossPrice"), "60"));

    (new WebDriverWait(driver, 10)) .until( ExpectedConditions.elementToBeClickable( By.id("delete-btn")));

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Utilisation des assertions Pour vrifier que les lments de votre page

    sont corrects, utilisez les assertions normalement Note : vous pouvez utiliser les librairies

    d'assertion, comme AssertJ

    assertThat(authentStatusElement.isDisplayed()) .isTrue();

    assertThat(authentStatusElement.getText()) .isIn("Bienvenue", "Welcome");

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Copies d'cran Une fonctionnalit importante de Selenium est

    la cration de copies d'cran Le serveur d'intgration continue peut ainsi

    gnrer des copies d'cran des erreurs rencontres

    Utile en particulier si l'on teste avec plusieurs navigateurs diffrents

    File scrFile = ((TakesScreenshot)driver) .getScreenshotAs(OutputType.FILE);

    FileUtils.copyFile(scrFile, new File(System.getProperty("user.home") + "/selenium_screenshot.png"));

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    FluentLenium L'API officielle de Selenium n'est pas des plus

    simples FluentLenium est un projet Open Source vous

    proposant une API fluente https://github.com/FluentLenium/FluentLenium

    Nous vous conseillons son utilisation Plus simple apprendre Plus lisible Moins de code crire

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Exemple de code FluentLenium

    public class BingTest extends FluentTest {

    @Test public void title_of_should_contain_search_query_name() { goTo("http://www.bing.com"); fill("#sb_form_q").with("FluentLenium"); submit("#sb_form_go"); assertThat(title()).contains("FluentLenium"); }}

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Une API plus simple Actions plus simples

    click("#create-button") clear("#firstName") submit("#update") executeScript("alert('Hello, world');")

    Enchanements (API fluente) fill("#firstName").with("test")

    Gestion des attentes simplifie Await().atMost(10, TimeUnit.SECONDS)

    .until("#ajaxElement").isPresent() API ressemblant JQuery

    $("#firstName").text("test") $("#create-button").click()

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Le Page Object Pattern Une page est reprsente par une classe

    https://code.google.com/p/selenium/wiki/PageObjects Avec des mthodes reprsentant les services de cette

    page Ne fait pas d'assertions ou de vrification

    Facilite la rutilisation et la maintenance Facile raliser avec FluentLenium :

    public class LoginPage extends FluentPage { public String getUrl() { return "myCustomUrl"; } public void fillAndSubmitForm(String... paramsOrdered) { fill("input").with(paramsOrdered); click("#create-button"); }}

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP 5: tests Selenium Cration de deux jeux de tests Selenium Attention, pour ce TP, l'URL est :

    http://localhost:8080/shopping Le TP 5 est disponible dans

    05_selenium/exercice

  • Jour 2 : les tests d'interface avec Karma

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Introduction Karma permet de lancer des tests d'interface C'est un outil JavaScript, qui fonctionne avec Node.js

    Cela permet de tester directement une application JavaScript

    Il est particulirement intressant pour les nouvelles applications Web riches , par exemple dveloppes avec AngularJS

    Il fait partie des outils modernes de test, et est en particulier utilis avec Grunt, pour lancer les tests Karma Jasmine, pour crire les tests

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Que permet de faire Karma? Karma permet de tester son code sur un ou

    plusieurs navigateurs En particulier Phantom.js

    Les tests peuvent tourner de manire automatique A chaque sauvegarde de fichier

    Karma permet de debugger les tests dans Chrome ou dans un IDE (s'il le supporte)

    Karma s'intgre dans un environnement d'intgration continue (Jenkins)

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Node.js Plateforme btie sur le

    moteur JavaScript V8 de Chrome

    Permet de dvelopper des applications full JavaScript Client & serveur cods en JavaScript

    Fournit un environnement complet et de nombreux outils utilisables pour des applications classiques dveloppes en Java

    http://nodejs.org/

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Grunt Grunt permet de lancer des tches Il propose ainsi d'automatiser

    La minification du JavaScript et desimages

    La compilation de scripts SASS ou CoffeeScript La validation du code JavaScript (JSHint) Les tests avec Karma Etc...

    L'cosystme propos est norme et facilite grandement le dveloppement d'applications JavaScript

    http://gruntjs.com/

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Jasmine Jasmine est un framework de tests, la

    manire de JUnit Il est crit en JavaScript, et peut tre utilis

    avec Karma Il ne ncessite pas d'avoir accs au DOM

    On teste les fonctions JavaScript Plus adapt que Selenium (uniquement bas sur

    le DOM) pour des applications complexes

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Exemple de test Jasmine Une suite de tests est dfinie avec une

    fonction describe() Un test ( spec ) est dfini par une fonction

    it() Une assertion est une fonction expect()

    describe("Une suite de tests est une fonction", function() { var a;

    it("Un test est une fonction", function() { a = true;

    expect(a).toBe(true); });});

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Les matchers de Jasmine Jasmine propose galement un systme de

    matchers Nous sommes donc dans un fonctionnement trs

    proche de ce que nous avons vu en Java

    expect(a).toBe(b);expect(a).not.toBe(null);expect(a).toEqual(12);expect(message).toMatch(/bar/);expect(message).toMatch('bar');expect(message).not.toMatch(/quux/);expect(a.foo).toBeDefined();expect(a.bar).not.toBeDefined();expect(a).toBeNull();expect(foo).toBeTruthy(); // gestion des boolensexpect(foo).not.toBeFalsy();expect(a).toContain('bar');expect(pi).toBeGreaterThan(e);expect(pi).toBeCloseTo(e, 0); // avec prcision mathmatique

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Les mocks avec Jasmine On peut galement crer

    des mocks partiels ( spy ) cf. le chapitre sur les

    mocks (c'est le mme systme qu'avec Mockito)

    Permettent de simuler des appels REST

    describe("Un spy", function() { var foo, bar, fetchedBar;

    beforeEach(function() { foo = { setBar: function(value) { bar = value; }, getBar: function() { return bar; } }; spyOn(foo, 'getBar').andReturn(745); foo.setBar(123); fetchedBar = foo.getBar(); });

    it("Retourne la valeur du mock", function() { expect(fetchedBar).toEqual(745); });});

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Phantom.js Permet de lancer depuis une console,

    sans interface graphique, un moteurWebKit WebKit est le moteur de rendu de Chrome

    et Safari C'est un moteur complet, pas un simulateur Scriptable via une API JavaScript Trs performant

    En particulier compar Selenium http://phantomjs.org/

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Yeoman Mettre en place toute la stack technique

    expose ici peut tre compliqu Yeoman propose un systme de

    gnrateurs, vous permettant d'avoirun ensemble fonctionnel trs rapidement

    Il existe de nombreux gnrateurs, en fonction de vos besoins

    http://yeoman.io/

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Installation Installez Node.js

    http://nodejs.org/ Node.js fournit NPM, un gestionnaire de package

    Vous pouvez ensuite installer Karma Installation globale

    Installation locale (dans ./node_modules/.bin)

    npm install -g karma

    npm install -g karma --save-dev

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Fichier de configuration de Karma

    Les principales options du fichier de configuration sont basePath : le chemin dans lequel Karma

    trouvera les fichiers files : un tableau contenant tous les fichiers

    JavaScript charger dans le navigateur autoWatch : lance les tests automatiquement

    chaque changement de fichier browsers : un tableau contenant les

    navigateurs sur lesquels les tests doivent tre excuts

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Tests en continu Si vous mettez autoWatch true, les tests

    seront excuts automatiquement Indpendant de votre IDE, fonctionne la

    sauvegarde des fichiers Trs rapide et peut tourner en tche de fond (en

    particulier avec Phantom.js) C'est l'un des intrts principaux de Karma, en

    particulier en comparaison Selenium

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Debugging Vous pouvez dbugger dans votre IDE (s' il le

    permet) ou directement dans Chrome : Ajouter Chrome dans les navigateurs tests :

    Ajouter un point d'arrt dans le code :

    Lancer Karma Aller dans le navigateur Chrome ouvert, et

    rafrachir la page

    browsers = ['Chrome'];

    it('spec', function() { debugger;});

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Quelques astuces La mthode dump() permet d'afficher des valeurs dans la

    console de Karma console.log() fonctionne toujours, mais affiche dans la

    console du navigateur En cas d'chec, Karma vous donne le fichier et la ligne de

    l'erreur autoWatchBatchDelay permet de configurer combien de

    temps attendre avant de lancer les tests (pour qu'un ensemble de fichiers sauvs soient tests en batch)

    Vous pouvez configurer un proxy vers des serveurs distants, afin de faire des tests d'intgration (alternative aux Spies)

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    Reporting avec Karma Karma propose un systme de reporting Pour tre utilis avec Jenkins, il faut utiliser un

    reporting de type JUnit Pour l'installer :

    Pour l'utiliser, ajouter dans le fichier de configuration de Karma :

    npm install karma-junit-reporter --save-dev

    singleRun: true,reporters: ['dots', 'junit'],junitReporter: { OutputFile: 'test-results.xml'}

  • @ippontech www.ippon.fr blog.ippon.fr www.atomes.com [email protected]

    TP 6: tests avec Karma Nous allons utiliser Karma, Jasmine,

    Phantom.js et Grunt pour tester notre interface graphique

    Il vous faudra pour cela installer Node.js Le TP 6 est disponible dans

    06_karma/exercice

  • Conclusion

    Slide 1Slide 2Slide 3Slide 4Slide 5Slide 6Slide 7Slide 8Slide 9Slide 10Slide 11Slide 12Slide 13Slide 14Slide 15Slide 16Slide 17Slide 18Slide 19Slide 20Slide 21Slide 22Slide 23Slide 24Slide 25Slide 26Slide 27Slide 28Slide 29Slide 30Slide 31Slide 32Slide 33Slide 34Slide 35Slide 36Slide 37Slide 38Slide 39Slide 40Slide 41Slide 42Slide 43Slide 44Slide 45Slide 46Slide 47Slide 48Slide 49Slide 50Slide 51Slide 52Slide 53Slide 54Slide 55Slide 56Slide 57Slide 58Slide 59Slide 60Slide 61Slide 62Slide 63Slide 64Slide 65Slide 66Slide 67Slide 68Slide 69Slide 70Slide 71Slide 72Slide 73Slide 74Slide 75Slide 76Slide 77Slide 78Slide 79Slide 80Slide 81Slide 82Slide 83Slide 84Slide 85Slide 86Slide 87Slide 88Slide 89Slide 90Slide 91Slide 92Slide 93Slide 94Slide 95Slide 96Slide 97Slide 98Slide 99Slide 100Slide 101Slide 102Slide 103Slide 104Slide 105Slide 106Slide 107Slide 108Slide 109Slide 110Slide 111Slide 112Slide 113Slide 114Slide 115Slide 116Slide 117Slide 118Slide 119Slide 120Slide 121Slide 122Slide 123Slide 124Slide 125Slide 126Slide 127Slide 128Slide 129Slide 130Slide 131Slide 132Slide 133Slide 134Slide 135Slide 136Slide 137Slide 138Slide 139Slide 140Slide 141Slide 142Slide 143Slide 144Slide 145Slide 146Slide 147Slide 148Slide 149Slide 150Slide 151Slide 152Slide 153Slide 154Slide 155Slide 156Slide 157Slide 158Slide 159Slide 160Slide 161Slide 162Slide 163