Upgrade to Pro — share decks privately, control downloads, hide ads and more …

BDD, TDD & Specflow

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest. →

BDD, TDD & Specflow

Meetup ALT.Net FR

Avatar for Mathias Kluba

Mathias Kluba

June 01, 2012

More Decks by Mathias Kluba

Other Decks in Programming

Transcript

  1. 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 ?
  2. 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
  3. 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)
  4. 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))
  5. 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
  6. 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 ?
  7. 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 ?
  8. 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 ?
  9. 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 ?
  10. 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 ?
  11. 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
  12. 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…
  13. 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 ?
  14. Pour de pures « Tests unitaires » Plus facile à

    écrire Plus facile à lire Plus facile à comprendre l’erreur si le test échoue Comment utiliser Specflow ?
  15. 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 ?
  16. 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
  17. 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/