View
2.194
Download
1
Category
Preview:
Citation preview
Site : www.altnetfr.org
Twitter : @altnetfr et #altnetfr
Propositions de sessions:
sessions@altnetfr.org
BDD, TDD& Specflow
Mathias KlubaTwitter: @mathiaskluba
Remerciements
OCTO pour l’accueil
ALT.Net FR pour l’organisation!
Au menu
PlanPourquoi 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)
public int Sum(int a, int b)a=1, b=1 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)
public int SumWithMemory(int a, int b)a=1, b=1 Assert.AreEqual(4, result)
void SaveMemory(int result)
int LoadMemory()memory=2
Assert.AreEqual(4, result)
MemoryProvider.Stub(m => m.LoadMemory()).Return(2)
MemoryProvider.AssertWasCalled(m => SaveMemory (Arg<int>().Is.Anything))
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
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
Pourquoi est-ce devenu trop difficile d’écrire des tests ?
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”: GHERKINMê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 Specflow rend les tests plus simple ?
Comment utiliser Specflow ?Integration VisualStudio Génère des tests Nunit, mais aussi
MSTest
MBUnit
XUnit
Feature: pour décrire brièvement la fonctionnalité et l’intention
In order to use MyApplication
As a userI 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 PageAnd 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...
}
[Given("I’m on the (.*) Page")]
public void ImOnThePage(string pageName)
{
// use pageName
}
When I fill the form:
| Login | Password |
| mathias.kluba | **** |
[When(“I Fill the form:")]
public void ImOnThePage(Table formTable)
{
// use formTable:
// formTable.Rows[0]["Login"]
}
Comment utiliser Specflow ?
REGEX pour extraire les arguments
On peut utiliser des tableaux
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 *******
...
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 |
Comment utiliser Specflow ?
Utiliser le même scénario avec plusieurs jeux de données
Et plein d’autres fonctionnalités…
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 |
Comment utiliser Specflow ?
Et les concurrents?GreenPepper?
Fitness?
Nécessite un “wiki” pour rédiger les scénarios
Nécessite un “runner” pour exécuter les scénarios du wiki
Pas d’intégration VisualStudio
LiensSpecflow
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/
LiensUn 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
Des Questions ?
Merci !
Recommended