In the last chapters of Cucumber Hooks & Cucumber Tags , we learned that how what are Hooks & Tags and their importance and their usage in Cucumber tests. In this chapter we will look at the concept of Tagged Hook in Cucumber.

Now we know that if we need to do anything before or after the test, we can use @Before & @After hooks. But this scenario works till the time our prerequisites are the same for all the scenarios. For example till the time prerequisite for any test is to start the browser, hooks can solve our purpose. But what if we have different perquisites for different scenarios. And we need to have different hooks for different scenarios.

Again, Cucumbers has given a feature of Tagged Hooks to solve the above situation where we need to perform different tasks before and after scenarios.

Tagged Hooks in Cucumber

Lets again start with doing a simple exercise to get the concept straight. Just keep three different scenarios in the feature file with the same Given, When & Then steps.

1)-First step is to annotate required scenarios using @ + AnyName at the top of the Scenario. For this example, I just annotate each scenario with the sequence order of it, like @First, @Second & @Third.

Feature File

Feature: Test Tagged Hooks

@First 
Scenario: This is First Scenario
	Given this is the first step
	When this is the second step
	Then this is the third step

@Second	
Scenario: This is Second Scenario
	Given this is the first step
	When this is the second step
	Then this is the third step

@Third	
Scenario: This is Third Scenario
	Given this is the first step
	When this is the second step
	Then this is the third step
  1. Create a Step definition file and just print the execution order of the steps in the console.

Step Definitions

package stepDefinition;

	import cucumber.api.java.en.Given;
	import cucumber.api.java.en.Then;
	import cucumber.api.java.en.When;

	public class Hooks_Steps {

		@Given("^this is the first step$")
		public void This_Is_The_First_Step(){
			System.out.println("This is the first step");
		}

		@When("^this is the second step$")
		public void This_Is_The_Second_Step(){
			System.out.println("This is the second step");
		}

		@Then("^this is the third step$")
		public void This_Is_The_Third_Step(){
			System.out.println("This is the third step");
		}

	}
  1. Define tagged hooks in Hooks class file. Hooks can be used like @Before("@TagName"). Create before and after hooks for every scenario. I have also added normal before and after hooks, in case you are not aware, please go to the previous chapter of Hooks in Cucumber.

Hooks

package utilities;

import cucumber.api.java.After;
import cucumber.api.java.Before;

public class Hooks {

	@Before
    public void beforeScenario(){
        System.out.println("This will run before the every Scenario");
    }

	@After
    public void afterScenario(){
        System.out.println("This will run after the every Scenario");
    }

	@Before("@First")
    public void beforeFirst(){
        System.out.println("This will run only before the First Scenario");
    }	

	@Before("@Second")
    public void beforeSecond(){
        System.out.println("This will run only before the Second Scenario");
    }	

	@Before("@Third")
    public void beforeThird(){
        System.out.println("This will run only before the Third Scenario");
    }

	@After("@First")
    public void afterFirst(){
        System.out.println("This will run only after the First Scenario");   
    }	

	@After("@Second")
    public void afterSecond(){
        System.out.println("This will run only after the Second Scenario");   
    }	

	@After("@Third")
    public void afterThird(){
        System.out.println("This will run only after the Third Scenario");   
    }	
}

Note: We learned that @Before & @After hooks run before & after every Scenario. But @Before("@First") will run only before the first scenario and likewise other tagged hooks. Again, these tags names can be anything and no need to be first, second and third.

  1. Run the feature file and observe the output.

Output

Feature: Test Tagged Hooks
This will run only before the First Scenario
This will run before the every Scenario
This is the first step
This is the second step
This is the third step
This will run after the every Scenario
This will run only after the First Scenario
This will run only before the Second Scenario
This will run before the every Scenario
This is the first step
This is the second step
This is the third step
This will run after the every Scenario
This will run only after the Second Scenario
This will run before the every Scenario
This will run only before the Third Scenario
This is the first step
This is the second step
This is the third step
This will run only after the Third Scenario
This will run after the every Scenario

Common Tagged Hooks for Multiple Scenarios

We can have common tagged hooks for multiple scenarios as well. In the below example, I just combined the @Before("First") and @Before("Third") by @Before("@First, @Third"). So in this way we do not need to have two different hooks logic.

Hooks

package utilities;

import cucumber.api.java.After;
import cucumber.api.java.Before;

public class Hooks {

	@After
    public void afterScenario(){
        System.out.println("This will run after the every Scenario");
    }		
	@Before
    public void beforeScenario(){
        System.out.println("This will run before the every Scenario");
    }	

	@Before("@Second")
    public void beforeSecond(){
        System.out.println("This will run only before the Second Scenario");
    }		
	@Before("@First,@Third")
    public void beforeFirstAndThird(){
        System.out.println("This will run before both First & Third Scenario");
    }

	@After("@First")
    public void afterFirst(){
        System.out.println("This will run only after the First Scenario");   
    }		
	@After("@Second")
    public void afterSecond(){
        System.out.println("This will run only after the Second Scenario");   
    }		
	@After("@Third")
    public void afterThird(){
        System.out.println("This will run only after the Third Scenario");   
    }	

}

Output

Feature: Test Tagged Hooks
This will run before the every Scenario
This will run before both First & Third Scenario
This is the first step
This is the second step
This is the third step
This will run only after the First Scenario
This will run after the every Scenario

This will run before the every Scenario
This will run only before the Second Scenario
This is the first step
This is the second step
This is the third step
This will run only after the Second Scenario
This will run after the every Scenario

This will run before the every Scenario
This will run before both First & Third Scenario
This is the first step
This is the second step
This is the third step
This will run only after the Third Scenario
This will run after the every Scenario
Cucumber Hooks
Cucumber Hooks
Previous Article
Execution Order of Hooks
Execution Order of Hooks
Next Article
Lakshay Sharma
I’M LAKSHAY SHARMA AND I’M A FULL-STACK TEST AUTOMATION ENGINEER. Have passed 16 years playing with automation in mammoth projects like O2 (UK), Sprint (US), TD Bank (CA), Canadian Tire (CA), NHS (UK) & ASOS(UK). Currently, I am working with RABO Bank as a Chapter Lead QA. I am passionate about designing Automation Frameworks that follow OOPS concepts and Design patterns.
Reviewers
Virender Singh's Photo
Virender Singh

Similar Articles

Feedback