Behavior Driven Development Using Visual Studio 2010 And SpecFlow Ivan Pavlović MVP Visual C#, Scrum Master hive-studios.com ivan.pavlovic@hivestudios.com Twitter: @ipavlovi Hive Studios We Build Awesome Software Teams What We Do? How We Deliver? • • • • • • • On Site Training • Workshops • Long term Coaching Scrum Coaching User Requirements Team Empowerment Solution Architecture Software Quality Build Automation Agenda • Back To Basics – What is Requirement • What is BDD? – Filling the gap • Language – Gherchin • Tools – SpecFlow, Visual Studio • Demos, common usage – Unit & Acceptance testing 3 What Is Software Requirement • Actor - Who is performing an action • Action - What action? • Result - Why, who benefits? • Acceptance Criteria - How To Demo? • Additional Details • Priority This is bare minimum! 4 Decomposition • Break down requirement into manageable chunks of work (1-2 days) • Developer is the most important end user of requirements in this stage • And I’ll say it again: Break down requirement into manageable chunks of work 5 Behaviour Driven Development • One of many agile development techniques • Specification driven by examples • Clear communication between domain experts, developers, testers and customers BDD is a second-generation, outside-in, pull-based, multiple-stakeholder, multiple-scale, high-automation, agile methodology. It describes a cycle of interactions with well-defined outputs, resulting in the delivery of working, tested software that matters. - Dan North Gherkin • Domain Specific Language • Easy to understand by customers • Simple sintax, few keywords – Feature – Background – Scenario, Scenario Outline – Given, When, Then • Localized to 35+ languages 7 Gherkin (sr-Latn) "sr-Latn": name: Serbian (Latin) native: Srpski (Latinica) feature: Funkcionalnost|Mogućnost|Mogucnost|Osobina background: Kontekst|Osnova|Pozadina scenario: Scenario|Primer scenario_outline: Struktura scenarija|Skica|Koncept examples: Primeri|Scenariji given: "*|Zadato|Zadate|Zatati" when: "*|Kada|Kad" then: "*|Onda" and: "*|I" but: "*|Ali" 8 Gherkin (sr-Cyrl) "sr-Cyrl": name: Serbian native: Српски feature: Функционалност|Могућност|Особина background: Контекст|Основа|Позадина scenario: Сценарио|Пример scenario_outline: Структура сценарија|Скица|Концепт examples: Примери|Сценарији given: "*|Задато|Задате|Задати" when: "*|Када|Кад" then: "*|Онда" and: "*|И" but: "*|Али" 9 Real example Feature: Serve coffee In order to earn money Customers should be able to buy coffee at all times Scenario: Buy last coffee Given there are 1 coffees left in the machine And I have deposited 1$ When I press the coffee button Then I should be served a coffee 10 Tools • SpecFlow – .NET, http://specflow.org – Nunit, MSTest, MBUnit… – Integrates into Visual Studio DevEnv • Users are writing *.feature files • Tool translates specs into *.feature.cs files • Inspired by Cucumber – Ruby http://cukes.info/ 11 Supported Test Types • • • • • • Unit testing Acceptance / Customer testing Integration testing Performance testing Regression testing ... 12 Unit Test Example DEMO 1 > HELLO WORLD DEMO Putting All The Pieces Together 1. 2. 3. 4. 5. 6. User writes features & scenarios, clarify SpecFlow generates one test per scenario Developer runs test Developer implements missing steps Developer writes production code Move to the next scenario What Does SpecFlow Do? … 7: 8: 9: 10: Mapping Step Definitions Given some precondition And some other precondition When some action by the actor Then some testable outcome is achieved [Given(@„some precondition")] public void SomePrecondition() { … do something… } [Given(@„some other precondition")] public void SomePrecondition() { … do something… } [When(@„some action by the actor")] public void SomePrecondition() { … do something… } [Then(@”some verifiable result”)] Public void VerifyResult() { … do assert… } 16 … Step Arguments - RegEx 7: Given I have 5 apples 8: 9: And I eat 2 of them When someone asks how many apples I do have 10: Then I should answer “3 apples” [Given(@„I have (.*) apples")] public void SomePrecondition(int numberOfApples) { … do something… } [Given(@„ I eat (.*) of them")] public void SomePrecondition(int numberOfEatenApples) { … do something… } [When(@„ someone asks how many apples I do have")] public void SomePrecondition() { … do something… } [Then(@” I should answer \“(.*) apples\””)] Public void VerifyResult(int expected) { … do assert of expected … } 17 DEMO DEMO 2 > STEP ARGUMENTS Scenario outline - refactoring Scenario: TC1 Add two numbers Given I have entered 1 into the calculator And I have entered 2 into the calculator When I press add Then the result should be 3 on the screen Scenario: TC2 Add two numbers Given I have entered 2 into the calculator And I have entered 2 into the calculator When I press add Then the result should be 4 on the screen 19 Scenario outline - refactoring Scenario Outline: TC5 Given I have entered <x> into the calculator And I have entered <y> into the calculator When I press add Then the result should be <result> on the screen Scenarios: addition | x | y | result| | 1 | 2 | 3 | | 2 | 2 | 4 | | 3 | -3 | 0 | 20 DEMO DEMO 3 > SCENARIO OUTLINE Table Parameters Scenario: Posting a valid entry Given I am on the posting page And I have filled out the form as follows | Label | Value | | Your name | Jakob | | Your comment | Das ist gut! | When I click the button labelled "Post" Then I should be on the guestbook page And the guestbook entries includes the following | Name | Comment | Posted date | | Jakob | Das ist gut! | (within last minute) | [Given(@"I have filled out the form as follows")] public void FillFormAsFollows(TechTalk.SpecFlow.Table table) { foreach (var row in table.Rows) { ….. Do something … } } 22 DEMO DEMO 4 > TABLE PARAMETERS How to Implement Step Definitions? • It’s up to you – depends on what you are testing 1. Public Interfaces / Components • Unit or integration testings 2. WebUI using browser automation • WatiN, Selenium 3. WebUI using Request/Respons • 4. Http Get/Post Win UI using automation • White / Windows UI Automation 24 WPF UI Automation using White DEMO 5 > ACCEPTANCE TESTING Key Points • You can and you should automate tests now – Win, WFP, Web, Silverlight, Service, Phone Apps • Break down requirements until you can express them in Gherkin, in your own language • Threat tests as first-class citizens, refactor often • Pay attention to the test setups and dependencies Resources • Specflow • http://specflow.org • Gherkin • https://github.com/cucumber/cucumber/wiki/Gherkin • White • http://white.codeplex.com/ • WatiN • http://watiN.sourceforge.net 27 Thank You! See you on Sinergija 11! Ivan Pavlović MVP Visual C#, Scrum Master hive-studios.com ivan.pavlovic@hivestudios.com Twitter: @ipavlovi