ALT.Net Juin 2012 - Specflow

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/

Des Questions ?

Merci !