One of my pets hates is seeing test suites which perform really badly because of the overuse of the Scenario Outline construct.
Seriously, you need to think about why you are using them? Do you really need to run this entire scenario including the Background Steps (if you have them) all over again?
Here’s an example of where it is not required and how to change it:
Feature: Personal Details
Scenario Outline: Verify that a user is prevented from entering an invalid phone number
Given I am logged in
When I goto my personal details
And I enter an invalid <telephone_number>
Then I see an <error_message>
Examples:
|telephone_number| error_message|
|abd|Please enter only numbers|
|12|Please enter a valid telephone number|
|44++ 22|Please enter a valid telephone number|
——————————
Now why would you want to re-login every time here? Why would you not do this:
Feature: Personal Detail
Scenario: Verify a user is prevented from entering an invalid phone number.
Given I am logged in
When I goto my personal details
Then on entering an invalid telephone number I see an error message :
|telephone_number| error_message|
|abd|Please enter only numbers|
|12|Please enter a valid telephone number|
|44++ 22|Please enter a valid telephone number|
——————————
I mean ok, I accept that two actions are included within one step i.e. edit the telephone number and verify the error message, but we have multiple actions in one step all the time …for example, ‘Given I am logged in’ often covers a whole host of actions e.g. visit the home page; click on login; visit the login page; enter your login details; submit your login details; verify that you’re logged in, so it’s fine – honestly it is!!
I can understand why people are reluctant to this, it down to semantics and the constraints people feel when using Gherkin, it’s those WHEN and THEN keywords, because naturally you’d want to say: “When I enter an invalid telephone number then I see an error message” and people are shit scared of that “then” right there in the middle and become convinced that there is no other way to write this test than as a Scenario Outline.
Just making this simple change to this test will make it run 3 times faster – remember, you’re not testing login here, you are testing that the correct error message is displayed – therefore that is the only bit you need to re-run!!
So, when do you use a Scenario Outline?
So, when do you use Scenario Outline? Well, I believe it should only be used when you actually need to rerun the whole scenario. So, for example, let’s say that you want to check that a users details have persisted after logout, then you do actually need to re-run everything, so you do need to use a Scenario Outline.
Scenario Outline: User details have persisted after logout
Given I have logged in
And I have set my personal details <name>, <telephone_number>, <date_of_birth>
And then logged out
When I log back in
Then my personal details are still set to <name>, <telephone_number>, <date_of_birth>
Examples:
|name|telephone_number|date_of_birth|
|John|0772219999|18/01/1990|
|Jo|077221991|19/02/1991|
——————————