Question

I've read Specification by Example and several BDD articles, which all say to avoid details like specific form fields in the feature description and scenarios. But if the specification of which form fields we need and what validations are appropriate is not in the examples, where is it?

I am considering putting all the form fields in the scenarios, along with having a scenario for each validation. It seems like a lot of overhead; is there a better way?

EDIT: For example, take the following.

Feature: Add new product

In order to sell a new product on our website
As an internal user
I want to add the product to our catalog

Scenario: Successful addition

Given I am logged in
When I try to add a new product
And I provide "Widget" as the name
And I provide 1 lb. as the weight
And I provide 1 inch as the height
And I provide 2 inches as the width
And I provide 3 inches as the length
Then I see the new product that was added

Scenario: Duplicate name

Given I am logged in
And an existing product named "Dupe"
When I try to add a new product
And I provide "Dupe" as the name
Then I see a duplicate name error

Scenario: Invalid Weight

Given I am logged in
When I try to add a new product
And I provide -1 as the weight
Then I see an invalid weight error

Scenario: Invalid Height

Given I am logged in
When I try to add a new product
And I provide -1 as the height
Then I see an invalid height error

Scenario: Invalid Width

Given I am logged in
When I try to add a new product
And I provide -1 as the width
Then I see an invalid width error

Scenario: Invalid Length

Given I am logged in
When I try to add a new product
And I provide -1 as the length
Then I see an invalid length error
Was it helpful?

Solution

The key is to remove all things from the scenarios that are unrelated the specific test. They are just noise that distract from the point. The details should be in the step definitions.

For example, let's take this one:

Scenario: Successful addition

Given I am logged in
When I try to add a new product
And I provide "Widget" as the name
And I provide 1 lb. as the weight
And I provide 1 inch as the height
And I provide 2 inches as the width
And I provide 3 inches as the length
Then I see the new product that was added

There is a lot of repetition here, and it is not at all "conversational" in style--you wouldn't explain how it works using language like this. The specific dimensions are being given but for no reason--you will have other tests that check size boundaries. The size isn't being tested here. You could easily change this to:

Given I am logged in
When I try to add a new product named "Widget"
And specify the weight and dimensions
Then I see the new product that was added

This is closer to how you'd describe the test to others, and hides the details in the step definitions.

OTHER TIPS

I think they are saying to put the form fields in the step definition. For instance, instead of

When I put my "Dave" in the username field 
And I put "ou812" in the password field
And I click the Login Button
Then I should see "Dave" in the username field

you should put

When I log into the site with user "Dave" and password "ou812"
Then I should be logged in as "Dave"

with the "^I log into the site..." step handling the details of filling the fields and clicking buttons. The benefit being that logging in is the desired behavior, while the fields and buttons are the method.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top