Documente Academic
Documente Profesional
Documente Cultură
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
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.
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
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
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Objectifs
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
De mieux coder
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Tests unitaires
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@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
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
assertEquals
assertSame
assertTrue
assertNotNull
fail
assertEquals(expected, printedCart);
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Hamcrest
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
FEST-Assert
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
AssertJ
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
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
@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
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Exemple
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Pause
Assertions
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@Inject
private TodoListsService todoListsService
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
http://martinfowler.com/articles/mocksArentStubs.html
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Exemple de Stub
Le Stub peut tre une classe anonyme (exemple cidessous), pour viter de crer trop de fichiers
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
3 frameworks principaux
EasyMock
JMock
Mockito
Plus concis
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Utilisation de EasyMock
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@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
....
}
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Utilisation de Mockito
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@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
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Mockito : https://github.com/mockito/mockito
EasyMock : http://easymock.org/
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Rappel
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
DBUnit
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Pause
Mockito et EasyMock
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Le TDD
Test-Driven Development
Mthodologie de travail :
@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
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Le BDD
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Cucumber
http://cukes.info/
https://github.com/cucumber/cucumber-jvm
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
mvn test
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
TP 1 Ippon shopping
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Correction TP 1
Item
FoodItem
@ippontech
JudoItem
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Correction TP 1
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
TP 2
Utilisation de AssertJ
Utilisation de Mockito
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
L'intgration continue
Aujourdhui il ny a plus de
question se poser :
utilisez Jenkins !
http://jenkins-ci.org/
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Bonne pratique
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
La couverture de code
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Que compte-t-on ?
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
L'outillage
JaCoCo http://www.eclemma.org/jacoco/
Cobertura : http://cobertura.sourceforge.net/
Emma : http://emma.sourceforge.net/
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
TP 3: analyse Sonar
Installation de Sonar
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Le plus tt possible
Lors de la phase de lancement, cela permet
de :
Valider l'architecture
Lors de l'laboration :
En production :
Supervision / Monitoring
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Mthodologie
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
Cela implique :
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Risques doccurrences
Favoriser une correction 2j/H pour 30 % de gain par rapport une 15j/H
pour 50 % de gain
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Jeux de donnes
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Fondation Apache
Maturit
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 :
Outils payants :
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Limites physiques
Suivre l'utilisation des ressources physiques :
Mmoire physique
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
JConsole
VisualVM
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
60% de hits minimum pour justifier de l'utilisation d'un cache sur une entit JPA
Trs compltes
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Threads
Bandwidth
Concurrence
HEAP
GC
Cache
Cache
Session
PB INFRA
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
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
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
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
//.body(RawFileBody("RecordedSimulation_request_1.txt")))
.body(StringBody("7")))
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
JProfiler
Yourkit
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
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
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Prsentation de Selenium
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Selenium IDE
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Selenium WebDriver
Et en particulier en Java !
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Installation de WebDriver
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Cration du WebDriver
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Le plus simple
By.id("cartGrossPrice")
By.cssSelector("#list-item .dropdown-menu li a")
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Ou directement du JavaScript
((JavascriptExecutor)driver)
.executeScript("return $('.test')[0]");
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Remplir un formulaire
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Gestion de la navigation
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Comment attendre?
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Copies d'cran
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
FluentLenium
https://github.com/FluentLenium/FluentLenium
Plus lisible
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
click("#create-button")
clear("#firstName")
submit("#update")
executeScript("alert('Hello, world');")
fill("#firstName").with("test")
Await().atMost(10, TimeUnit.SECONDS)
.until("#ajaxElement").isPresent()
$("#firstName").text("test")
$("#create-button").click()
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
https://code.google.com/p/selenium/wiki/PageObjects
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
TP 5: tests Selenium
http://localhost:8080/shopping
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Introduction
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
En particulier Phantom.js
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Node.js
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Grunt
Etc...
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Jasmine
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
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
Trs performant
http://phantomjs.org/
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Yeoman
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Installation
Installez Node.js
http://nodejs.org/
Installation globale
npm install -g karma
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Fichier de configuration de
Karma
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Tests en continu
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Debugging
Lancer Karma
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Quelques astuces
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Pour l'installer :
npm install karma-junit-reporter --save-dev
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
@ippontech
www.ippon.fr
blog.ippon.fr www.atomes.com
contact@ippon.fr
Conclusion