Publicité

ALT.Net Juin 2012 - Specflow

Technical Architect at Societe Generale Corporate and Investment Banking - SGCIB à Societe Generale Corporate and Investment Banking - SGCIB
27 Jun 2012
Publicité

Contenu connexe

Publicité
Publicité

ALT.Net Juin 2012 - Specflow

  1. Site : www.altnetfr.org Twitter : @altnetfr et #altnetfr Propositions de sessions: sessions@altnetfr.org
  2. BDD, TDD & Specflow Mathias Kluba Twitter: @mathiaskluba
  3. Remerciements OCTO pour l’accueil ALT.Net FR pour l’organisation!
  4. Au menu
  5. 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 ?
  6. 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
  7. 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)
  8. 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)
  9. 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
  10. 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
  11. 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
  12. Comment Specflow rend les tests plus simple ?
  13. 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
  14. 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
  15. Comment utiliser Specflow ? Integration VisualStudio Génère des tests Nunit, mais aussi MSTest MBUnit XUnit
  16. 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
  17. 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"] }
  18. 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…
  19. 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"
  20. Comment utiliser Specflow ? Pour de pures « Tests unitaires » Plus facile à écrire Plus facile à lire Plus facile à comprendre l’erreur si le test échoue
  21. 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 |
  22. 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
  23. 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/
  24. 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
  25. Des Questions ?
  26. Merci !
Publicité