Introduction
When we execute our test cases with cucumber, we can tag our test cases based on their types, tags use ‘@’ symbol with some text I.e., tag name, e.g., @SmokeTest.
We can also do some documentation with the help of tags. Tags are useful when we want to run a specific type of test case from different feature files having similar kinds of scenarios by tagging them with the same tag name and then executing them through the test runner file by placing the tag in it so that it will run only those scenarios which have that specific tag, we can run a single tag or multiple tags and also run with a combination of tags or using AND, OR conditions.
In this blog, we will discuss-
- Project setup for using tags in cucumber
- How to mark features and scenarios with tags in cucumber
- How to use @ symbol with some text
- How to have multiple tags for a feature or scenario
- How to run specific tags in the test runner
Project setup for using tags in cucumber
Firstly, we must install all prerequisites in our project (for more info about prerequisites you can visit- Web automation using Selenium and Cucumber with Java
Add the maven dependencies.
After verifying the prerequisites, add the required dependencies as shown below:
To get the maven dependencies first we need to visit the following link:
https://mvnrepository.com/repos/central and then we need to search for the required dependency

Select Cucumber JUnit>click on the latest version>copy the dependency

> add it to the pom.xml file
Similarly, we need to search for Cucumber JVM:JUnit(io.cucumber)> Select Cucumber JVM:JUnit(io. cucumber) >click on the latest version>copy the dependency

> add it to the pom.xml file
Below is an image of the pom.xml file after all the dependencies have been added

Mark features and scenarios with tags
In order to use tags, we first need to create a feature file.
To create a new feature file, right-click on the Features folder in ‘src/test/resources’> click on New> go to File>provider File name with ‘.feature’ extension> click on Finish

A feature file with the name ‘Tags’ has been created in the below image.

Next, we need to create the features, scenarios for the features, and the steps to follow for the specific feature as per the scenario along with the tag.
Feature: Feature to demonstrate tags
@Smoke
Scenario: Validate the search functionality of google
Given browser is launched
When User enters a text in search box
And clicks on the search button
Then the user is redirected to search results

Code explanation:
In this example, we have a feature file containing the title of the feature as Feature to demonstrate tags, and a scenario to validate the search functionality of Google, under the @Smoke tag followed by the steps given by using Given, When, Then, And which will instruct the process for testing the particular feature.
How to have multiple tags for a feature or scenario
After creating the feature file, we can add more scenarios with different tags in the feature file.
Feature: Feature to demonstrate tags
@Smoke
Scenario: Validate the search functionality of google
Given browser is launched
When User enters a text in search box
And clicks on the search button
Then the user is redirected to search results
@Regression
Scenario: Filling in the registration form
Given I want to fill up the registration form
And get admission in the institution
And the duration to fill the form is from 1stSept2022 to 5thSept2022
When I complete filling in the form
And submit it on 5thSept2022
Then I validate if the registration process has been done successfully
@Smoke @Regression
Scenario: Validate the login functionality
Given user has the login credentials
When User enters the login ID and password
And clicks on login button
And clicks on login button
@Sanity
Scenario: Verify the title of the page
Given user is on the home page of Gmail account
And the user clicks on the sent option
And checks the sent items
When user goes back to the home page
Then the title should be Google

Code Explanation:
In the above example, we have added more scenarios to the feature file under the title of the feature as Feature to demonstrate tags. We have added a scenario for Filling in the registration form under the @Regression tag, a scenario to Validate the login functionality under the @Smoke @Regression tags and a scenario to Verify the title of the page under the @Sanity tag, along with the steps by using Given, When, Then, And which will instruct the process for testing each scenario.
Next, we need to run the feature file and then copy the provided functions for Given, When, And, Then under the message stating to implement the missing steps from the console, make changes to it and paste it into the class created in the Step Definitions folder.
package StepDefinitions;
import io.cucumber.java.en.And;
import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then;
import io.cucumber.java.en.When;
public class Steps {
@Given("browser is launched")
public void browser_is_launched() {
System.out.println("browser is launched");
}
@When("User enters a text in search box")
public void user_enters_a_text_in_search_box() {
System.out.println("User enters a text in search box");
}
@And("clicks on the search button")
public void clicks_on_the_search_button() {
System.out.println("clicks on the search button");
}
@Then("the user is redirected to search results")
public void the_user_is_redirected_to_search_results() {
System.out.println("the user is redirected to search results");
}
@Given("I want to fill up the registration form")
public void i_want_to_fill_up_the_registration_form() {
System.out.println("I want to fill up the registration form");
}
@And("get admission in the institution")
public void get_admission_in_the_institution() {
System.out.println("get admission in the institution");
}
@And("the duration to fill the form is from 1stSept2022 to 5thSept2022")
public void the_duration_to_fill_the_form_is_from_1st_sept2022_to_5th_sept2022() {
System.out.println("the duration to fill the form is from 1stSept2022 to 5thSept2022");
}
@When("I complete filling in the form")
public void i_complete_filling_in_the_form() {
System.out.println("I complete filling in the form");
}
@And("submit it on 5thSept2022")
public void submit_it_on_5th_sept2022() {
System.out.println("submit it on 5thSept2022");
}
@Then("I validate if the registration process has been done successfully")
public void i_validate_if_the_registration_process_has_been_done_successfully() {
System.out.println("I validate if the registration process has been done successfully");
}
@Given("user has the login credentials")
public void user_has_the_login_credentials() {
System.out.println("user has the login credentials");
}
@When("User enters the login ID and password")
public void user_enters_the_login_id_and_password() {
System.out.println("User enters the login ID and password");
}
@And("clicks on login button")
public void clicks_on_login_button() {
System.out.println("clicks on login button");
}
@Then("the user is redirected to the home page")
public void the_user_is_redirected_to_the_home_page() {
System.out.println("the user is redirected to the home page");
}
@Given("user is on the home page of Gmail account")
public void user_is_on_the_home_page_of_gmail_account() {
System.out.println("user is on the home page of Gmail account");
}
@And("the user clicks on the sent option")
public void the_user_clicks_on_the_sent_option() {
System.out.println("the user clicks on the sent option");
}
@And("checks the sent items")
public void checks_the_sent_items() {
System.out.println("checks the sent items");
}
@When("user goes back to the home page")
public void user_goes_back_to_the_home_page() {
System.out.println("user goes back to the home page");
}
@Then("the title should be Google")
public void the_title_should_be_google() {
System.out.println("the title should be Google");
}
}

The above code will provide a backend code for the steps that we have written in the feature file so that the processor will know the exact code to be executed through the step definition for each step that we have created in the feature file.
How to run specific tags in the test runner
To Execute the code, we need to create a runner class in the Step Definitions folder.
For creating the Step Definitions folder, right-click on ‘src/test/java’> go to New> select Folder>Provide the name of the folder>click on Finish
To create a runner class, we need to right-click on the Step Definitions folder>go to new> select class> provide the name of the class>click on Finish

After Creating the test runner class file, we need to add the cucumber annotation and options, also provide the location of the feature files and step definitions, and add the tag in the Cucumber Options section to execute tests belonging to the smoke tag as shown below:
package StepDefinitions;
import org.junit.runner.RunWith;
import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
@RunWith(Cucumber.class)
@CucumberOptions(features="src/test/resources/Features",
glue= {"StepDefinitions"},
tags = "@Smoke"
)
public class TestRunner {
}

To run the above code, we need to right-click on the test runner file>select Run As> Select JUnit Test.
We can also run the test runner class with a combination of tags with the help OR conditions as shown below:
package StepDefinitions;
import org.junit.runner.RunWith;
import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
@RunWith(Cucumber.class)
@CucumberOptions(features="src/test/resources/Features",
glue= {"StepDefinitions"},
tags = "@Smoke or @Regression"
)
public class TestRunner {
}

To run the above code, we need to right-click on the test runner file>select Run As> Select JUnit Test. It will execute the scenarios that either have smoke or regression.
We can run a scenario with two tags by using AND condition, as shown below:
package StepDefinitions;
import org.junit.runner.RunWith;
import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
@RunWith(Cucumber.class)
@CucumberOptions(features="src/test/resources/Features",
glue= {"StepDefinitions"},
tags = "@Smoke and @Regression"
)
public class TestRunner {
}

To run the above code, we need to right-click on the test runner file>select Run As> Select JUnit Test. It will execute the scenarios that have both smoke and regression tags.
We can run a scenario by using both AND and OR conditions, as shown below:
package StepDefinitions;
import org.junit.runner.RunWith;
import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
@RunWith(Cucumber.class)
@CucumberOptions(features="src/test/resources/Features",
glue= {"StepDefinitions"},
tags = "@Smoke or @Regression and @Sanity"
)
public class TestRunner {
}

To run the above code, we need to right-click on the test runner file>select Run As> Select JUnit Test. It will execute the scenario with either Smoke or Regression tag and Sanity tag.
We can also skip tags by using AND Not conditions as shown below:
package StepDefinitions;
import org.junit.runner.RunWith;
import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
@RunWith(Cucumber.class)
@CucumberOptions(features="src/test/resources/Features",
glue= {"StepDefinitions"},
tags = "@Smoke and not @Sanity"
)
public class TestRunner {
}

To run the above code, we need to right-click on the test runner file>select Run As> Select JUnit Test. It will execute the scenario with the Smoke tag and not the Sanity tag.
Results
After each and every execution we should get JUnit results as passed, as shown in the image below:
