</>

Technology

TestNG

Difficulty

Intermediate

Interview Question

What is dependsOnGroups in TestNG and how does it differ from dependsOnMethods?

Answer

dependsOnGroups vs dependsOnMethods in TestNG

Both create execution order dependencies, but at different granularity levels.

dependsOnMethods — Method-Level Dependency

Java
@Test
public void openBrowser() {
    driver = new ChromeDriver();
    driver.get("https://automateqa.online");
}

@Test(dependsOnMethods = "openBrowser")
public void login() {
    // Runs only after openBrowser passes
    driver.findElement(By.id("username")).sendKeys("admin");
}

@Test(dependsOnMethods = {"openBrowser", "login"})
public void verifyDashboard() {
    // Runs only after BOTH openBrowser AND login pass
    Assert.assertTrue(driver.getTitle().contains("Dashboard"));
}

Problem: Hard to maintain in large suites — renaming one method breaks all dependsOnMethods references.

dependsOnGroups — Group-Level Dependency

Java
@Test(groups = "setup")
public void openBrowser() { ... }

@Test(groups = "setup")
public void navigateToHome() { ... }

// Login depends on the entire "setup" GROUP
@Test(groups = "login", dependsOnGroups = "setup")
public void login() {
    // Runs after ALL "setup" tests pass
}

// Checkout depends on login GROUP
@Test(groups = "checkout", dependsOnGroups = "login")
public void addToCart() { ... }

@Test(groups = "checkout", dependsOnGroups = "login")
public void proceedToPayment() { ... }

testng.xml — Include/Exclude Groups

XML
<suite name="Suite">
    <test name="E2ETest">
        <groups>
            <run>
                <include name="setup"/>
                <include name="login"/>
                <include name="checkout"/>
                <!-- exclude name="wip"/ -->
            </run>
        </groups>
        <classes>
            <class name="tests.E2ETest"/>
        </classes>
    </test>
</suite>

Multiple Group Dependencies

Java
@Test(groups = "payment",
      dependsOnGroups = {"login", "checkout"})
public void processPayment() {
    // Runs only after all "login" AND all "checkout" tests pass
}

alwaysRun with Group Dependencies

Java
// Run cleanup even if dependent group failed
@Test(groups = "cleanup",
      dependsOnGroups = "payment",
      alwaysRun = true)
public void closeBrowser() {
    driver.quit(); // always runs — even if payment tests failed
}

Comparison

FeaturedependsOnMethodsdependsOnGroups
GranularitySpecific method namesGroup names
MaintainabilityLow (names are fragile)High (groups are stable)
ScaleSmall suitesEnterprise suites
FlexibilityRigidAdd/remove methods freely
testng.xml controlNoYes (include/exclude)

Follow AutomateQA

Related Topics