</>

Technology

Cucumber

Difficulty

Advanced

Interview Question

A Product Manager asks you to reduce the Cucumber regression suite runtime from 4 hours to under 30 minutes. How do you do it?

Answer

Reducing Cucumber Regression from 4 Hours to 30 Minutes

Current State Analysis

CODE
Total: 500 scenarios ร— 30 seconds average = 4.2 hours (serial)

Breakdown of time per scenario:
  Browser open/close:    3 sec
  UI login:             15 sec  โ† biggest waste
  Test steps:           10 sec
  Waits/Thread.sleep:    2 sec

Optimization 1: Parallel Execution (Biggest Win โ€” 5x speedup)

Java
@CucumberOptions(features = "src/test/resources/features", glue = {"stepDefs","hooks"})
public class ParallelTestRunner extends AbstractTestNGCucumberTests {
    @Override
    @DataProvider(parallel = true)
    public Object[][] scenarios() { return super.scenarios(); }
}
XML
<!-- testng.xml: 10 parallel threads -->
<suite name="Fast Regression" parallel="methods" thread-count="10">
    <test name="Cucumber BDD">
        <classes><class name="runners.ParallelTestRunner"/></classes>
    </test>
</suite>
CODE
Before: 500 scenarios ร— 30s = 4.2h
After: 500 รท 10 threads = 50 scenarios per thread ร— 30s = 25 min

Optimization 2: API Login (Saves 15s ร— 400 scenarios = 100 min)

Java
@Before("@needs-login")
public void loginViaApi() {
    String token = apiClient.getAuthToken("admin@test.com", "Admin@123");
    ctx.driver.get(baseUrl);
    ctx.driver.manage().addCookie(new Cookie("auth_token", token));
    // 0.5 sec instead of 15 sec
}
CODE
Savings: 400 scenarios ร— 14.5s saved = 96.7 minutes saved

Optimization 3: Headless Chrome (Saves 2-3s per scenario)

Java
options.addArguments("--headless=new", "--no-sandbox", "--disable-dev-shm-usage");

Optimization 4: Eliminate Thread.sleep

Bash
# Find all sleeps in the project
grep -rn "Thread.sleep" src/test/java/

# Replace with explicit waits
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(15));
wait.until(ExpectedConditions.visibilityOfElementLocated(locator));
CODE
Savings: 200 sleeps ร— 2s average = 6.7 minutes saved

Optimization 5: API Test Data Setup (Saves 5-10s per scenario)

Java
@Before("@needs-product")
public void createProductViaApi() {
    // 0.2s via API vs 30s clicking through admin UI
    ctx.productId = apiClient.createProduct("Test Laptop", 999.00);
}

Optimization 6: Suite Tiering Strategy

CODE
Suite 1: @smoke (15 scenarios, 3 threads) = 2 min โ†’ every commit
Suite 2: @sanity (50 scenarios, 5 threads) = 5 min โ†’ every PR
Suite 3: @regression (500 scenarios, 10 threads) = 25 min โ†’ nightly
Suite 4: @P1 (80 critical scenarios, 10 threads) = 8 min โ†’ post-deploy

Optimization 7: Selenium Grid for Cloud Scale

Java
// Run 50 parallel browsers on Selenium Grid / LambdaTest / BrowserStack
ctx.driver = new RemoteWebDriver(
    new URL("https://hub.lambdatest.com/wd/hub"),
    capabilities
);
CODE
500 scenarios รท 50 browsers = 10 scenarios per browser ร— 30s = 5 min!

Results After All Optimizations

CODE
Before: 4.2 hours (serial, UI login, Thread.sleep)
After:  22-28 minutes (10 parallel, API login, headless, no sleep)

Optimization breakdown:
  Parallel (10 threads):    4.2h โ†’ 25 min  (10x)
  API login bypass:         -97 min
  No Thread.sleep:          -7 min
  Headless browser:         -4 min
  API test data:            -8 min

Final: ~22 minutes โœ“ (under 30 minute target)

Follow AutomateQA

Related Topics