26
Site : www.altnetfr.org Twitter : @altnetfr et #altnetfr Propositions de sessions: [email protected]

ALT.Net Juin 2012 - Specflow

Embed Size (px)

Citation preview

Page 1: ALT.Net Juin 2012 - Specflow

Site : www.altnetfr.org

Twitter : @altnetfr et #altnetfr

Propositions de sessions:

[email protected]

Page 2: ALT.Net Juin 2012 - Specflow

BDD, TDD& Specflow

Mathias KlubaTwitter: @mathiaskluba

Page 3: ALT.Net Juin 2012 - Specflow

Remerciements

OCTO pour l’accueil

ALT.Net FR pour l’organisation!

Page 4: ALT.Net Juin 2012 - Specflow

Au menu

Page 5: ALT.Net Juin 2012 - Specflow

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 ?

Page 6: ALT.Net Juin 2012 - 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

Page 7: ALT.Net Juin 2012 - Specflow

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)

Page 8: ALT.Net Juin 2012 - Specflow

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

Page 9: ALT.Net Juin 2012 - Specflow

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

Page 10: ALT.Net Juin 2012 - Specflow

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 ?

Page 11: ALT.Net Juin 2012 - Specflow

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 ?

Page 12: ALT.Net Juin 2012 - Specflow

Comment Specflow rend les tests plus simple ?

Page 13: ALT.Net Juin 2012 - Specflow

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 ?

Page 14: ALT.Net Juin 2012 - Specflow

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 ?

Page 15: ALT.Net Juin 2012 - Specflow

Comment utiliser Specflow ?Integration VisualStudio Génère des tests Nunit, mais aussi

MSTest

MBUnit

XUnit

Page 16: ALT.Net Juin 2012 - Specflow

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 ?

Page 17: ALT.Net Juin 2012 - 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

Page 18: ALT.Net Juin 2012 - 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 *******

...

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…

Page 19: ALT.Net Juin 2012 - 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 ?

Page 20: ALT.Net Juin 2012 - Specflow

Pour de pures « Tests unitaires »

Plus facile à écrire

Plus facile à lire

Plus facile à comprendre l’erreur si le test échoue

Comment utiliser Specflow ?

Page 21: ALT.Net Juin 2012 - 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 ?

Page 22: ALT.Net Juin 2012 - 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

Page 23: ALT.Net Juin 2012 - Specflow

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/

Page 25: ALT.Net Juin 2012 - Specflow

Des Questions ?

Page 26: ALT.Net Juin 2012 - Specflow

Merci !