Vous êtes sur la page 1sur 163

Formation Total Tests

Licence

Cette formation vous est fournie sous licence Creative Commons AttributionNonCommercial-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

contact@ippon.fr

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

contact@ippon.fr

Sommaire

Jour 2

Les tests de performance (2,5h)

Les tests fonctionnels classiques (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
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

contact@ippon.fr

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

contact@ippon.fr

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
@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

Jour 1 : garantir la qualit de son


code

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

contact@ippon.fr

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

contact@ippon.fr

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

Test dun ensemble de composants dans un


environnement comparable la production : ce
sont les tests dintgration

Cela exclut lutilisation de Spring, Hibernate, etc

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

contact@ippon.fr

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

contact@ippon.fr

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

@ippontech

@Test
public 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);
}

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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 (autocompltion)

Vous pouvez enchaner les assertions


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

@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

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

contact@ippon.fr

Exemples avec AssertJ

Test de la taille d'une collection


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

Test de la prsence d'une instance dans la


collection

assertThat(userRepository.findAll()).contains(joh
n);

Enchanement d'assertions

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

@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

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

contact@ippon.fr

Exemple de fixture
@Before
public 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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

Exemple

Exemple d'un test en erreur dans IntelliJ


IDEA :

@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

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

contact@ippon.fr

Allons plus loin

Pour l'instant nous n'avons vu que des tests


simples

Dans un vrai projet, vous allez avoir des


dpendances plus complexes

Avec des objets Java basiques

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

contact@ippon.fr

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 :

@Inject
private TodoListsService todoListsService

@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

Astuce: comment injecter dans un champ ?


(2/2)
Spring propose cet utilitaire :
ReflectionTestUtils.setField(todosService,
"todoListsService",
todoListsService);

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...

@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

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

contact@ippon.fr

Exemple de Stub

Le Stub implmente la mme interface que la


dpendance injecte

Le Stub peut tre une classe anonyme (exemple cidessous), pour viter de crer trop de fichiers

Cela peut tre galement une vraie classe, afin de pouvoir


le rutiliser sur plusieurs tests

AccountService 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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

Exemple de Mock avec


EasyMock

@Test
public 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

contact@ippon.fr

....

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

contact@ippon.fr

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

contact@ippon.fr

Exemple de Mock avec


Mockito

@Test
public 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

contact@ippon.fr

Les mocks partiels avec


Mockito

Vous pouvez crer un mock partiel (appel


spy ), permettant de simuler uniquement
une mthode d'un objet existant
List list = new LinkedList();
List spy = spy(list);
//optionally, you can stub out some methods:
when(spy.size()).thenReturn(100);
//using the spy calls real methods
spy.add("one");
spy.add("two");
//prints "one" - the first element of a list
System.out.println(spy.get(0));
//size() method was stubbed - 100 is printed
System.out.println(spy.size());
@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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
@Transactional
public void createUser() {
// Mme code que prcdemment
}
@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

Processus de dveloppement

@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

Cucumber

Cucumber est un outil permettant de faire du


BDD

A la base c'est un outil Ruby, mais il existe une


version Java

http://cukes.info/

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

Correction TP 1

Qui a utilis l'hritage pour grer la TVA?

Item

FoodItem

@ippontech

JudoItem

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

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.6083333333333333
0.5416666666666666
0.41666666666666663
Java float:
0.60833335
0.5416667
0.4166667

@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

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

@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

Jour 1 : Sonar, tests automatiss et


couverture de tests

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

Que compte-t-on ?

Les classes testes

Les mthodes testes

Les lignes testes

@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

TP 3: analyse Sonar

Installation de Sonar

Analyse de notre projet dans Sonar

Le TP 3 est disponible dans


03_sonar/exercice

@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

Jour 2 : les tests de performance

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

Mthodologie

Tester dans un environnement contrl (de prfrence isol)


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

Prparation
des tests

Correction des
problmes

Mesure des
performances

Supervision

Identification,
Analyse et priorisation

@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

Outils de test: Loader/Injecteurs


Les 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

contact@ippon.fr

Outils de profiling/monitoring
Permettent 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

contact@ippon.fr

Limites physiques
Suivre 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

contact@ippon.fr

Outils de supervision

Gratuits

Metrics + Graphite

Hyperic

Commerciaux

Dynatrace

AppDynamics

New Relic

@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

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

contact@ippon.fr

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

<property name="hibernate.generate_statistics" value="true"/>

@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

Sources potentielles de ralentissement


WebApp/EJB
Sessions

Threads

Bandwidth

Concurrence

HEAP

GC
Cache

Cache
Session

JDBC / Pool connexion

PB INFRA

@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

TP Optimiser Ippon shopping


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.

@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

TP Optimiser Ippon shopping

@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

TP Optimiser Ippon shopping

@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

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

contact@ippon.fr

TP Optimiser Ippon shopping


Suivi 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

contact@ippon.fr

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

contact@ippon.fr

TP Optimiser Ippon shopping


Note: 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

contact@ippon.fr

TP Optimiser Ippon shopping


Cration 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

contact@ippon.fr

TP Optimiser Ippon shopping


Cration 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.scala est gnr dans userfiles\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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

TP Optimiser Ippon shopping


Cration 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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

TP Optimiser Ippon shopping


Cration 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

contact@ippon.fr

TP Optimiser Ippon shopping


Cration 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

contact@ippon.fr

TP Optimiser Ippon shopping


Cration 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

contact@ippon.fr

TP Optimiser Ippon shopping


Cration d'un plan de test avec Gatling (Fuites mmoire 4/4)

@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

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

contact@ippon.fr

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 http
Ceci 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 8000
2) Cocher la capture des enttes, ajout d'assertion (facultatif), suivre les redirections
3) 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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

TP Optimiser Ippon shopping


Superviser l'aide de JMX (3/5)

@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

TP Optimiser Ippon shopping


Superviser 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

contact@ippon.fr

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

@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

Jour 2 : les tests fonctionnels avec


Selenium

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

Installation de WebDriver

Le plus simple est d'ajouter les dpendances


dans Maven

Utilisez le scope test pour ne pas polluer votre


classpath
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-firefox-driver</artifactId>
<version>2.39.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-support</artifactId>
<version>2.39.0</version>
<scope>test</scope>
</dependency>

@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

Lancement des tests

Attention lorsque vous lancez Selenium

Selenium est relativement lourd

Vous ne pourrez peut-tre pas le lancer sur votre


serveur d'intgration continue

Il faut lancer le serveur d'applications


Il faut lancer le navigateur

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

contact@ippon.fr

Cration du WebDriver

Vous devez choisir une implmentation du


WebDriver pour lancer vos tests
@Before
public 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

contact@ippon.fr

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

contact@ippon.fr

Slectionner des lments (2/2)

Vous pouvez aussi utiliser une expression


XPath
By.xpath("//input")

Ou directement du JavaScript
((JavascriptExecutor)driver)
.executeScript("return $('.test')[0]");

@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

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

contact@ippon.fr

Remplir un formulaire

Pour remplir un champ texte il faut le


slectionner et lui envoyer les caractres :
WebElement element = driver.findElement(By.id("login-id"));
element.sendKeys("jdoe");

Pour une drop-down list :


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

Astuce pour les lments cods en CSS


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

@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

Gestion de la navigation

Vous pouvez utiliser votre WebDriver pour


aller sur une page :
driver.get("http://localhost:8080/shopping/index.html");

Et pour cliquer sur des lments de cette


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

@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

Une API plus simple

Actions plus simples

click("#create-button")

clear("#firstName")

submit("#update")

executeScript("alert('Hello, world');")

Enchanements (API fluente)

Gestion des attentes simplifie

fill("#firstName").with("test")
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

contact@ippon.fr

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

contact@ippon.fr

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

@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

Jour 2 : les tests d'interface avec


Karma

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

contact@ippon.fr

Que permet de faire Karma?

Karma permet de tester son code sur un ou


plusieurs navigateurs

Les tests peuvent tourner de manire


automatique

En particulier Phantom.js

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

contact@ippon.fr

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

contact@ippon.fr

Grunt

Grunt permet de lancer des tches

Il propose ainsi d'automatiser

La minification du JavaScript et des


images

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

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

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 boolens
expect(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

contact@ippon.fr

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

contact@ippon.fr

Phantom.js

Permet de lancer depuis une console,


sans interface graphique, un moteur
WebKit

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

contact@ippon.fr

Yeoman

Mettre en place toute la stack technique


expose ici peut tre compliqu
Yeoman propose un systme de
gnrateurs, vous permettant d'avoir
un 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

contact@ippon.fr

Installation

Installez Node.js

http://nodejs.org/

Node.js fournit NPM, un gestionnaire de package

Vous pouvez ensuite installer Karma

Installation globale
npm install -g karma

Installation locale (dans ./node_modules/.bin)


npm install -g karma --save-dev

@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

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

contact@ippon.fr

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

contact@ippon.fr

Debugging

Vous pouvez dbugger dans votre IDE (s' il le


permet) ou directement dans Chrome :

Ajouter Chrome dans les navigateurs tests :


browsers = ['Chrome'];

Ajouter un point d'arrt dans le code :


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

Lancer Karma

Aller dans le navigateur Chrome ouvert, et


rafrachir la page
@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

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

contact@ippon.fr

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 :
npm install karma-junit-reporter --save-dev

Pour l'utiliser, ajouter dans le fichier de


configuration de Karma :
singleRun: true,
reporters: ['dots', 'junit'],
junitReporter: {
OutputFile: 'test-results.xml'
}
@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

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

@ippontech

www.ippon.fr

blog.ippon.fr www.atomes.com

contact@ippon.fr

Conclusion