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
| Hook | Use Case |
|---|---|
@Before | Browser init, DB setup, login, reset state |
@BeforeStep | Step-level logging, performance timer start |
@After | Assertions, report capture, cleanup |
@AfterStep | Step-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.
