Automation Testing Using Cucumber Tool and Selenium – Selenium Tutorial #30

In last Selenium tutorial we introduced you to Selenium Grid which is a distributed test execution environment to speed up the execution of a test pass.

Now at the end of this comprehensive Selenium training series we are learning advanced Selenium testing and related concepts.

In this and the next tutorial we will be introducing you to the Cucumber – a Behavior Driven Development (BDD) framework which is used with Selenium for performing acceptance testing.

Cucumber Introduction:

Cucumber is a tool based on Behavior Driven Development (BDD) framework which is used to write acceptance tests for web application. It allows automation of functional validation in easily readable and understandable format (like plain English) to Business Analysts, Developers, Testers, etc.

Cucumber feature files can serve as a good document for all. There are many other tools like JBehave which also support BDD framework. Initially Cucumber was implemented in Ruby and then extended to Java framework. Both the tools support native JUnit.

Behavior Driven Development is extension of Test Driven Development and it is used to test the system rather than testing the particular piece of code. We will discuss more about the BDD and style of writing BDD tests.

Cucumber can be used along with Selenium, Watir, and Capybara etc. Cucumber supports many other languages like Perl, PHP, Python, .Net etc. In this tutorial we will concentrate on Cucumber with Java as a language.

Cucumber Basics:

In order to understand cucumber we need to know all the features of cucumber and its usage.

#1) Feature Files:

Feature files are essential part of cucumber which is used to write test automation steps or acceptance tests. This can be used as live document. The steps are the application specification. All the feature files ends with .feature extension.

Sample feature file:

Feature: Login Functionality Feature

In order to ensure Login Functionality works,
I want to run the cucumber test to verify it is working

Scenario: Login Functionality

Given user navigates to SOFTWARETETINGHELP.COM
When user logs in using Username as “USER” and Password “PASSWORD”
Then login should be successful

Scenario: Login Functionality

Given user navigates to SOFTWARETETINGHELP.COM
When user logs in using Username as “USER1” and Password “PASSWORD1”
Then error message should be thrown

#2) Feature:

This gives information about the high level business functionality (Refer to previous example) and the purpose of Application under test. Everybody should be able to understand the intent of feature file by reading the first Feature step. This part is basically kept brief.

#3) Scenario:

Basically a scenario represents a particular functionality which is under test. By seeing the scenario user should be able to understand the intent behind the scenario and what the test is all about. Each scenario should follow given, when and then format. This language is called as “gherkin”.

  1. Given: As mentioned above, given specifies the pre-conditions. It is basically a known state.
  2. When: This is used when some action is to be performed. As in above example we have seen when the user tries to log in using username and password, it becomes an action.
  3. Then: The expected outcome or result should be placed here. For Instance: verify the login is successful, successful page navigation.
  4. Background: Whenever any step is required to perform in each scenario then those steps needs to be placed in Background. For Instance: If user needs to clear database before each scenario then those steps can be put in background.
  5. And: And is used to combine two or more same type of action.

Example:

Feature: Login Functionality Feature

Scenario: Login Functionality
Given user navigates to SOFTWARETETINGHELP.COM
When user logs in using Username as “USER”
And password as “password”
Then login should be successful
And Home page should be displayed

Example of Background:

Background:

Given user logged in as databases administrator
And all the junk values are cleared

#4) Scenario Outline:

Scenario outlines are used when same test has to be performed with different data set. Let’s take the same example. We have to test login functionality with multiple different set of username and password.

Feature: Login Functionality Feature

In order to ensure Login Functionality works,
I want to run the cucumber test to verify it is working

Scenario Outline: Login Functionality

Given user navigates to SOFTWARETESTINGHELP.COM
When user logs in using Username as <username> and Password <password>
Then login should be successful

Examples:
|username         |password          |
|Tom                     |password1        |
|Harry                   |password2        |
|Jerry                    |password3        |

Note:

  1. As shown in above example column names are passed as parameter to When statement.
  2. In place of Scenario, you have to use Scenario Outline.
  3. Examples are used to pass different arguments in tabular format. Vertical pipes are used to separate two different columns. Example can contain many different columns.

#5) Tags:

Cucumber by default runs all scenarios in all the feature files. In real time projects there could be hundreds of feature file which are not required to run at all times.

For instance: Feature files related to smoke test need not run all the time. So if you mention a tag as smokeTest in each feature file which is related to smoke test and run cucumber test with @SmokeTest tag . Cucumber will run only those feature files specific to given tags. Please follow the below example. You can specify multiple tags in one feature file.

Example of use of single tags:

@SmokeTest

------------

Feature: Login Functionality Feature

In order to ensure Login Functionality works,
I want to run the cucumber test to verify it is working

Scenario Outline: Login Functionality

Given user navigates to SOFTWARETESTINGHELP.COM
When user logs in using Username as <username> and Password <password>
Then login should be successful

Examples:
|username         |password          |
|Tom     |password1        |
|Harry   |password2        |
|Jerry    |password3        |

Example of use of multiple tags:

As shown in below example same feature file can be used for smoke test scenarios as well as for login test scenario. When you intend to run your script for smoke test then use @SmokeTest. Similarly when you want your script to run for Login test use @LoginTest tag.

Any number of tags can be mentioned for a feature file as well as for scenario.

@SmokeTest @LoginTest

Feature: Login Functionality Feature

In order to ensure Login Functionality works,
I want to run the cucumber test to verify it is working

Scenario Outline: Login Functionality

Given user navigates to SOFTWARETETINGHELP.COM
When user logs in using Username as <username> and Password <password>
Then login should be successful

Examples:
|username         |password          |
|Tom     |password1        |
|Harry   |password2        |
|Jerry    |password3        |

Similarly you can specify tags to run specific scenario in a feature file. Please check below example to run specific scenario.

Feature: Login Functionality Feature

In order to ensure Login Functionality works,
I want to run the cucumber test to verify it is working

@positiveScenario
Scenario: Login Functionality

Given user navigates to SOFTWARETETINGHELP.COM
When user logs in using Username as “USER” and Password “PASSWORD”
Then login should be successful

@negaviveScenario
Scenario: Login Functionality

Given user navigates to SOFTWARETETINGHELP.COM
When user logs in using Username as “USER1” and Password “PASSWORD1”
Then error message should throw

#6) Junit Runner:

To run the specific feature file cucumber uses standard Junit Runner and specify tags in @Cucumber. Options. Multiple tags can be given by using comma separate. Here you can specify the path of the report and type of report you want to generate.

Example of Junit Runner:

import cucumber.api.junit.Cucumber;</pre>
import org.junit.runner.RunWith;
@RunWith(Cucumber.class)
@Cucumber.Options(format={"SimpleHtmlReport:report/smokeTest.html"},tags={"@smokeTest"})
Public class JUnitRunner {
}

Similarly you can give instruction to cucumber to run multiple tags. Below example illustrates how to use multiple tags in cucumber to run different scenarios.

import cucumber.api.junit.Cucumber;
 import org.junit.runner.RunWith;
 @RunWith(Cucumber.class)
 @Cucumber.Options(format={"SimpleHtmlReport:report/smokeTest.html"},tags={"@smokeTest",”@LoginTest”})
 Public class JUnitRunner {
}

#7) Cucumber Report:

Cucumber generates its own html format. However better reporting can be done using Jenkins or bamboo tool. Details of reporting are covered in next topic of cucumber.

Cucumber Project Setup:

Detail explanation of cucumber project set up is available separately in next tutorial. Please refer to Cucumber Tutorial Part2 from more information about project setup. Remember there is no extra software installations required for cucumber.

Implementation of Feature file:

We have to implement these steps in Java in order to test the feature files. Need to create a class which contains those given, when and then statements. Cucumber uses its annotations and all the steps are embedded in those annotations (given, when, then).Each phrase starts with “^” so that cucumber understands the start of the step. Similarly each step ends with “$”. User can use regular expressions to pass different test data. Regular expressions take data from feature steps and passes to step definitions. The order of parameters depends how they are passed from feature file. Please refer next tutorial for project setup and mapping between feature files and java classes.

Example:

Below example is to illustrate how feature files can be implemented.

In this example we have not used any selenium API. This is to just show how cucumber works as standalone framework. Please follow next tutorial for selenium integration with cucumber.

public class LoginTest {
@Given("^user navigates to SOFTWARETETINGHELP.COM$")
public void navigatePage() {
system.out.println(“Cucumber executed Given statement”);
}
@When("^user logs in using Username as \"(.*)\" and Password \"(.*)\"$")
public void login(String usename,String password) {
system.out.println(“Username is:”+ usename);
system.out.println(“Password is:”+ password);
}
@When("^click the Submit button$")
public void clickTheSubmitButton() {
system.out.println(“Executing When statement”)
}
@Then("^Home page should be displayed$")
public void validatePage() {
system.out.println(“Executing Then statement”)
}
@Then("^login should be successful$")
public void validateLoginSuccess() {
system.out.println(“Executing 2<sup>nd</sup> Then statement”)
}
}

When you execute cucumber runner class, cucumber will start reading feature file steps. For example, when you execute @smokeTest, cucumber will read Feature step and Given statement of scenario. As soon as cucumber finds Given statement, same Given statement will be searched in your java files. If same step is found in java file then cucumber executes the function specified for the same step otherwise cucumber will skip the step.

Conclusion:

In this tutorial, we have covered features of cucumber tool and its usage in real time scenario.
Cucumber is a most favorite tool for many projects as it is easy to understand, readable and contains business functionality.

In the next chapter we will cover how to setup a cucumber – java project and how to integrate Selenium WebDriver with Cucumber.

Recommended reading

33 comments ↓

#1 Kiran

Hi,

Can we use cucumber with TestNG instead of junit?

Thanks in advance

#2 Smitha

Thanks for detailed information on Cucumber, it helped a lot as a beginner .

#3 What are the maximum number of scenarios and scenario steps that we can use in a single feature file

Anyone knows answer please mail me

#4 Ranjini

What are the maximum number of scenarios and scenario steps that we can use in a single feature file.

Anyone knows answer please mail me Thanks…………..

#5 Chetan Bhadoria

I want to use cucumber with java so how can i install it on my machine.

#6 William Deich

This was not very helpful. It talks in such vague generalities, you’d pretty much have to already know Cucumber to learn it from this page.

#7 John P.

Thanks to the author. Very nice introduction to Cucumber. Much appreciated.

#8 priyanka

can we test php application with selenium and cucumber.plz explain in brief.

#9 sujana

Thanks for the nice introduction on cucumber.

#10 Sneha

Can we use cucumber with TestNG instead of junit?

Thanks in advance

#11 Satya Narayan Mahapatra

Thanks

#12 kalyan

When i am trying to run cucumber class some scenarios is working after that driver object is showing null why it ts?

#13 Udit

Can we use testNG instead of Junit or cucumber only uses Junit runner?

#14 Tushar

Very useful information for a beginner.
@William Deich : Sir, Please guide us from where we can get more basic info we don’t know cucumber at all ?

#15 gurpreet

how to download cucumber on the system?

#16 Mallika

Need a example where of feature file where More than two scenarios are written.

#17 Vipul Agarwal

Hello i need to know how can i use the data from database like ms sql as data table in example of scenario outline for my selenium scripts ?

#18 Harshika Jain

Awesome blog – all the concepts are cleared.

#19 Mukesh

Still testng not supportable in cucumber.

#20 Mukesh

@mallika: yes u can write more than one scenarios in feature file.

#21 Mukesh

@gurpreet: pls downlaod cucumber related jar’s and install cucumber plugin to eclipse

#22 Mahesh

This website is very useful. i learnt many new things.
I appreciate the content and precise information.
Thanks,
Mahesh

#23 pawan

Thanks for giving good clarity.
could you please give the same thing with the hepl of Ruby as well.

#24 Mayur

Hope sometimes someone comes with TestNG with Cucumber so we can make parallel execution possible. Has anyone done parallel execution with Cucumber before?

#25 Ramandeep

Yes, we can.. We have to use cucumber-testng instead of cucumber-junit

#26 Ramandeep

Ideally, unlimited but good approach would be too write feature file according to component division of your application

#27 Abhilasha

Hii!! Thanks for explaining cucumber. But please provide the material on gherkin as well.

#28 Vikram

Hi Team,

First of all let me tell you one thing is you all doing a fantastic job by giving us knowledge and making our future very best.

I would like to ask how can i download cucumber ?

Please provide me link or files ?

email id – vshah07@gmail.com

#29 Farsad

@Given(“^user navigates to SOFTWARETETINGHELP.COM$”)

misspelled your website.

#30 Misbah

Very informative, Thanks !

#31 Pankaj

Hi ,

I am looking for certification in cucumber or something similar to that. Could you please suggest what should I go for.

Thanks
Pankaj

#32 Jameel Shaik

Hi friends
Cucumber cannot be used with TestNg
because TestNg has Inbuilt Annotations
as @Test,@BeforeTest,@AfterTest——–
TestNg is Very Good at Understanding with simple Code with Selenium and platform java
but in cucumber we have to write Each Step

#33 Poornima

Hi,

I want to call a method, when each test scenario is failed.Which method I can call in Cucumber.?
Thanks in advance.

Regards,
Poornima

Leave a Comment