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)
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))
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
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 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 ?
(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 ?
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 ?
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 ?
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
@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…
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 ?
@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 ?