Plan
Pourquoi faire des tests ?
Qu’est-ce qu’un test unitaire ?
Pourquoi est-ce devenu trop difficile d’écrire
des tests ?
Comment Specflow rend les tests plus simple
?
Comment utiliser Specflow ?
Pourquoi faire des tests ?
Pour écrire du code sans bugs
Pour écrire du code plus simple
TDD, YAGNI, KISS
Pour s’assurer que le code fait bien ce qu’on
veut
Pour s’assurer de ne pas avoir de régressions
Qu’est-ce qu’un test unitaire ?
On test une « boite noire » (the Unit)
On fournit les données d’entré (input)
On vérifie le résultat (expectations)
a=1, b=1 public int Sum(int a, int b) Assert.AreEqual(2, result)
Qu’est-ce qu’un test unitaire ?
Les données d’entré peuvent provenir des dépendances
Les données de sortie peuvent être donné aux
dépendances
On a besoin de « mocker » les dépendances (RhinoMocks)
memory=2 int LoadMemory()
MemoryProvider.Stub(m => m.LoadMemory()).Return(2)
a=1, b=1 public int SumWithMemory(int a, int b) Assert.AreEqual(4, result)
MemoryProvider.AssertWasCalled(m => SaveMemory (Arg<int>().Is.Anything))
void SaveMemory(int result) Assert.AreEqual(4, result)
Pourquoi est-ce devenu trop difficile d’écrire des tests ?
Beaucoup de code pour construire les
données d’entré, et les résultats attendus
Beaucoup de code pour construire les
Mocks et vérifier les appels
Plusieurs scénarios de test, mais à 90%
identique: beaucoup de copier/coller
Des tests de plus de 100 lignes: difficile à
comprend ce qu’on test, et difficile à
maintenir
Pourquoi est-ce devenu trop difficile d’écrire des tests ?
1 seul test
318 lignes de code
Tous les tests d’une “suite”
1672 lignes de code
Les tests se resemblent
Beaucoup de duplication
Pas assez de commentaire
Difficile à lire/comprendre
Pourquoi est-ce devenu trop difficile d’écrire des tests ?
Les Tests Unitaires: ça reste du code!
Ils devraient respecter les standards de
qualité (analyse Sonar)
Il ne devrait pas y avoir de duplication (DRY)
Ils devraient être bien documentés
Ils peuvent être le une documentation/spec
des fonctionnalités
En lisant les tests, on comprend le code
Comment Specflow rend les tests plus simple ?
Ecrire des tests en Anglais
Ou Français, ou Allemand, etc. (40 langages)
Peuvent être écrit par le « Product Owner »
Peuvent être exécuté manuellement par l’équipe de QA
“Business Readable DSL”: GHERKIN
Même DSL pour tous les langages
BEHAT pour PHP
JBehave pour JAVA
Utiliser les tests comme les specs fonctionnelles
Behavior Driven Development: fonctionne avec les
“User Stories” (SCRUM) et YAGNI
Au lieu de specs théoriques: décrit le comportement de
l’application
Comment Specflow rend les tests plus simple ?
Force les développeurs à découper le test en
plusieurs étapes
Rend le code plus lisible
TDD: écrit le test étape par étape
Rendre les étapes ré-utilisables
Ne plus avoir de duplication
DRY
Possibilité de configurer les données d’entré et les
résultats attendues
Utiliser les mêmes étapes, dans une ordre
différent, avec des données d’entré/sortie
différentes, pour écrire de nouveaux scénarios de test
Comment utiliser Specflow ?
Integration VisualStudio Génère des tests Nunit, mais aussi
MSTest
MBUnit
XUnit
Comment utiliser Specflow ?
Feature: pour décrire brièvement la fonctionnalité et l’intention
In order to use MyApplication
As a user
I want to login into the application
Scenario: pour décrire les étapes d’un scénario
Successfull login / Invalid password / password expired / etc.
Données d’entré : GIVEN
Given I’m on the Login Page
And I fill my login and password
Ce qu’il faut tester : WHEN
When I click the button
Le résultat attendu: THEN
Then I’m redirected to the Home page
Comment utiliser Specflow ?
REGEX pour « mapper » le Gherkin avec le code du test unitaire
[Given("I’m on the Login Page")]
public void ImOnTheLoginPage()
{
// do some stuff...
}
REGEX pour extraire les arguments
[Given("I’m on the (.*) Page")]
public void ImOnThePage(string pageName)
{
// use pageName
}
On peut utiliser des tableaux
When I fill the form: [When(“I Fill the form:")]
| Login | Password | public void ImOnThePage(Table formTable)
| mathias.kluba | **** | {
// use formTable:
// formTable.Rows[0]["Login"]
}
Comment utiliser Specflow ?
On peut utiliser des @annotations pour décrire un
comportement commun
@selenium
Scenario: Succesful Login
Given I'm logged in with the user mathias.kluba and the password *******
...
Utiliser le même scénario avec plusieurs jeux de données
Scenario Outline: Process Files
Given I have the file <FILENAME>
When I process it
Then the result should be <RESULT>
Examples:
| FILENAME | RESULT |
| 0001.xml | OK |
| 0002.xml | ERROR |
Et plein d’autres fonctionnalités…
Comment utiliser Specflow ?
Pour des « User Acceptance Tests »
Peuvent être « exécutés » manuellement
Pour des tests d’interfaces avec Selenium avec
l’annotation @selenium
@selenium
Scenario: Succesful Login
Given I am in the login page
And I enter the user information
| Login | Password |
| mathias.kluba | anything |
When I press LOG IN button
Then I go to a Home page
And I have in the menu the text "Welcome Mathias KLUBA"
Comment utiliser Specflow ?
Pour de pures « Tests unitaires »
Plus facile à écrire
Plus facile à lire
Plus facile à comprendre l’erreur si le test échoue
Comment utiliser Specflow ?
Pur des tests de « données » (DAL)
Avec l’annotation @database
@database
Scenario: Find the user by ID
Given I have an instance of UserRepository
And I have the data in the table ”APP_Users":
| Id | Firstname | Lastname |
| 14 | Mathias | Kluba |
| 15 | Michel | Kluba |
When I call the FindByCriteria method with the UserId: 2
Then the result should be:
| Id | Firstname | Lastname |
| 2 | Mathias | Kluba |
Liens
Specflow
http://specflow.org/
Gherkin
https://github.com/aslakhellesoy/cucumber/wiki/gherkin
Martin Fowler: Business Readable DSL
http://martinfowler.com/bliki/BusinessReadableDSL.html
JBehave
http://jbehave.org/reference/stable/getting-started.html
Behat
http://everzet.com/Behat/
Liens
Un très bon lien expliquant le BDD
http://www.arolla.fr/blog/2012/06/bdd-c-est-quoi-donc/
Démo sur Github
https://github.com/grozeille/PricerTuto