Hi, again I have
learned a new thing in BDD using SpecFlow i.e. Scope Binding. Let’s take a
look at how to do this with a very generic example. I’m going to be write
tests for creating user and course, Create User and Create Course. In both
cases, I’m supposed to click on the link at the top of the page, although
they’re different links that are the requirements are set in freeze, and will
not re-write them as we can assume to understand the context based on the
feature.
So, let’s write the
add each feature and scenario. We’re going to need two feature
files. One for checking the ‘Create New User’ link, and one for the ‘Create
New Course’ link.
Feature: US58858 - User Creation
In order to Creation of User
As a WS Admin
I want to create user
Scenario: Create the new User using create user link
Given I am on the User Creation Page
When I clicked the link at top of the page
Then I should see the "Create New User" popup
When I create the user with user details
| Field | Value |
| txtLoginName | Teacher |
| txtPassword | pwd |
| txtFirstName | FN |
| txtLastName | LN |
| txtEmail | Email |
Then It should display successful message "New user created successfully."
And I clicked on the Logout link to get logged out from the application
-------------------------------------------------
Feature: US58857 - Course Creation
In order to Creation of Course
As a WS Admin
I want to create course(s) as a Empty Course, Container Course, Master Library
and Master Course
Scenario Outline: Create the new Course using create course link
Given I am on the Course Creation page
When I clicked the link at top of the page
Then I should see the "Create New Course" popup
When I creted the course as name with prefix
Then It should display successful message "New course created successfully."
Then I should see the created course
Examples:
| coursename |
| BDDEC |
| BDDML |
| BDDCC |
| BDDMC |
And I clicked on the Logout link to get logged out from the application
Now, we’re going to
add some context to each of these. I’m going to add the @user tag to the
scenarios in the US58858 - User Creation
feature, while adding the @course tag to the scenarios in the US58857 - Course Creation feature.
@user
Scenario: Create the new User using create user link
Given I am on the User Creation Page
When I clicked the link at top of the
page
Then I should see the "Create New User" popup
When I create the user with user details
| Field | Value |
| txtLoginName | Teacher |
| txtPassword | pwd |
| txtFirstName | FN |
| txtLastName | LN |
| txtEmail | Email |
Then It should display successful message "New user created successfully."
And I clicked on the Logout link to get logged out from the application
--------------------------------------------------------------
@course
Scenario Outline: Create the new Course using create course link
Given I am on the Course Creation page
When I clicked the link at top of the page
Then I should see the "Create New Course" popup
When I creted the course as name with prefix
Then It should display successful message "New course created successfully."
Then I should see the created course
Examples:
| coursename |
| BDDEC |
| BDDML |
| BDDCC |
| BDDMC |
And I clicked on the Logout link to get logged out from the application
Now, let’s write the code for this the way that we normally would. We can see that
we have a builderror however. This is because we have two of the exact same When’s.
We need to find a way to separate these. We could, and should rewrite this,
but as I said earlier, we were told that the way that they were written has to
stay exactly as it was. Instead, let’s use the Scope tags to add some context.
The way that has worked best for me, is to start separating some of the code into folders,
to keep everything organized. We’re going to do this for the Create user and Create Course.
Next, we’re going to add a stepdefinition file to each of those folders to help keep our
code a little more organized.
Now that we have this setup, let’s write our When methods in their respective step
definition files. As a note, you can put any step definitions you want into any class
so long as you add the [Binding] tagto the class. Unless you have a need to duplicate code,
I recommend only putting the steps that contain scope into these new classes,
or at least, that’s what’s worked well for me so far.
namespace Pegasus_SpecFlow
{
[Binding]
public class CreateUserStepDefinitions : Helper
{
[When(@"I click the link at the top of the page")]
public void WhenIClickTheLinkAtTheTopOfThePage()
{
Click(user);
}
}
}
namespace Pegasus_SpecFlow
{
[Binding]
public class CreateCourseStepDefinitions : Helper
{
[When(@"I click the link at the top of the page")]
public void WhenIClickTheLinkAtTheTopOfThePage()
{
Click(course);
}
}
}
Now, we want to add our scope. We can do this at the class level, or the step level.
Normally, I would do this at the step level, but, as I was writing this,
I learned that you can do this at the class level.
Scoped Binding at the class level
namespace Pegasus_SpecFlow
{
[Binding]
[Scope(Feature="US58858 - User Creation")]
public class CreateUserStepDefinitions : Helper
{
[When(@"I click the link at the top of the page")]
public void WhenIClickTheLinkAtTheTopOfThePage()
{
Click(user);
}
}
}
OR
Scoped Binding at the method, or step level
namespace Pegasus_SpecFlow
{
[Binding]
public class CreateUserStepDefinitions : Helper
{
[When(@"I click the link at the top of the page"),
Scope(Tag="user")]
public void WhenIClickTheLinkAtTheTopOfThePage()
{
Click(user);
}
}
}
I’m pretty certain that our tests should run. After a little bit of debugging,
I make sure that my webdriver code works. Then, find a way to make your test fail
to ensure that it’s working correctly and you should be good to go.