</>

Technology

Cucumber

Difficulty

Advanced

Interview Question

What is the difference between @Before, @BeforeStep, @After, and @AfterStep hooks in Cucumber?

Answer

Cucumber Hook Types

All Four Hook Types

Java
package hooks;

import io.cucumber.java.*;

public class AllHooks {

    // Runs ONCE before the entire scenario
    @Before(order = 1)
    public void beforeScenario(Scenario scenario) {
        System.out.println("▶ Starting: " + scenario.getName());
        initializeDriver();
    }

    // Runs before EVERY individual step within the scenario
    @BeforeStep
    public void beforeEachStep(Scenario scenario) {
        // Useful for: logging step name, setting up step-level state
        System.out.println("  → Step starting in: " + scenario.getName());
    }

    // Runs after EVERY individual step within the scenario
    @AfterStep
    public void afterEachStep(Scenario scenario) {
        if (scenario.isFailed()) {
            // Take screenshot after the SPECIFIC step that failed
            byte[] screenshot = ((TakesScreenshot) driver)
                .getScreenshotAs(OutputType.BYTES);
            scenario.attach(screenshot, "image/png", "Step Failed Screenshot");
        }
        // Useful for: step-level logging, performance timing
    }

    // Runs ONCE after the entire scenario completes
    @After(order = 1)
    public void afterScenario(Scenario scenario) {
        System.out.println("■ Finished: " + scenario.getName() +
            " Status: " + scenario.getStatus());
        softAssert.assertAll();  // collect all soft assertion failures
    }

    @After(order = 0)
    public void quitDriver() {
        if (driver != null) driver.quit();
    }
}

Execution Order Within a Scenario

CODE
Scenario: Login test
  ↓ @Before (order=1)       -- once
  ↓ @BeforeStep             -- before Given step
    Given the user is on the login page
  ↓ @AfterStep              -- after Given step
  ↓ @BeforeStep             -- before When step
    When the user enters credentials
  ↓ @AfterStep              -- after When step
  ↓ @BeforeStep             -- before Then step
    Then the dashboard should appear
  ↓ @AfterStep              -- after Then step
  ↓ @After (order=1)        -- once
  ↓ @After (order=0)        -- once (driver quit)

@Before Order — Higher Runs First

Java
@Before(order = 100)  // runs FIRST
public void initializeFramework() { ... }

@Before(order = 50)   // runs SECOND
public void setUpTestData() { ... }

@Before(order = 1)    // runs LAST (default)
public void setUp() { ... }

@After Order — Lower Runs First

Java
@After(order = 100)  // runs FIRST after scenario
public void softAssertAll() { softAssert.assertAll(); }

@After(order = 50)   // runs SECOND
public void captureExtentReport() { ... }

@After(order = 0)    // runs LAST
public void quitDriver() { driver.quit(); }

When to Use Each Hook

HookUse Case
@BeforeBrowser init, DB setup, login, reset state
@BeforeStepStep-level logging, performance timer start
@AfterAssertions, report capture, cleanup
@AfterStepStep-level screenshot on failure, timer end

Tagged Hooks

Java
@Before("@payments")
public void loadPaymentTestData() {
    dbUtils.loadPaymentFixtures();
}

@After("@payments")
public void cleanupPaymentData() {
    dbUtils.deletePaymentTestData();
}

Only runs for scenarios tagged @payments — other scenarios are unaffected.

Follow AutomateQA

Related Topics