Behaviour Driven Development (BDD) and Domain Driven Design (DDD) seen a great growth in adoption in recent years. We are all creating new practices and tools that try and bring these two very important modern methodologies together. What if we have it backwards and they were actually together all along? What if most of the misunderstandings and challenges we face in implementing BDD are spawned from the very simple mistake of us separating something that was created as a whole? In this talk we'll delve into BDD as it was meant to be done from the beginning and look at its very rooted connection with the software design.
3. The User-story
In order to spend more time socialising at the conference
instead of looking at the schedule
As a conference attendee
I want to create my personal schedule beforehand
5. Can you give me an
example of how you
would do it?
6. Scenarios in imperative style
Feature: Attendee selects talks to attend
In order to spend more time socialising at the conference instead of looking at the schedule
As a conference attendee
I want to create my personal schedule beforehand
Scenario: Successfully selecting 1 talk
Given there is a conference "XP Conference"
And there is a "Specification" talk in first time period
When I open the "/conferences/xp" page
And I click "Add to my schedule" inside ".talk:contains('Specification')" block
Then I should see ".talk:contains('Specification')" inside ".personal-‐schedule" block
Scenario: Failing to select 2 talks into the time period
Given there is a conference "XP Conference"
And there is a "Specification" talk in the first time period
And there is a "Modelling" talk in the first time period
When I open the "/conferences/xp" page
And I click "Add to my schedule" inside ".talk:contains('Specification')" block
And I click "Add to my schedule" inside ".talk:contains('Modelling')" block
Then I should see ".talk:contains('Specification')" inside ".personal-‐schedule" block
But I should not see ".talk:contains('Modelling')" inside ".personal-‐schedule" block
7. And what if you are that
rare example of a
stakeholder without A
clear understanding of
TCP/ip & HTML5?
8. Scenarios in declarative style
Feature: Attendee selects talks to attend
In order to spend more time socialising at the conference instead of looking at the schedule
As a conference attendee
I want to create my personal schedule beforehand
Scenario: Successfully selecting 1 talk
Given there is a conference "Agile Conference"
And there is a "Specification" talk in the first time period
When I choose the "Specification" talk
Then the "Specification" talk should be in my personal schedule
Scenario: Failing to select 2 talks into the same time period
Given there is a conference "Agile Conference"
And there is a "Specification" talk in the first time period
And there is a "Modelling" talk in the first time period
When I choose the "Specification" talk
And I choose the "Modelling" talk
Then I should be told that time period is already taken by another talk
10. Feature: Attendee selects talks to attend
In order to spend more time socialising at the conference instead of looking at the schedule
As a conference attendee
I want to create my personal schedule beforehand
Scenario: Successfully selecting 1 talk from the 1 track conference for a single slot
Given a conference named "Agile Conference" with 1 track
And the "Specification" talk is scheduled for "10:30-‐11:30" slot on the conference track 1
When I choose the "Specification" talk for my personal schedule of this conference
Then the chosen talk for "10:30-‐11:30" slot of my schedule should be the "Specification"
Scenario: Being unable to select 2 talks into the same slot
Given a conference named "Agile Conference" with 2 tracks
And the "Specification" talk is scheduled for "09:00-‐09:45" slot on the conference track 1
And the "Modelling" talk is scheduled for "09:00-‐09:45" slot on the conference track 2
When I choose the "Specification" talk for my personal schedule of this conference
And I try to choose the "Modelling" talk for my personal schedule of this conference
Then I should be told that slot is already taken by another talk
Scenarios in ubiquitous language
12. “
– Eric Evans, Domain-Driven Design
A project faces serious problems when its
language is fractured. Domain experts use their
jargon while technical team members have their
own.
28. “
– Eric Evans, Domain-Driven Design
To cross-check all these decisions, we have to
constantly step through scenarios to confirm that
we can solve application problems effectively.
29. “
– Eric Evans, Domain-Driven Design
To cross-check all these decisions, we have to
constantly step through scenarios to confirm that
we can solve application problems effectively.
31. “
– Eric Evans, Domain-Driven Design
A domain model is not a particular diagram; it is
the idea that the diagram is intended to convey.A
diagram can represent and communicate a model,
as can carefully written code, as can an English
sentence.
32. “
– Eric Evans, Domain-Driven Design
A domain model is not a particular diagram; it is
the idea that the diagram is intended to convey.A
diagram can represent and communicate a model,
as can carefully written code, as can an English
sentence.
33. Feature: Attendee selects talks to attend
In order to spend more time socialising at the conference instead of looking at the schedule
As a conference attendee
I want to create my personal schedule beforehand
Scenario: Successfully selecting 1 talk from the 1 track conference for a single slot
Given a conference named "Agile Conference" with 1 track
And the "Specification" talk is scheduled for "10:30-‐11:30" slot on the conference track 1
When I choose the "Specification" talk for my personal schedule of this conference
Then the chosen talk for "10:30-‐11:30" slot of my schedule should be the "Specification"
Scenario: Being unable to select 2 talks into the same slot
Given a conference named "Agile Conference" with 2 tracks
And the "Specification" talk is scheduled for "09:00-‐09:45" slot on the conference track 1
And the "Modelling" talk is scheduled for "09:00-‐09:45" slot on the conference track 2
When I choose the "Specification" talk for my personal schedule of this conference
And I try to choose the "Modelling" talk for my personal schedule of this conference
Then I should be told that slot is already taken by another talk
Scenarios in ubiquitous language
39. “
– Vaughn Vernon, Implementing Domain-Driven Design
The application boundary, or inner hexagon, is
also the use case (or user story) boundary. In
other words, we should create use cases based on
application functional requirements, not on the
number of diverse clients or output mechanisms.
47. Feature: Attendee selects talks to attend
In order to spend more time socialising at the conference instead of looking at the schedule
As a conference attendee
I want to create my personal schedule beforehand
Scenario: Successfully selecting 1 talk from the 1 track conference for a single slot
Given a conference named "Agile Conference" with 1 track
And the "Specification" talk is scheduled for "10:30-‐11:30" slot on the conference track 1
When I choose the "Specification" talk for my personal schedule of this conference
Then the chosen talk for "10:30-‐11:30" slot of my schedule should be the "Specification"
Scenario: Being unable to select 2 talks into the same slot
Given a conference named "Agile Conference" with 2 tracks
And the "Specification" talk is scheduled for "09:00-‐09:45" slot on the conference track 1
And the "Modelling" talk is scheduled for "09:00-‐09:45" slot on the conference track 2
When I choose the "Specification" talk for my personal schedule of this conference
And I try to choose the "Modelling" talk for my personal schedule of this conference
Then I should be told that slot is already taken by another talk
Conference Feature
49. Feature: Attendee selects talks to attend
In order to spend more time socialising at the conference instead of looking at the schedule
As a conference attendee
I want to create my personal schedule beforehand
Scenario: Successfully selecting 1 talk from the 1 track conference for a single slot
Given a conference named "Agile Conference" with 1 track
And the "Specification" talk is scheduled for "10:30-‐11:30" slot on the conference track 1
When I choose the "Specification" talk for my personal schedule of this conference
Then the chosen talk for "10:30-‐11:30" slot of my schedule should be the "Specification"
Scenario: Being unable to select 2 talks into the same slot
Given a conference named "Agile Conference" with 2 tracks
And the "Specification" talk is scheduled for "09:00-‐09:45" slot on the conference track 1
And the "Modelling" talk is scheduled for "09:00-‐09:45" slot on the conference track 2
When I choose the "Specification" talk for my personal schedule of this conference
And I try to choose the "Modelling" talk for my personal schedule of this conference
Then I should be told that slot is already taken by another talk
Domain Layer / Scenario #1
50. Feature: Attendee selects talks to attend
In order to spend more time socialising at the conference instead of looking at the schedule
As a conference attendee
I want to create my personal schedule beforehand
Scenario: Successfully selecting 1 talk from the 1 track conference for a single slot
Given a conference named "Agile Conference" with 1 track
And the "Specification" talk is scheduled for "10:30-‐11:30" slot on the conference track 1
When I choose the "Specification" talk for my personal schedule of this conference
Then the chosen talk for "10:30-‐11:30" slot of my schedule should be the "Specification"
Scenario: Being unable to select 2 talks into the same slot
Given a conference named "Agile Conference" with 2 tracks
And the "Specification" talk is scheduled for "09:00-‐09:45" slot on the conference track 1
And the "Modelling" talk is scheduled for "09:00-‐09:45" slot on the conference track 2
When I choose the "Specification" talk for my personal schedule of this conference
And I try to choose the "Modelling" talk for my personal schedule of this conference
Then I should be told that slot is already taken by another talk
Domain Layer / Scenario #1 / Step #1
51. class AttendeeContext implements Context {
...
/**
* @Given a conference named :name with :count track(s)
*/
public function aConferenceNamedWithTrack($name, $count)
{
throw new PendingException();
}
52. class AttendeeContext implements Context {
...
/**
* @Given a conference named :name with :count track(s)
*/
public function aConferenceNamedWithTrack($name, $count)
{
$aConference =
}
53. class AttendeeContext implements Context {
...
/**
* @Given a conference named :name with :count track(s)
*/
public function aConferenceNamedWithTrack($name, $count)
{
$aConference = Conference::namedWithTracks($name, $count);
}
55. conversation is your lead architect
Given a conference named "BDD eXchange" with 1 track
Given a conference named "BDD eXchange"
And this conference is planned to have 1 track
Conference
+ namedWithTracks()
Conference
+ named()
TrackPlanner
+ planTracks()
+ howManyTracks()
56. Feature: Attendee selects talks to attend
In order to spend more time socialising at the conference instead of looking at the schedule
As a conference attendee
I want to create my personal schedule beforehand
Scenario: Successfully selecting 1 talk from the 1 track conference for a single slot
Given a conference named "Agile Conference" with 1 track
And the "Specification" talk is scheduled for "10:30-‐11:30" slot on the conference track 1
When I choose the "Specification" talk for my personal schedule of this conference
Then the chosen talk for "10:30-‐11:30" slot of my schedule should be the "Specification"
Scenario: Being unable to select 2 talks into the same slot
Given a conference named "Agile Conference" with 2 tracks
And the "Specification" talk is scheduled for "09:00-‐09:45" slot on the conference track 1
And the "Modelling" talk is scheduled for "09:00-‐09:45" slot on the conference track 2
When I choose the "Specification" talk for my personal schedule of this conference
And I try to choose the "Modelling" talk for my personal schedule of this conference
Then I should be told that slot is already taken by another talk
Domain Layer / Scenario #1 / Step #2
57. class AttendeeContext implements Context {
...
/**
* @Given the :talk talk is scheduled for :slot slot on the conference track :track
*/
public function talkIsScheduledForSlotOnTrack($talk, $slot, $track)
{
throw new PendingException();
}
58. class AttendeeContext implements Context {
...
/**
* @Given the :talk talk is scheduled for :slot slot on the conference track :track
*/
public function talkIsScheduledForSlotOnTrack($talk, $slot, $track)
{
$talk = Talk::named($talk);
$slot = Slot::fromString($slot);
$track = Track::numbered($track);
}
59. class AttendeeContext implements Context {
...
/**
* @Given the :talk talk is scheduled for :slot slot on the conference track :track
*/
public function talkIsScheduledForSlotOnTrack($talk, $slot, $track)
{
$talk = Talk::named($talk);
$slot = Slot::fromString($slot);
$track = Track::numbered($track);
$this-‐>conference-‐>scheduleTalk($talk, $slot, $track);
}
62. Feature: Attendee selects talks to attend
In order to spend more time socialising at the conference instead of looking at the schedule
As a conference attendee
I want to create my personal schedule beforehand
Scenario: Successfully selecting 1 talk from the 1 track conference for a single slot
Given a conference named "Agile Conference" with 1 track
And the "Specification" talk is scheduled for "10:30-‐11:30" slot on the conference track 1
When I choose the "Specification" talk for my personal schedule of this conference
Then the chosen talk for "10:30-‐11:30" slot of my schedule should be the "Specification"
Scenario: Being unable to select 2 talks into the same slot
Given a conference named "Agile Conference" with 2 tracks
And the "Specification" talk is scheduled for "09:00-‐09:45" slot on the conference track 1
And the "Modelling" talk is scheduled for "09:00-‐09:45" slot on the conference track 2
When I choose the "Specification" talk for my personal schedule of this conference
And I try to choose the "Modelling" talk for my personal schedule of this conference
Then I should be told that slot is already taken by another talk
Domain Layer / Scenario #1 / Step #3
63. class AttendeeContext implements Context {
...
/**
* @When I choose the :talk talk for my personal schedule of this conference
*/
public function iChooseTheTalkForMyPersonalScheduleOfThisConference(Talk $talk)
{
$talk = Talk::named($talk);
}
64. class AttendeeContext implements Context {
...
/**
* @When I choose the :talk talk for my personal schedule of this conference
*/
public function iChooseTheTalkForMyPersonalScheduleOfThisConference(Talk $talk)
{
$talk = Talk::named($talk);
$mySchedule = PersonalSchedule::ofConference($this-‐>conference);
}
65. class AttendeeContext implements Context {
...
/**
* @When I choose the :talk talk for my personal schedule of this conference
*/
public function iChooseTheTalkForMyPersonalScheduleOfThisConference(Talk $talk)
{
$talk = Talk::named($talk);
$mySchedule = PersonalSchedule::ofConference($this-‐>conference);
$mySchedule-‐>chooseTalk($talk);
}
66. class AttendeeContext implements Context {
...
/**
* @When I choose the :talk talk for my personal schedule of this conference
*/
public function iChooseTheTalkForMyPersonalScheduleOfThisConference(Talk $talk)
{
$talk = Talk::named($talk);
$this-‐>schedule = PersonalSchedule::ofConference($this-‐>conference);
$this-‐>schedule-‐>chooseTalk($talk);
}
68. It's ok to get it wrong
Conversation Understanding
69. Feature: Attendee selects talks to attend
In order to spend more time socialising at the conference instead of looking at the schedule
As a conference attendee
I want to create my personal schedule beforehand
Scenario: Successfully selecting 1 talk from the 1 track conference for a single slot
Given a conference named "Agile Conference" with 1 track
And the "Specification" talk is scheduled for "10:30-‐11:30" slot on the conference track 1
When I choose the "Specification" talk for my personal schedule of this conference
Then the chosen talk for "10:30-‐11:30" slot of my schedule should be the "Specification"
Scenario: Being unable to select 2 talks into the same slot
Given a conference named "Agile Conference" with 2 tracks
And the "Specification" talk is scheduled for "09:00-‐09:45" slot on the conference track 1
And the "Modelling" talk is scheduled for "09:00-‐09:45" slot on the conference track 2
When I choose the "Specification" talk for my personal schedule of this conference
And I try to choose the "Modelling" talk for my personal schedule of this conference
Then I should be told that slot is already taken by another talk
Domain Layer / Scenario #1 / Step #4
70. class AttendeeContext implements Context {
...
/**
* @Then the chosen talk for :slot slot should be the :talk
*/
public function theChosenTalkForSlotShouldBeThe(Slot $slot, Talk $talk)
{
$talk = Talk::named($talk);
$slot = Slot::fromString($slot);
}
71. class AttendeeContext implements Context {
...
/**
* @Then the chosen talk for :slot slot should be the :talk
*/
public function theChosenTalkForSlotShouldBeThe(Slot $slot, Talk $talk)
{
$talk = Talk::named($talk);
$slot = Slot::fromString($slot);
assertTrue($this-‐>schedule-‐>isTalkChosenForSlot($talk, $slot));
}
75. Feature: Attendee selects talks to attend
In order to spend more time socialising at the conference instead of looking at the schedule
As a conference attendee
I want to create my personal schedule beforehand
Scenario: Successfully selecting 1 talk from the 1 track conference for a single slot
Given a conference named "Agile Conference" with 1 track
And the "Specification" talk is scheduled for "10:30-‐11:30" slot on the conference track 1
When I choose the "Specification" talk for my personal schedule of this conference
Then the chosen talk for "10:30-‐11:30" slot of my schedule should be the "Specification"
Scenario: Being unable to select 2 talks into the same slot
Given a conference named "Agile Conference" with 2 tracks
And the "Specification" talk is scheduled for "09:00-‐09:45" slot on the conference track 1
And the "Modelling" talk is scheduled for "09:00-‐09:45" slot on the conference track 2
When I choose the "Specification" talk for my personal schedule of this conference
And I try to choose the "Modelling" talk for my personal schedule of this conference
Then I should be told that slot is already taken by another talk
Domain Layer / Scenario #1
76. Feature: Attendee selects talks to attend
In order to spend more time socialising at the conference instead of looking at the schedule
As a conference attendee
I want to create my personal schedule beforehand
Scenario: Successfully selecting 1 talk from the 1 track conference for a single slot
Given a conference named "Agile Conference" with 1 track
And the "Specification" talk is scheduled for "10:30-‐11:30" slot on the conference track 1
When I choose the "Specification" talk for my personal schedule of this conference
Then the chosen talk for "10:30-‐11:30" slot of my schedule should be the "Specification"
Scenario: Being unable to select 2 talks into the same slot
Given a conference named "Agile Conference" with 2 tracks
And the "Specification" talk is scheduled for "09:00-‐09:45" slot on the conference track 1
And the "Modelling" talk is scheduled for "09:00-‐09:45" slot on the conference track 2
When I choose the "Specification" talk for my personal schedule of this conference
And I try to choose the "Modelling" talk for my personal schedule of this conference
Then I should be told that slot is already taken by another talk
Domain Layer / Scenario #2
78. Feature: Attendee selects talks to attend
In order to spend more time socialising at the conference instead of looking at the schedule
As a conference attendee
I want to create my personal schedule beforehand
Scenario: Successfully selecting 1 talk from the 1 track conference for a single slot
Given a conference named "Agile Conference" with 1 track
And the "Specification" talk is scheduled for "10:30-‐11:30" slot on the conference track 1
When I choose the "Specification" talk for my personal schedule of this conference
Then the chosen talk for "10:30-‐11:30" slot of my schedule should be the "Specification"
Scenario: Being unable to select 2 talks into the same slot
Given a conference named "Agile Conference" with 2 tracks
And the "Specification" talk is scheduled for "09:00-‐09:45" slot on the conference track 1
And the "Modelling" talk is scheduled for "09:00-‐09:45" slot on the conference track 2
When I choose the "Specification" talk for my personal schedule of this conference
And I try to choose the "Modelling" talk for my personal schedule of this conference
Then I should be told that slot is already taken by another talk
Domain Layer / Scenario #2
79. Feature: Attendee selects talks to attend
In order to spend more time socialising at the conference instead of looking at the schedule
As a conference attendee
I want to create my personal schedule beforehand
Scenario: Successfully selecting 1 talk from the 1 track conference for a single slot
Given a conference named "Agile Conference" with 1 track
And the "Specification" talk is scheduled for "10:30-‐11:30" slot on the conference track 1
When I choose the "Specification" talk for my personal schedule of this conference
Then the chosen talk for "10:30-‐11:30" slot of my schedule should be the "Specification"
Scenario: Being unable to select 2 talks into the same slot
Given a conference named "Agile Conference" with 2 tracks
And the "Specification" talk is scheduled for "09:00-‐09:45" slot on the conference track 1
And the "Modelling" talk is scheduled for "09:00-‐09:45" slot on the conference track 2
When I choose the "Specification" talk for my personal schedule of this conference
And I try to choose the "Modelling" talk for my personal schedule of this conference
Then I should be told that slot is already taken by another talk
Domain Layer / both scenarios
83. Feature: Attendee selects talks to attend
In order to spend more time socialising at the conference instead of looking at the schedule
As a conference attendee
I want to create my personal schedule beforehand
Scenario: Successfully selecting 1 talk from the 1 track conference for a single slot
Given a conference named "Agile Conference" with 1 track
And the "Specification" talk is scheduled for "10:30-‐11:30" slot on the conference track 1
When I choose the "Specification" talk for my personal schedule of this conference
Then the chosen talk for "10:30-‐11:30" slot of my schedule should be the "Specification"
Scenario: Being unable to select 2 talks into the same slot
Given a conference named "Agile Conference" with 2 tracks
And the "Specification" talk is scheduled for "09:00-‐09:45" slot on the conference track 1
And the "Modelling" talk is scheduled for "09:00-‐09:45" slot on the conference track 2
When I choose the "Specification" talk for my personal schedule of this conference
And I try to choose the "Modelling" talk for my personal schedule of this conference
Then I should be told that slot is already taken by another talk
Conference Feature
89. Feature: Attendee selects talks to attend
In order to spend more time socialising at the conference instead of looking at the schedule
As a conference attendee
I want to create my personal schedule beforehand
Scenario: Successfully selecting 1 talk from the 1 track conference for a single slot
Given a conference named "Agile Conference" with 1 track
And the "Specification" talk is scheduled for "10:30-‐11:30" slot on the conference track 1
When I choose the "Specification" talk for my personal schedule of this conference
Then the chosen talk for "10:30-‐11:30" slot of my schedule should be the "Specification"
Scenario: Being unable to select 2 talks into the same slot
Given a conference named "Agile Conference" with 2 tracks
And the "Specification" talk is scheduled for "09:00-‐09:45" slot on the conference track 1
And the "Modelling" talk is scheduled for "09:00-‐09:45" slot on the conference track 2
When I choose the "Specification" talk for my personal schedule of this conference
And I try to choose the "Modelling" talk for my personal schedule of this conference
Then I should be told that slot is already taken by another talk
Conference Feature
90. Feature: Attendee selects talks to attend
In order to spend more time socialising at the conference instead of looking at the schedule
As a conference attendee
I want to create my personal schedule beforehand
Scenario: Successfully selecting 1 talk from the 1 track conference for a single slot
Given a conference named "Agile Conference" with 1 track
And the "Specification" talk is scheduled for "10:30-‐11:30" slot on the conference track 1
When I choose the "Specification" talk for my personal schedule of this conference
Then the chosen talk for "10:30-‐11:30" slot of my schedule should be the "Specification"
Scenario: Being unable to select 2 talks into the same slot
Given a conference named "Agile Conference" with 2 tracks
And the "Specification" talk is scheduled for "09:00-‐09:45" slot on the conference track 1
And the "Modelling" talk is scheduled for "09:00-‐09:45" slot on the conference track 2
When I choose the "Specification" talk for my personal schedule of this conference
And I try to choose the "Modelling" talk for my personal schedule of this conference
Then I should be told that slot is already taken by another talk
Conference Feature critical paths
@critical
91. Feature: Attendee selects talks to attend
In order to spend more time socialising at the conference instead of looking at the schedule
As a conference attendee
I want to create my personal schedule beforehand
Scenario: Successfully selecting 1 talk from the 1 track conference for a single slot
Given a conference named "Agile Conference" with 1 track
And the "Specification" talk is scheduled for "10:30-‐11:30" slot on the conference track 1
When I choose the "Specification" talk for my personal schedule of this conference
Then the chosen talk for "10:30-‐11:30" slot of my schedule should be the "Specification"
Scenario: Being unable to select 2 talks into the same slot
Given a conference named "Agile Conference" with 2 tracks
And the "Specification" talk is scheduled for "09:00-‐09:45" slot on the conference track 1
And the "Modelling" talk is scheduled for "09:00-‐09:45" slot on the conference track 2
When I choose the "Specification" talk for my personal schedule of this conference
And I try to choose the "Modelling" talk for my personal schedule of this conference
Then I should be told that slot is already taken by another talk
UI Layer / Scenario #1
@critical
92. Feature: Attendee selects talks to attend
In order to spend more time socialising at the conference instead of looking at the schedule
As a conference attendee
I want to create my personal schedule beforehand
Scenario: Successfully selecting 1 talk from the 1 track conference for a single slot
Given a conference named "Agile Conference" with 1 track
And the "Specification" talk is scheduled for "10:30-‐11:30" slot on the conference track 1
When I choose the "Specification" talk for my personal schedule of this conference
Then the chosen talk for "10:30-‐11:30" slot of my schedule should be the "Specification"
Scenario: Being unable to select 2 talks into the same slot
Given a conference named "Agile Conference" with 2 tracks
And the "Specification" talk is scheduled for "09:00-‐09:45" slot on the conference track 1
And the "Modelling" talk is scheduled for "09:00-‐09:45" slot on the conference track 2
When I choose the "Specification" talk for my personal schedule of this conference
And I try to choose the "Modelling" talk for my personal schedule of this conference
Then I should be told that slot is already taken by another talk
UI Layer / Scenario #1 / Step #1
@critical
93. class WebAttendeeContext extends WebBasedContext {
...
/**
* @Given a conference named :name with :count track(s)
*/
public function aConferenceNamedWithTrack($name, $count)
{
$this-‐>conference = Conference::namedWithTracks($name, $count);
}
94. Feature: Attendee selects talks to attend
In order to spend more time socialising at the conference instead of looking at the schedule
As a conference attendee
I want to create my personal schedule beforehand
Scenario: Successfully selecting 1 talk from the 1 track conference for a single slot
Given a conference named "Agile Conference" with 1 track
And the "Specification" talk is scheduled for "10:30-‐11:30" slot on the conference track 1
When I choose the "Specification" talk for my personal schedule of this conference
Then the chosen talk for "10:30-‐11:30" slot of my schedule should be the "Specification"
Scenario: Being unable to select 2 talks into the same slot
Given a conference named "Agile Conference" with 2 tracks
And the "Specification" talk is scheduled for "09:00-‐09:45" slot on the conference track 1
And the "Modelling" talk is scheduled for "09:00-‐09:45" slot on the conference track 2
When I choose the "Specification" talk for my personal schedule of this conference
And I try to choose the "Modelling" talk for my personal schedule of this conference
Then I should be told that slot is already taken by another talk
UI Layer / Scenario #1 / Step #2
@critical
95. class WebAttendeeContext extends WebBasedContext {
...
/**
* @Given the :talk talk is scheduled for :slot slot on the conference track :track
*/
public function talkIsScheduledForSlotOnTrack($talk, $slot, $track)
{
$talk = Talk::named($talk);
$slot = Slot::fromString($slot);
$track = Track::numbered($track);
$this-‐>conference-‐>scheduleTalk($talk, $slot, $track);
}
96. Feature: Attendee selects talks to attend
In order to spend more time socialising at the conference instead of looking at the schedule
As a conference attendee
I want to create my personal schedule beforehand
Scenario: Successfully selecting 1 talk from the 1 track conference for a single slot
Given a conference named "Agile Conference" with 1 track
And the "Specification" talk is scheduled for "10:30-‐11:30" slot on the conference track 1
When I choose the "Specification" talk for my personal schedule of this conference
Then the chosen talk for "10:30-‐11:30" slot of my schedule should be the "Specification"
Scenario: Being unable to select 2 talks into the same slot
Given a conference named "Agile Conference" with 2 tracks
And the "Specification" talk is scheduled for "09:00-‐09:45" slot on the conference track 1
And the "Modelling" talk is scheduled for "09:00-‐09:45" slot on the conference track 2
When I choose the "Specification" talk for my personal schedule of this conference
And I try to choose the "Modelling" talk for my personal schedule of this conference
Then I should be told that slot is already taken by another talk
UI Layer / Scenario #1 / Step #3
@critical
97. class WebAttendeeContext extends WebBasedContext {
...
/**
* @When I choose the :name talk for my personal schedule of this conference
*/
public function iChooseTheTalkForMyPersonalScheduleOfThisConference($name)
{
throw new PendingException();
}
98. class WebAttendeeContext extends WebBasedContext {
...
/**
* @When I choose the :name talk for my personal schedule of this conference
*/
public function iChooseTheTalkForMyPersonalScheduleOfThisConference($name)
{
$this-‐>visit('/conferences/' . urlencode($this-‐>conference-‐>getName()));
}
99. class WebAttendeeContext extends WebBasedContext {
...
/**
* @When I choose the :name talk for my personal schedule of this conference
*/
public function iChooseTheTalkForMyPersonalScheduleOfThisConference($name)
{
$this-‐>visit('/conferences/' . urlencode($this-‐>conference-‐>getName()));
$talkElement = $this-‐>find('css', ".talk:contains('$name')");
}
100. class WebAttendeeContext extends WebBasedContext {
...
/**
* @When I choose the :name talk for my personal schedule of this conference
*/
public function iChooseTheTalkForMyPersonalScheduleOfThisConference($name)
{
$this-‐>visit('/conferences/' . urlencode($this-‐>conference-‐>getName()));
$talkElement = $this-‐>find('css', ".talk:contains('$name')");
$talkElement-‐>clickLink('Add to my schedule');
}
101. class WebAttendeeContext extends WebBasedContext {
...
/**
* @When I choose the :name talk for my personal schedule of this conference
*/
public function iChooseTheTalkForMyPersonalScheduleOfThisConference($name)
{
$this-‐>visit('/conferences/' . urlencode($this-‐>conference-‐>getName()));
$talkElement = $this-‐>find('css', ".talk:contains('$name')");
$talkElement-‐>clickLink('Add to my schedule');
}
...
/**
* @Given a conference named :name with :count track(s)
*/
public function aConferenceNamedWithTrack($name, $count)
{
$this-‐>conference = Conference::namedWithTracks($name, $count);
// persist somehow?
}
102. class WebAttendeeContext extends WebBasedContext {
...
/**
* @When I choose the :name talk for my personal schedule of this conference
*/
public function iChooseTheTalkForMyPersonalScheduleOfThisConference($name)
{
$this-‐>visit('/conferences/' . urlencode($this-‐>conference-‐>getName()));
$talkElement = $this-‐>find('css', ".talk:contains('$name')");
$talkElement-‐>clickLink('Add to my schedule');
}
...
/**
* @Given a conference named :name with :count track(s)
*/
public function aConferenceNamedWithTrack($name, $count)
{
$this-‐>conference = Conference::namedWithTracks($name, $count);
$this-‐>conferenceRepository-‐>saveConference($this-‐>conference);
}
103. class WebAttendeeContext extends WebBasedContext {
...
/**
* @When I choose the :name talk for my personal schedule of this conference
*/
public function iChooseTheTalkForMyPersonalScheduleOfThisConference($name)
{
$this-‐>visit('/conferences/' . urlencode($this-‐>conference-‐>getName()));
$talkElement = $this-‐>find('css', ".talk:contains('$name')");
$talkElement-‐>clickLink('Add to my schedule');
}
...
/**
* @Given a conference named :name with :count track(s)
*/
public function aConferenceNamedWithTrack($name, $count)
{
$this-‐>conference = Conference::namedWithTracks($name, $count);
}
104. class WebAttendeeContext extends WebBasedContext {
...
/**
* @When I choose the :name talk for my personal schedule of this conference
*/
public function iChooseTheTalkForMyPersonalScheduleOfThisConference($name)
{
$this-‐>visit('/conferences/' . urlencode($this-‐>conference-‐>getName()));
$talkElement = $this-‐>find('css', ".talk:contains('$name')");
$talkElement-‐>clickLink('Add to my schedule');
}
...
/**
* @Given a conference named :name with :count track(s) was planned
*/
public function aConferenceNamedWithTrack($name, $count)
{
$this-‐>conference = Conference::namedWithTracks($name, $count);
}
105. class WebAttendeeContext extends WebBasedContext {
...
/**
* @When I choose the :name talk for my personal schedule of this conference
*/
public function iChooseTheTalkForMyPersonalScheduleOfThisConference($name)
{
$this-‐>visit('/conferences/' . urlencode($this-‐>conference-‐>getName()));
$talkElement = $this-‐>find('css', ".talk:contains('$name')");
$talkElement-‐>clickLink('Add to my schedule');
}
...
/**
* @Given a conference named :name with :count track(s) was planned
*/
public function aConferenceNamedWithTrack($name, $count)
{
$this-‐>conference = Conference::namedWithTracks($name, $count);
$this-‐>conferencePlanner-‐>planConference($this-‐>conference);
}
107. Feature: Attendee selects talks to attend
In order to spend more time socialising at the conference instead of looking at the schedule
As a conference attendee
I want to create my personal schedule beforehand
Scenario: Successfully selecting 1 talk from the 1 track conference for a single slot
Given a conference named "Agile Conference" with 1 track
And the "Specification" talk is scheduled for "10:30-‐11:30" slot on the conference track 1
When I choose the "Specification" talk for my personal schedule of this conference
Then the chosen talk for "10:30-‐11:30" slot of my schedule should be the "Specification"
Scenario: Being unable to select 2 talks into the same slot
Given a conference named "Agile Conference" with 2 tracks
And the "Specification" talk is scheduled for "09:00-‐09:45" slot on the conference track 1
And the "Modelling" talk is scheduled for "09:00-‐09:45" slot on the conference track 2
When I choose the "Specification" talk for my personal schedule of this conference
And I try to choose the "Modelling" talk for my personal schedule of this conference
Then I should be told that slot is already taken by another talk
UI Layer / Scenario #1 / Step #4
@critical
108. class WebAttendeeContext extends WebBasedContext {
...
/**
* @Then the chosen talk for :time slot should be the :name
*/
public function theChosenTalkForSlotShouldBeThe($name, $time)
{
throw new PendingException();
}
109. class WebAttendeeContext extends WebBasedContext {
...
/**
* @Then the chosen talk for :time slot should be the :name
*/
public function theChosenTalkForSlotShouldBeThe($name, $time)
{
$this-‐>assertElementText('css', ".my-‐schedule .talk:contains('$time')", $name);
}
110. Feature: Attendee selects talks to attend
In order to spend more time socialising at the conference instead of looking at the schedule
As a conference attendee
I want to create my personal schedule beforehand
Scenario: Successfully selecting 1 talk from the 1 track conference for a single slot
Given a conference named "Agile Conference" with 1 track
And the "Specification" talk is scheduled for "10:30-‐11:30" slot on the conference track 1
When I choose the "Specification" talk for my personal schedule of this conference
Then the chosen talk for "10:30-‐11:30" slot of my schedule should be the "Specification"
Scenario: Being unable to select 2 talks into the same slot
Given a conference named "Agile Conference" with 2 tracks
And the "Specification" talk is scheduled for "09:00-‐09:45" slot on the conference track 1
And the "Modelling" talk is scheduled for "09:00-‐09:45" slot on the conference track 2
When I choose the "Specification" talk for my personal schedule of this conference
And I try to choose the "Modelling" talk for my personal schedule of this conference
Then I should be told that slot is already taken by another talk
UI Layer / Scenario #1
@critical
112. Feature: Attendee selects talks to attend
In order to spend more time socialising at the conference instead of looking at the schedule
As a conference attendee
I want to create my personal schedule beforehand
Scenario: Successfully selecting 1 talk from the 1 track conference for a single slot
Given a conference named "Agile Conference" with 1 track
And the "Specification" talk is scheduled for "10:30-‐11:30" slot on the conference track 1
When I choose the "Specification" talk for my personal schedule of this conference
Then the chosen talk for "10:30-‐11:30" slot of my schedule should be the "Specification"
Scenario: Being unable to select 2 talks into the same slot
Given a conference named "Agile Conference" with 2 tracks
And the "Specification" talk is scheduled for "09:00-‐09:45" slot on the conference track 1
And the "Modelling" talk is scheduled for "09:00-‐09:45" slot on the conference track 2
When I choose the "Specification" talk for my personal schedule of this conference
And I try to choose the "Modelling" talk for my personal schedule of this conference
Then I should be told that slot is already taken by another talk
Both Layers / both scenarios
@critical
113. "Hey, it does work" Testing pyramid
Acceptance
tests
Unit Tests
UI TESTS 1 scenario
2 scenarios
7 unit-test cases
114. “
– David West, Object Thinking
Model the problem domain and
the solution will take care of itself.
115. “Focus on discussing business problems and
the architecture will emerge naturally.