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 on the screen

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) + = 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