Budapest, 26-28 October 2016
PROPERTY BASED BDD EXAMPLES Presented by Gaspar Nagy [email protected] @gasparnagy, http://gasparnagy.com
© All rights reserved BDD PBT
• Behavior Driven • Property Based Testing Development
• ~Specification by • Property Testing Example (SbE) • ~Random Testing • ~Acceptance Test Driven • ~Model‐based Testing Development (ATDD) • ~Keyword Driven Testing
2 © All rights reserved What is BDD? – Classic model
[HttpPost] public ActionResult Answer(int answer) { implement TriviaEntities db = new TriviaEntities(); var question = db.FindQuestion(CurrentQuestion);
if (question.Type == QuestionType.Easy) { db.AddScore(question, user, 10); } else { db.AddScore(question, user, 50); }
var model = new GameModel { Score = db.GetScore(question, user) }; feedback return View(model); } What is BDD?
Automation with Collaboration Cucumber/SpecFlow
Scenario: Correct easy answer scores 10 Given I register a team When I submit a correct easy answer Then my score should be 10 This is an example!
Scenario: Correct easy answer scores 10 Given I register a team When I submit a correct easy answer Then my score should be 10
5 © All rights reserved How many examples you need?
Scenario: Add two numbers Given I have entered 1 into the calculator And I have entered 2 into the calculator Scenario: Add two numbers When I press add Given I have entered 5 into the calculator Then the result should be 3 on the screen And I have entered ‐7 into the calculator When I press add Then the result should be ‐2 on the screen
Scenario: Add two numbers Given I have entered 2 into the calculator And I have entered 0 into the calculator When I press add Then the result should be 2 on the screen
6 © All rights reserved Scenario Outlines
Scenario Outline: Add two numbers Given I have entered into the calculator And I have entered into the calculator When I press add Then the result should be
Examples: | a | b | result | | 1 | 2 | 3 | | 5 | ‐7 | ‐2 | | 2 | 0 | 2 |
7 © All rights reserved BDD is for…
understanding & validating
business requirements through illustrative examples
8 © All rights reserved PBT is for…
verifying the “properties” implementation through checking statements about the output for many different possible inputs
source: http://blog.jessitron.com/2013/04/property-based-testing-what-is-it.html
9 © All rights reserved For example for addition…
• Commutative property: a + b = b + a • Associative property: (a + b) + c = a + (b + c) • Identity property: a + 0 = a • Distributive property: a * (b + c) = a*b + a*c
We would like to verify these for ~ALL input combinations!
10 © All rights reserved There is a tool for doing this!
• QuickCheck (Haskell) is the canonical framework, but there are many different ports of it to other programming languages • QuickCheck for Java • PhpQuickCheck for PHP • ScalaCheck for Scala • FsCheck for .NET (F#, C#) • … (see more at https://en.wikipedia.org/wiki/QuickCheck)
11 © All rights reserved FsCheck Sample
12 © All rights reserved When the implementation is wrong…
13 © All rights reserved BDD PBT
• 1 + 2 = 3 • Commutative • 5 + ‐7 = ‐2 • Associative • 2 + 0 = 2 • Identity • Distributive
14 © All rights reserved Examples in SpecFlow
15 © All rights reserved Identity property BDD style…
16 © All rights reserved Defining constraints and expectations…
17 © All rights reserved More real life examples…
18 © All rights reserved Summary
• BDD turns examples into automated tests • PBT automates rules with many different input
• The power of this two can be combined to achieve an executable specification • The BDD and the PBT tools can work together for this • See http://github.com/gasparnagy/SpecFlow.FsCheck
19 © All rights reserved QUESTIONS? [email protected] Special thanks to @gasparnagy • Ciaran McNulty http://gasparnagy.com • Konstantin Kudryashov
© All rights reserved