bdd - writing better scenario
TRANSCRIPT
![Page 1: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/1.jpg)
Behavior Driven Development
Writing better scenario
Arnauld LOYER — @aloyer Mastering Software Development
EAre You really
doing BDD?
![Page 2: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/2.jpg)
Disclaimer
No scenario has been harmed during the investigation
github search:
extension:feature travel/deal/…
Most remarks are purely subjectives
@aloyer
![Page 3: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/3.jpg)
Let’s try to diagnose the maturity
@aloyer
Anti-Pattern
… an antipattern was something that seems like a good idea when you begin, but leads you into trouble.
http://martinfowler.com/bliki/AntiPattern.html
![Page 4: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/4.jpg)
Having conversations with domain experts
and discover unknowns
and using examples
to gain a shared understanding of the desired behavior
@aloyer
C
![Page 5: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/5.jpg)
Ready?
![Page 6: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/6.jpg)
Functional Tests or BDD ?
@aloyer
![Page 7: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/7.jpg)
Functional Tests or BDD ?
@aloyer
![Page 8: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/8.jpg)
Functional Tests or BDD ?
@aloyer
Acceptance
![Page 9: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/9.jpg)
Feature: The Confluence server is up In order to make sure that Confluence has been installed and runs As a developer I want to access Confluence's home page Scenario: Developer accesses the home page Given the url of Confluences home page When a web user browses to the url Then the connection should be successful Then the page status should be OK Then the page should have the title "Confluence Setup Wizard - Confluence"
https://github.com/xebia-france/chef-confluence-jira-crowd/blob/a26e29a85d1e75b9b612a560685940b40c971adc/test/integration/confluence-jira-crowd/cucumber/confluence_up.feature
BDD ?
@aloyer
![Page 10: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/10.jpg)
Feature: The Confluence server is up In order to make sure that Confluence has been installed and runs As a developer I want to access Confluence's home page Scenario: Developer accesses the home page Given the url of Confluences home page When a web user browses to the url Then the connection should be successful Then the page status should be OK Then the page should have the title "Confluence Setup Wizard - Confluence"
https://github.com/xebia-france/chef-confluence-jira-crowd/blob/a26e29a85d1e75b9b612a560685940b40c971adc/test/integration/confluence-jira-crowd/cucumber/confluence_up.feature
Sanity CheckBDD ?
behavior ?
@aloyer
![Page 11: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/11.jpg)
Feature: The Confluence server is up In order to make sure that Confluence has been installed and runs As a developer I want to access Confluence's home page Scenario: Developer accesses the home page Given the url of Confluences home page When a web user browses to the url Then the connection should be successful Then the page status should be OK Then the page should have the title "Confluence Setup Wizard - Confluence"
https://github.com/xebia-france/chef-confluence-jira-crowd/blob/a26e29a85d1e75b9b612a560685940b40c971adc/test/integration/confluence-jira-crowd/cucumber/confluence_up.feature
Sanity CheckBDD ?
behavior ?
@aloyer
![Page 12: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/12.jpg)
@aloyer 12
Given-When-Then
Then an outcome should be observed
Given a context
When an event happens
3 phases
setup/arrange
exercise/act
verify/assert
Tips
![Page 13: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/13.jpg)
Feature: Asset Manager @local-network @normal Scenario: check an asset can be loaded Given I am testing "asset-manager" And I am an authenticated API client When I visit "/assets/513a0efbed915d425e000002" Then I should get a 200 status code And I should see "120613_Albania_Travel_Advice_WEB_Ed2_jpeg.jpg" @normal Scenario: check an asset can be served Given I am testing "static" When I visit "/media/513a0efbed915d425e000002/120613_Albania_Travel_Advice_WEB_Ed2_jpeg.jpg" Then I should get a 200 status code And I should get a content length of "212880"
https://github.com/alphagov/smokey/blob/4c8fe739938e4a4b8b7bb393dfd485efd39dc034/features/asset_manager.feature
BDD ?
@aloyer
![Page 14: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/14.jpg)
Feature: Asset Manager @local-network @normal Scenario: check an asset can be loaded Given I am testing "asset-manager" And I am an authenticated API client When I visit "/assets/513a0efbed915d425e000002" Then I should get a 200 status code And I should see "120613_Albania_Travel_Advice_WEB_Ed2_jpeg.jpg" @normal Scenario: check an asset can be served Given I am testing "static" When I visit "/media/513a0efbed915d425e000002/120613_Albania_Travel_Advice_WEB_Ed2_jpeg.jpg" Then I should get a 200 status code And I should get a content length of "212880"
https://github.com/alphagov/smokey/blob/4c8fe739938e4a4b8b7bb393dfd485efd39dc034/features/asset_manager.feature
BDD ?
Business Language?
Technical Test
web page Selenium
technical details
@aloyer
![Page 15: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/15.jpg)
Feature: Asset Manager @local-network @normal Scenario: check an asset can be loaded Given I am testing "asset-manager" And I am an authenticated API client When I visit "/assets/513a0efbed915d425e000002" Then I should get a 200 status code And I should see "120613_Albania_Travel_Advice_WEB_Ed2_jpeg.jpg" @normal Scenario: check an asset can be served Given I am testing "static" When I visit "/media/513a0efbed915d425e000002/120613_Albania_Travel_Advice_WEB_Ed2_jpeg.jpg" Then I should get a 200 status code And I should get a content length of "212880"
https://github.com/alphagov/smokey/blob/4c8fe739938e4a4b8b7bb393dfd485efd39dc034/features/asset_manager.feature
BDD ? Technical Test
differences?
@aloyer
different results?
Unclear and non-sustainable
![Page 16: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/16.jpg)
Tests BDD
Business
Tech’
Cucumber
Behavior
Let’s try to diagnose the maturity
@aloyer
![Page 17: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/17.jpg)
Should I use cucumber to write technical tests?
Be pragmatic!Who will read the scenario?
Are you ready to pay the cucumber overhead? compared to raw xUnit tests
Do you really contribute to a shared knowledge or do you increase the business/technical gap?
@aloyer
![Page 18: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/18.jpg)
Who write the scenario ?&read
@aloyer
![Page 19: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/19.jpg)
L
N
C
Tester
Business/PO Developer?
@aloyer
![Page 20: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/20.jpg)
Feature: Asset Manager @local-network @normal Scenario: check an asset can be loaded Given I am testing "asset-manager" And I am an authenticated API client When I visit "/assets/513a0efbed915d425e000002" Then I should get a 200 status code And I should see "120613_Albania_Travel_Advice_WEB_Ed2_jpeg.jpg" @normal Scenario: check an asset can be served Given I am testing "static" When I visit "/media/513a0efbed915d425e000002/120613_Albania_Travel_Advice_WEB_Ed2_jpeg.jpg" Then I should get a 200 status code And I should get a content length of "212880"
https://github.com/alphagov/smokey/blob/4c8fe739938e4a4b8b7bb393dfd485efd39dc034/features/asset_manager.feature
Who wrote this ?
@aloyer
![Page 21: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/21.jpg)
@MoveTokenFeature: Moving the token over the board As a player I want to move to new positions on the board So that I can get rich and win the game Scenario Outline: Moving a token after a single throw Given players token is at starting position <startingPosition> When player throws die1 <die1> and die2 <die2> Then players token moves to a new position <newPosition> Examples: | startingPosition | die1 | die2 | newPosition | | 1 | 1 | 2 | 4 | | 2 | 3 | 4 | 9 | | 39 | 2 | 2 | 3 |
Forgot the rule ?
https://github.com/xebia/spec-by-example-2014-09-29/blob/4eabded6b22e816f6509a3ecd2c2180b62f4d73d/src/test/resources/monopoly/cucumber/MoveToken.feature
@aloyer
![Page 22: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/22.jpg)
@MoveTokenFeature: Moving the token over the board As a player I want to move to new positions on the board So that I can get rich and win the game Scenario Outline: Moving a token after a single throw Given players token is at starting position <startingPosition> When player throws die1 <die1> and die2 <die2> Then players token moves to a new position <newPosition> Examples: | startingPosition | die1 | die2 | newPosition | | 1 | 1 | 2 | 4 | | 2 | 3 | 4 | 9 | | 39 | 2 | 2 | 3 |
Forgot the rule ?
https://github.com/xebia/spec-by-example-2014-09-29/blob/4eabded6b22e816f6509a3ecd2c2180b62f4d73d/src/test/resources/monopoly/cucumber/MoveToken.feature
@aloyer
where is the rule?
The All-In-One Effect
![Page 23: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/23.jpg)
@MoveTokenFeature: Moving the token over the board As a player I want to move to new positions on the board So that I can get rich and win the game Scenario Outline: Moving a token after a single throw Given players token is at starting position <startingPosition> When player throws die1 <die1> and die2 <die2> Then players token moves to a new position <newPosition> Examples: | startingPosition | die1 | die2 | newPosition | | 1 | 1 | 2 | 4 | | 2 | 3 | 4 | 9 | | 39 | 2 | 2 | 3 |
Forgot the rule ?
https://github.com/xebia/spec-by-example-2014-09-29/blob/4eabded6b22e816f6509a3ecd2c2180b62f4d73d/src/test/resources/monopoly/cucumber/MoveToken.feature
where is the rule?
the outline effect
@aloyer
The All-In-One Effect
![Page 24: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/24.jpg)
Feature: Deal team invitations 1. A "My deals" section with The deals that I created The deals on which me or my team are deal leaders The deals on which me or my team are deal members 2. A "Other deals" section with: The deals for which me or my team are "other contact" Scenario Outline: People invited into deal team directly Given the following deals have been created | Name | Creator | User leaders | User members | User other contacts | | AF | John | Charlotte | Peter | Diego | | KLM | Charlotte | John | Charlotte | Peter | | IB | Charlotte | Charlotte | John | Peter | | GW | Diego | Charlotte | Peter | John | | TAP | Diego | Charlotte | Peter | | | TUN | Diego | Charlotte | Peter | Matthieu | When <user> logs into the platform Then the My deals section should have only <my deals> And the Other deals section should have only <other deals> Examples: | user | my deals | other deals | | John | AF, KLM, IB | GW | | Charlotte | AF, KLM, IB, GW, TAP, TUN | <none> | | Peter | AF, GW, TAP, TUN | KLM, IB | | Matthieu | <none> | TUN | | Mariem | <none> | <none> |
Is the rule obvious?
@aloyer
![Page 25: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/25.jpg)
Feature: Deal team invitations 1. A "My deals" section with The deals that I created The deals on which me or my team are deal leaders The deals on which me or my team are deal members 2. A "Other deals" section with: The deals for which me or my team are "other contact" Scenario Outline: People invited into deal team directly Given the following deals have been created | Name | Creator | User leaders | User members | User other contacts | | AF | John | Charlotte | Peter | Diego | | KLM | Charlotte | John | Charlotte | Peter | | IB | Charlotte | Charlotte | John | Peter | | GW | Diego | Charlotte | Peter | John | | TAP | Diego | Charlotte | Peter | | | TUN | Diego | Charlotte | Peter | Matthieu | When <user> logs into the platform Then the My deals section should have only <my deals> And the Other deals section should have only <other deals> Examples: | user | my deals | other deals | | John | AF, KLM, IB | GW | | Charlotte | AF, KLM, IB, GW, TAP, TUN | <none> | | Peter | AF, GW, TAP, TUN | KLM, IB | | Matthieu | <none> | TUN | | Mariem | <none> | <none> |
Is the rule obvious?ARES
![Page 26: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/26.jpg)
Feature: Deal team invitations 1. A "My deals" section with The deals that I created The deals on which me or my team are deal leaders The deals on which me or my team are deal members 2. A "Other deals" section with: The deals for which me or my team are "other contact" Scenario Outline: People invited into deal team directly Given the following deals have been created | Name | Creator | User leaders | User members | User other contacts | | AF | John | Charlotte | Peter | Diego | | KLM | Charlotte | John | Charlotte | Peter | | IB | Charlotte | Charlotte | John | Peter | | GW | Diego | Charlotte | Peter | John | | TAP | Diego | Charlotte | Peter | | | TUN | Diego | Charlotte | Peter | Matthieu | When <user> logs into the platform Then the My deals section should have only <my deals> And the Other deals section should have only <other deals> Examples: | user | my deals | other deals | | John | AF, KLM, IB | GW | | Charlotte | AF, KLM, IB, GW, TAP, TUN | <none> | | Peter | AF, GW, TAP, TUN | KLM, IB | | Matthieu | <none> | TUN | | Mariem | <none> | <none> |
what if … I belongs to multiple group?
Is the rule obvious?ARES
the outline effect
![Page 27: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/27.jpg)
Feature: Deal team invitations 1. A "My deals" section with The deals that I created The deals on which me or my team are deal leaders The deals on which me or my team are deal members 2. A "Other deals" section with: The deals for which me or my team are "other contact" Scenario Outline: People invited into deal team directly Given the following deals have been created | Name | Creator | User leaders | User members | User other contacts | | AF | John | Charlotte | Peter | Diego | | KLM | Charlotte | John | Charlotte | Peter | | IB | Charlotte | Charlotte | John | Peter | | GW | Diego | Charlotte | Peter | John | | TAP | Diego | Charlotte | Peter | | | TUN | Diego | Charlotte | Peter | Matthieu | When <user> logs into the platform Then the My deals section should have only <my deals> And the Other deals section should have only <other deals> Examples: | user | my deals | other deals | | John | AF, KLM, IB | GW | | Charlotte | AF, KLM, IB, GW, TAP, TUN | <none> | | Peter | AF, GW, TAP, TUN | KLM, IB | | Matthieu | <none> | TUN | | Mariem | <none> | <none> |
what if … I belongs to multiple group?
Is the rule obvious?ARES
the outline effect
![Page 28: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/28.jpg)
Feature: Deals display order in the home page As an FO I need to see my deals ordered in the way that fits my function In order to have a clear view of the most important or urgent deals. Clarifications: Deals should be ordered by expected closing date, the first deals displayed should be the ones with the oldest expected closing date. For cards display, the oldest cards will be on the top and for cards on the same row, the oldest card will be on the left. For table display, the oldest cards will on the top. For deals with the same expected closing date, they should be ordered by deal name Scenario: Deals display order Given the following deals | name | client name | total amount | creator | user leaders | user members | user other contacts | expected closing date | pricing status | Credit approval status | Lso deal code | Cwf request code | stage | confidentiality level | | Aircraft AF | Air France | 150000000 | Johny | Charlotte | Peter | Diego | May 12, 2016 | true | Not submitted | L0377450 | 2015_07_001105 | Marketing | My Team | | Aircraft KLM | KLM | 15000000 | Charlotte | Johny | Charlotte | Peter | Jul 11, 2014 | false | In progress | L0377451 | 2015_08_001105 | Bidding | Confidential | | Aircraft TUN | Tunisair | 16000000 | Johny | Charlotte | Charlotte | Peter | Jul 12, 2014 | false | In progress | L0377451 | 2015_09_001105 | Bidding | My Team | When Charlotte logs into the platform Then the My deals section must be ordered as Aircraft KLM,Aircraft TUN,Aircraft AF
the A4 rule ?
@aloyer
![Page 29: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/29.jpg)
Feature: Deals display order in the home page As an FO I need to see my deals ordered in the way that fits my function In order to have a clear view of the most important or urgent deals. Clarifications: Deals should be ordered by expected closing date, the first deals displayed should be the ones with the oldest expected closing date. For cards display, the oldest cards will be on the top and for cards on the same row, the oldest card will be on the left. For table display, the oldest cards will on the top. For deals with the same expected closing date, they should be ordered by deal name Scenario: Deals display order Given the following deals | name | client name | total amount | creator | user leaders | user members | user other contacts | expected closing date | pricing status | Credit approval status | Lso deal code | Cwf request code | stage | confidentiality level | | Aircraft AF | Air France | 150000000 | Johny | Charlotte | Peter | Diego | May 12, 2016 | true | Not submitted | L0377450 | 2015_07_001105 | Marketing | My Team | | Aircraft KLM | KLM | 15000000 | Charlotte | Johny | Charlotte | Peter | Jul 11, 2014 | false | In progress | L0377451 | 2015_08_001105 | Bidding | Confidential | | Aircraft TUN | Tunisair | 16000000 | Johny | Charlotte | Charlotte | Peter | Jul 12, 2014 | false | In progress | L0377451 | 2015_09_001105 | Bidding | My Team | When Charlotte logs into the platform Then the My deals section must be ordered as Aircraft KLM,Aircraft TUN,Aircraft AF
the A4 rule ?
Feature: Deals display order in the home page
Deals should be ordered by expected closing date, the first deals displayed should be the ones with the oldest expected closing date. For deals with the same expected closing date, they should be ordered by deal name Scenario: Deals display order Given the following deals | name | client name | total amount | creator | user leaders | user members | user other contacts | expected closing date | pricing status | Credit approval status | Lso deal code | Cwf request code | stage | confidentiality level | | AF | Air France | 150000000 | Johny | Charlotte | Peter | Diego | May 12, 2016 | true | Not submitted | L0377450 | 2015_07_001105 | Marketing | My Team | | KLM | KLM | 15000000 | Charlotte | Johny | Charlotte | Peter | Jul 11, 2014 | false | In progress | L0377451 | 2015_08_001105 | Bidding | Confidential | | TUN | Tunisair | 16000000 | Johny | Charlotte | Charlotte | Peter | Jul 12, 2014 | false | In progress | L0377451 | 2015_09_001105 | Bidding | My Team | When Charlotte logs into the platform Then the My deals section must be ordered as KLM, TUN, AF
![Page 30: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/30.jpg)
Feature: Deals display order in the home page As an FO I need to see my deals ordered in the way that fits my function In order to have a clear view of the most important or urgent deals. Clarifications: Deals should be ordered by expected closing date, the first deals displayed should be the ones with the oldest expected closing date. For cards display, the oldest cards will be on the top and for cards on the same row, the oldest card will be on the left. For table display, the oldest cards will on the top. For deals with the same expected closing date, they should be ordered by deal name Scenario: Deals display order Given the following deals | name | client name | total amount | creator | user leaders | user members | user other contacts | expected closing date | pricing status | Credit approval status | Lso deal code | Cwf request code | stage | confidentiality level | | Aircraft AF | Air France | 150000000 | Johny | Charlotte | Peter | Diego | May 12, 2016 | true | Not submitted | L0377450 | 2015_07_001105 | Marketing | My Team | | Aircraft KLM | KLM | 15000000 | Charlotte | Johny | Charlotte | Peter | Jul 11, 2014 | false | In progress | L0377451 | 2015_08_001105 | Bidding | Confidential | | Aircraft TUN | Tunisair | 16000000 | Johny | Charlotte | Charlotte | Peter | Jul 12, 2014 | false | In progress | L0377451 | 2015_09_001105 | Bidding | My Team | When Charlotte logs into the platform Then the My deals section must be ordered as Aircraft KLM,Aircraft TUN,Aircraft AF
the A4 rule ?
Feature: Deals display order in the home page
Deals should be ordered by expected closing date, the first deals displayed should be the ones with the oldest expected closing date. For deals with the same expected closing date, they should be ordered by deal name Scenario: Deals display order Given the following deals | name | client name | total amount | creator | user leaders | user members | user other contacts | expected closing date | pricing status | Credit approval status | Lso deal code | Cwf request code | stage | confidentiality level | | AF | Air France | 150000000 | Johny | Charlotte | Peter | Diego | May 12, 2016 | true | Not submitted | L0377450 | 2015_07_001105 | Marketing | My Team | | KLM | KLM | 15000000 | Charlotte | Johny | Charlotte | Peter | Jul 11, 2014 | false | In progress | L0377451 | 2015_08_001105 | Bidding | Confidential | | TUN | Tunisair | 16000000 | Johny | Charlotte | Charlotte | Peter | Jul 12, 2014 | false | In progress | L0377451 | 2015_09_001105 | Bidding | My Team | When Charlotte logs into the platform Then the My deals section must be ordered as KLM, TUN, AF
![Page 31: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/31.jpg)
Feature: Deals display order in the home page As an FO I need to see my deals ordered in the way that fits my function In order to have a clear view of the most important or urgent deals. Clarifications: Deals should be ordered by expected closing date, the first deals displayed should be the ones with the oldest expected closing date. For cards display, the oldest cards will be on the top and for cards on the same row, the oldest card will be on the left. For table display, the oldest cards will on the top. For deals with the same expected closing date, they should be ordered by deal name Scenario: Deals display order Given the following deals | name | client name | total amount | creator | user leaders | user members | user other contacts | expected closing date | pricing status | Credit approval status | Lso deal code | Cwf request code | stage | confidentiality level | | Aircraft AF | Air France | 150000000 | Johny | Charlotte | Peter | Diego | May 12, 2016 | true | Not submitted | L0377450 | 2015_07_001105 | Marketing | My Team | | Aircraft KLM | KLM | 15000000 | Charlotte | Johny | Charlotte | Peter | Jul 11, 2014 | false | In progress | L0377451 | 2015_08_001105 | Bidding | Confidential | | Aircraft TUN | Tunisair | 16000000 | Johny | Charlotte | Charlotte | Peter | Jul 12, 2014 | false | In progress | L0377451 | 2015_09_001105 | Bidding | My Team | When Charlotte logs into the platform Then the My deals section must be ordered as Aircraft KLM,Aircraft TUN,Aircraft AF
the A4 rule ?
Feature: Deals display order in the home page
Deals should be ordered by expected closing date, the first deals displayed should be the ones with the oldest expected closing date. For deals with the same expected closing date, they should be ordered by deal name Scenario: Deals display order Given the following deals | name | client name | total amount | creator | user leaders | user members | user other contacts | expected closing date | pricing status | Credit approval status | Lso deal code | Cwf request code | stage | confidentiality level | | AF | Air France | 150000000 | Johny | Charlotte | Peter | Diego | May 12, 2016 | true | Not submitted | L0377450 | 2015_07_001105 | Marketing | My Team | | KLM | KLM | 15000000 | Charlotte | Johny | Charlotte | Peter | Jul 11, 2014 | false | In progress | L0377451 | 2015_08_001105 | Bidding | Confidential | | TUN | Tunisair | 16000000 | Johny | Charlotte | Charlotte | Peter | Jul 12, 2014 | false | In progress | L0377451 | 2015_09_001105 | Bidding | My Team | When Charlotte logs into the platform Then the My deals section must be ordered as KLM, TUN, AF
B
![Page 32: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/32.jpg)
Feature: Deals display order in the home page As an FO I need to see my deals ordered in the way that fits my function In order to have a clear view of the most important or urgent deals. Clarifications: Deals should be ordered by expected closing date, the first deals displayed should be the ones with the oldest expected closing date. For cards display, the oldest cards will be on the top and for cards on the same row, the oldest card will be on the left. For table display, the oldest cards will on the top. For deals with the same expected closing date, they should be ordered by deal name Scenario: Deals display order Given the following deals | name | client name | total amount | creator | user leaders | user members | user other contacts | expected closing date | pricing status | Credit approval status | Lso deal code | Cwf request code | stage | confidentiality level | | Aircraft AF | Air France | 150000000 | Johny | Charlotte | Peter | Diego | May 12, 2016 | true | Not submitted | L0377450 | 2015_07_001105 | Marketing | My Team | | Aircraft KLM | KLM | 15000000 | Charlotte | Johny | Charlotte | Peter | Jul 11, 2014 | false | In progress | L0377451 | 2015_08_001105 | Bidding | Confidential | | Aircraft TUN | Tunisair | 16000000 | Johny | Charlotte | Charlotte | Peter | Jul 12, 2014 | false | In progress | L0377451 | 2015_09_001105 | Bidding | My Team | When Charlotte logs into the platform Then the My deals section must be ordered as Aircraft KLM,Aircraft TUN,Aircraft AF
the A4 rule ?
Feature: Deals display order in the home page
Deals should be ordered by expected closing date, the first deals displayed should be the ones with the oldest expected closing date. For deals with the same expected closing date, they should be ordered by deal name Scenario: Deals display order Given the following deals | name | expected closing date | | AF | May 12, 2016 | | KLM | Jul 11, 2014 | | TUN | Jul 12, 2014 | When Charlotte logs into the platform Then the My deals section must be ordered as KLM, TUN, AF
O
![Page 33: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/33.jpg)
Tests BDD
Business
Tech’
Cucumber
Behavior
Let’s try to diagnose the maturity
@aloyer
![Page 34: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/34.jpg)
Cucumber
3 Amigos
Tests BDD
Business
Tech’
Behavior
Let’s try to diagnose the maturity
@aloyer
![Page 35: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/35.jpg)
Cucumber
3 Amigos
Tests BDD
Business
Tech’
Behavior
Let’s try to diagnose the maturity
Scenario
@aloyer
![Page 36: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/36.jpg)
CucumberScenario3 Amigos
Driven Development
Tests BDD
Business
Tech’
Behavior
Let’s try to diagnose the maturity
@aloyer
![Page 37: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/37.jpg)
Scenario should be written using the Business Language
Together
What is the intent?Have I understood the expected behavior?
Do I clearly understand the rule when reading a scenario?How many rules are exposed within the scenario?
@aloyer
Try to limit to One rule per scenario
![Page 38: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/38.jpg)
What level of details ?
Writing better scenario
@aloyer
![Page 39: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/39.jpg)
@BuyingPropertiesFeature: Buying properties As a player I want to buy properties So that I can ask rent when my opponents land on it Scenario: Buying property Given I land on unowned property And my funds are sufficient When I choose to buy the property Then I pay the printed price And I receive the title deed Scenario: No sufficient funds Given I land on unowned property And my funds are not sufficient Then I am not able to buy the property
https://github.com/xebia/workshop-agile-testing/blob/8705e3f93270662285cd9c8ec8c24e5ac957f3ed/src/test/resources/features/BuyingProperties.feature
Enough details ?
@aloyer
![Page 40: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/40.jpg)
@BuyingPropertiesFeature: Buying properties As a player I want to buy properties So that I can ask rent when my opponents land on it Scenario: Buying property Given I land on unowned property And my funds are sufficient When I choose to buy the property Then I pay the printed price And I receive the title deed Scenario: No sufficient funds Given I land on unowned property And my funds are not sufficient Then I am not able to buy the property
https://github.com/xebia/workshop-agile-testing/blob/8705e3f93270662285cd9c8ec8c24e5ac957f3ed/src/test/resources/features/BuyingProperties.feature
Enough details ? too declarative
which one?
what does it mean?
« Pay » is an outcome?
Choose?
@aloyer
![Page 41: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/41.jpg)
Scenario: Buying property Given I land on unowned property And my funds are sufficient When I choose to buy the property Then I pay the printed price And I receive the title deed
@aloyer
![Page 42: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/42.jpg)
Scenario: Buying property Given I land on unowned property And my funds are sufficient When I choose to buy the property Then I pay the printed price And I receive the title deed
@default_propertiesScenario: Buying property Given I land on unowned "west" property And my funds are 2000 When I buy the property And I pay the printed price Then I should receive the "west" title deed And my funds should be decreased to 1800
@aloyer
![Page 43: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/43.jpg)
Scenario: Buying property Given I land on unowned property And my funds are sufficient When I choose to buy the property Then I pay the printed price And I receive the title deed
to pay is an action (when) not an outcome (then) value can be changed
@default_propertiesScenario: Buying property Given I land on unowned "west" property And my funds are 2000 When I buy the property And I pay the printed price Then I should receive the "west" title deed And my funds should be decreased to 1800
can help to project to other case Can it always be applied?
@aloyer
![Page 44: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/44.jpg)
Scenario: Buying property Given I land on unowned property And my funds are sufficient When I choose to buy the property Then I pay the printed price And I receive the title deed
@default_propertiesScenario: Buying property Given I land on unowned "west" property And my funds are 2000 When I buy the property And I pay the printed price Then I should receive the "west" title deed And my funds should be decreased to 1800
@Then("^my funds should be (?:decreased to |increased to )?(\\d+)$") public void my_funds_should_be_(int amount)
@aloyer
![Page 45: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/45.jpg)
Scenario: Buying property Given I land on unowned property And my funds are sufficient When I choose to buy the property Then I pay the printed price And I receive the title deed
@default_propertiesScenario: Default properties - by tag Then the available properties should be at least: | name | price | | east | 150 | | west | 200 | | north | 100 | | south | 40 |
@default_propertiesScenario: Buying property Given I land on unowned "west" property And my funds are 2000 When I buy the property And I pay the printed price Then I should receive the "west" title deed And my funds should be decreased to 1800
@aloyer
![Page 46: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/46.jpg)
Scenario: Default properties - explicit Given the default properties are used Then the available properties should be at least: | name | price | | east | 150 | | west | 200 | | north | 100 | | south | 40 |
Scenario: Buying property Given I land on unowned property And my funds are sufficient When I choose to buy the property Then I pay the printed price And I receive the title deed
@default_propertiesScenario: Default properties - by tag Then the available properties should be at least: | name | price | | east | 150 | | west | 200 | | north | 100 | | south | 40 |
@default_propertiesScenario: Buying property Given I land on unowned "west" property And my funds are 2000 When I buy the property And I pay the printed price Then I should receive the "west" title deed And my funds should be decreased to 1800
@aloyer
![Page 47: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/47.jpg)
Scenario: Buying property Given I land on unowned property And my funds are sufficient When I choose to buy the property Then I pay the printed price And I receive the title deed
@default_properties @default_playerScenario: Buying property Given I land on unowned "west" property that cost 180 When I choose to buy the property And I pay the printed price Then I should receive the "west" title deed And my funds should be decreased by 180
@default_propertiesScenario: Buying property Given I land on unowned "west" property And my funds are 2000 When I buy the property And I pay the printed price Then I should receive the "west" title deed And my funds should be decreased to 1800
@aloyer
![Page 48: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/48.jpg)
Scenario: Create a Stock option
Given the following option: | Property | Value | | delivery | Cash | | bo strike | no | | floor | 0 | | forex constat | - | | forex constat date | 1970-JAN-01 | | forex start date | 1970-JAN-01 | | guaranteed currency | EUR | | guaranteed rate | 0 | | initial spot | 0 | ... | maturity | 2020-FEB-05 | | option quotity | 1 | | strike | 2500 | | underlying id | SOCIETE-GLE_X | | underlying type | Stock |
And the option’s restriking infos is: | Property | Value | | floating rate | no | | fixed rate | no | ... | last update | <now> | | first trading date | <now> | | rate offset | 0.0 |
When I create the option Then the option id should be filled in
Scenario: Create a Fund option
Given the following option: | Property | Value | | delivery | Cash | | bo strike | no | | floor | 0 | | forex constat | - | | forex constat date | 1970-JAN-01 | | forex start date | 1970-JAN-01 | | guaranteed currency | EUR | | guaranteed rate | 0 | | initial spot | 0 | ... | maturity | 2020-FEB-05 | | option quotity | 1 | | strike | 2500 | | underlying id | SOCIETE-GLE_X | | underlying type | Fund |
And the option’s restriking infos is: | Property | Value | | floating rate | no | | fixed rate | no | ... | last update | <now> | | first trading date | <now> | | rate offset | 0.0 |
When I create the option Then the option id should be filled in
~53 properties
~20 properties
@aloyer
Too much details ?
![Page 49: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/49.jpg)
Scenario: Create an external OTC deal
Given the following option: | Property | Value | | delivery | Cash | | bo strike | no | | floor | 0 | | forex constat | - | | forex constat date | 1970-JAN-01 | | forex start date | 1970-JAN-01 | | guaranteed currency | EUR | | guaranteed rate | 0 | | initial spot | 0 | ... | maturity | 2020-FEB-05 | | option quotity | 1 | | strike | 2500 | | underlying id | SOCIETE-GLE_X | | underlying type | Stock |
And the option’s restriking infos is: | Property | Value | | floating rate | no | | fixed rate | no | ... | last update | <now> | | first trading date | <now> | | rate offset | 0.0 |
And an external OTC deal: | Property | Value | | category | OTC | | delivery | - | | initial price | 0 | | internal market | yes | | last update | <now> | ... | quantity | 6000 | | remaining quantity | 6000 |
And the deal’s counter part is: | Property | Value | | confirm mode | ST | | market maker | Nefertiti | ...
And the deal’s sales part is: | Property | Value | | accounting center | - | | derogation | no | ...
And the deal’s collateral is: | Property | Value | | IA | no | | currency | - | ...
When I create the option And I create the deal with the created option Then the deal id should be filled in
~58
~5
~58
~22
@aloyer
Too much details ?
![Page 50: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/50.jpg)
Scenario: Standard option
Given a standard option with no specifics Then the option should have the following properties: | Property | Value | | delivery | Cash | | bo strike | no | | floor | 0 | | forex constat | - | | forex constat date | 1970-JAN-01 | | forex start date | 1970-JAN-01 | | guaranteed currency | EUR | | guaranteed rate | 0 | | initial spot | 0 | ... | maturity | 2020-FEB-05 | | option quotity | 1 | | strike | 2500 | | underlying id | SOCIETE-GLE_X | | underlying type | Stock | | restriking infos | <standard> |
~53 properties
Scenario: Standard option’s restriking infos
Given a standard option’s restriking infos Then the option’s restriking infos should be: | Property | Value | | floating rate | no | | fixed rate | no | ... | last update | <now> | | first trading date | <now> | | rate offset | 0.0 |
~20
@aloyer
Too much details ? use persona
Persona is checked
AND documented
![Page 51: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/51.jpg)
Scenario: Create a Stock option
Given the following option: | Property | Value | | delivery | Cash | | bo strike | no | | floor | 0 | | forex constat | - | | forex constat date | 1970-JAN-01 | | forex start date | 1970-JAN-01 | | guaranteed currency | EUR | | guaranteed rate | 0 | | initial spot | 0 | ... | maturity | 2020-FEB-05 | | option quotity | 1 | | strike | 2500 | | underlying id | SOCIETE-GLE_X | | underlying type | Stock |
And the option’s restriking infos is: | Property | Value | | floating rate | no | | fixed rate | no | ... | last update | <now> | | first trading date | <now> | | rate offset | 0.0 |
When I create the option Then the option id should be filled in
Scenario: Create a Stock Option Given a standard option with the following specifics: | underlying type | underlying id | | Stock | SOCIETE-GLE_X | When I create the option Then the option id should be filled in
@aloyer
Too much details ? use persona
![Page 52: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/52.jpg)
Enough details ?
http://blog.thiga.fr/product-management/bdd-gherkin-pour-ecrire-vos-user-stories/
@aloyer
![Page 53: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/53.jpg)
Enough details ?
http://blog.thiga.fr/product-management/bdd-gherkin-pour-ecrire-vos-user-stories/
@aloyer
Lot of details there
no details!
no way to challenge the result
![Page 54: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/54.jpg)
Enough details ?
http://blog.thiga.fr/product-management/bdd-gherkin-pour-ecrire-vos-user-stories/
@aloyer
Lot of details there, 6 decimals precision!
GPS? GPS? - destination is usually an address!
![Page 55: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/55.jpg)
Enough details ?
http://blog.thiga.fr/product-management/bdd-gherkin-pour-ecrire-vos-user-stories/
@aloyer
why no date there
but it is explicit there
![Page 56: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/56.jpg)
Enough details ?
http://blog.thiga.fr/product-management/bdd-gherkin-pour-ecrire-vos-user-stories/
@aloyer
Why would such result exist?
![Page 57: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/57.jpg)
@aloyer
![Page 58: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/58.jpg)
@aloyer
# language: frFonctionnalité:
@reseau_simplifié Scénario: Obtenir une feuille de l'itinéraire par d'arrivée 2 Place de la Défense: 48.893195, 2.238945 Etant donné que je veux aller de "48.893195, 2.238945" au "25 rue du Louvre, Paris" Et que je veux partir à 9h30 avec les options suivantes: | X | Transport en commun | | X | Le plus rapide | | | Le moins de changement | Alors je devrais obtenir la feuille de route suivante: | Type | Heure | Localisation | Transport | Durée | Distance | | départ | 9h30 | 2 Place de la Défense | Pied | ~5min | 400m | | - | 9h37 | La Défense | RER A vers Vincennes | 10min | - | | - | 9h47 | Châtelet - Les Halles | Pied | ~7min | 550m | | arrivée | 9h54 | 25 rue du Louve | - | - | - |
![Page 59: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/59.jpg)
@aloyer
# language: frFonctionnalité:
Scénario: Rer A dans le réseau de transport simplifié Etant donné le réseau de transport simplifié "Parisien" Alors le Rer A devrait passer toutes les 10mins à "la Défense" à partir de 5h37 Alors les temps de transport cumulés depuis "la Défense" devraient être: | Charles de Gaulle Etoile | 5min | | Auber | 7min | | Chatelet les Halles | 10min | @reseau_simplifié Scénario: Obtenir une feuille de l'itinéraire par d'arrivée 2 Place de la Défense: 48.893195, 2.238945 Etant donné que je veux aller de "48.893195, 2.238945" au "25 rue du Louvre, Paris" Et que je veux partir à 9h30 avec les options suivantes: | X | Transport en commun | | X | Le plus rapide | | | Le moins de changement | Alors je devrais obtenir la feuille de route suivante: | Type | Heure | Localisation | Transport | Durée | Distance | | départ | 9h30 | 2 Place de la Défense | Pied | ~5min | 400m | | - | 9h37 | La Défense | RER A vers Vincennes | 10min | - | | - | 9h47 | Châtelet - Les Halles | Pied | ~7min | 550m | | arrivée | 9h54 | 25 rue du Louve | - | - | - |
![Page 60: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/60.jpg)
To be continued… @aloyer
# language: frFonctionnalité: Scénario: Le métro 1 dans le réseau de transport simplifié Etant donné le réseau de transport simplifié "Parisien" Alors le métro 1 devrait passer dans chaque station toutes les 5mins à partir de 6h00 Scénario: Rer A dans le réseau de transport simplifié Etant donné le réseau de transport simplifié "Parisien" Alors le Rer A devrait passer toutes les 10mins à "la Défense" à partir de 5h37 Alors les temps de transport cumulés depuis "la Défense" devraient être: | Charles de Gaulle Etoile | 5min | | Auber | 7min | | Chatelet les Halles | 10min | @reseau_simplifié Scénario: Obtenir une feuille de l'itinéraire par d'arrivée 2 Place de la Défense: 48.893195, 2.238945 Etant donné que je veux aller de "48.893195, 2.238945" au "25 rue du Louvre, Paris" Et que je veux partir à 9h30 avec les options suivantes: | X | Transport en commun | | X | Le plus rapide | | | Le moins de changement | Alors je devrais obtenir la feuille de route suivante: | Type | Heure | Localisation | Transport | Durée | Distance | | départ | 9h30 | 2 Place de la Défense | Pied | ~5min | 400m | | - | 9h37 | La Défense | RER A vers Vincennes | 10min | - | | - | 9h47 | Châtelet - Les Halles | Pied | ~7min | 550m | | arrivée | 9h54 | 25 rue du Louve | - | - | - |
![Page 61: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/61.jpg)
Adjust the cursor
@aloyer
declarative imperativetoo much detailsnot enough
details
![Page 62: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/62.jpg)
Adjust the cursor
@aloyer
declarative imperativetoo much detailsnot enough
details
Together!
![Page 63: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/63.jpg)
Remove ambiguities but keep scenario short
Am I concrete enough on the expected behavior?
Signal vs noise ratio?What if the scenario has more details?
@aloyer
Rely on Persona/Defaults…Do Scenario Review…
![Page 64: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/64.jpg)
is NOT About is About
BDD
!"
KL a tool for test automation communicationacceptance criteriaL K behavior
![Page 65: BDD - Writing better scenario](https://reader030.vdocument.in/reader030/viewer/2022033107/587db8df1a28abae2f8b7d29/html5/thumbnails/65.jpg)
Questions?
Arnauld LOYER — @aloyer
QTraining Coaching /[TBD]DD/ Testing/Clean Code
Mastering Software Development