Bird
Raised Fist0
Selenium Javatesting~15 mins

Why TestNG structures test execution in Selenium Java - Automation Benefits in Action

Choose your learning style10 modes available
Verify TestNG test execution order with multiple test methods
Preconditions (2)
Step 1: Create a TestNG test class with three test methods: testA, testB, testC
Step 2: Annotate test methods with @Test and assign priorities: testA(priority=2), testB(priority=1), testC(priority=3)
Step 3: In each test method, open the browser and navigate to https://example.com
Step 4: Print a message to the console indicating which test method is running
Step 5: Run the TestNG test suite
Step 6: Observe the order in which test methods execute
✅ Expected Result: Test methods execute in the order of their priority: testB, testA, testC. Console output shows messages in this order.
Automation Requirements - TestNG with Selenium WebDriver
Assertions Needed:
Verify that test methods run in the order of their assigned priority
Verify that the browser navigates to the correct URL in each test
Best Practices:
Use @BeforeMethod and @AfterMethod for setup and teardown
Use explicit waits if needed
Use meaningful test method names
Avoid hardcoded waits
Use assertions to verify expected conditions
Automated Solution
Selenium Java
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

public class TestNGExecutionOrder {
    private WebDriver driver;
    private final String url = "https://example.com";

    @BeforeMethod
    public void setUp() {
        // Set path to chromedriver executable if needed
        driver = new ChromeDriver();
    }

    @AfterMethod
    public void tearDown() {
        if (driver != null) {
            driver.quit();
        }
    }

    @Test(priority = 2)
    public void testA() {
        driver.get(url);
        System.out.println("Running testA");
        Assert.assertEquals(driver.getCurrentUrl(), url, "URL should be https://example.com");
    }

    @Test(priority = 1)
    public void testB() {
        driver.get(url);
        System.out.println("Running testB");
        Assert.assertEquals(driver.getCurrentUrl(), url, "URL should be https://example.com");
    }

    @Test(priority = 3)
    public void testC() {
        driver.get(url);
        System.out.println("Running testC");
        Assert.assertEquals(driver.getCurrentUrl(), url, "URL should be https://example.com");
    }
}

This test class uses TestNG to demonstrate how test execution order is controlled by the priority attribute.

The @BeforeMethod sets up the browser before each test, and @AfterMethod closes it after each test to keep tests independent.

Each test method navigates to the same URL and prints a message to the console to show execution order.

Assertions check that the browser is on the expected URL.

When running this test, TestNG runs testB first because it has priority 1, then testA (priority 2), then testC (priority 3).

This shows how TestNG structures test execution order based on priority, helping organize tests clearly and predictably.

Common Mistakes - 4 Pitfalls
Not using @BeforeMethod and @AfterMethod for setup and teardown
Not assigning priorities and expecting tests to run in code order
Using Thread.sleep instead of proper waits
Hardcoding URLs or test data inside test methods
Bonus Challenge

Now add data-driven testing with 3 different URLs to verify TestNG execution order with different inputs

Show Hint

Practice

(1/5)
1. Why does TestNG structure test execution using features like priority and dependsOnMethods?
easy
A. To make tests run randomly without any order
B. To control the order and dependencies between tests for smoother runs
C. To skip all tests automatically
D. To run tests only once without retries

Solution

  1. Step 1: Understand TestNG test execution control

    TestNG uses features like priority and dependsOnMethods to manage the order and dependencies of tests.
  2. Step 2: Recognize the benefit of structured execution

    This control helps tests run smoothly and find problems faster by running in a logical order.
  3. Final Answer:

    To control the order and dependencies between tests for smoother runs -> Option B
  4. Quick Check:

    TestNG structures execution = Control order & dependencies [OK]
Hint: TestNG orders tests to avoid chaos and errors [OK]
Common Mistakes:
  • Thinking TestNG runs tests randomly
  • Believing TestNG skips tests automatically
  • Assuming TestNG runs tests only once without control
2. Which of the following is the correct way to set test priority in TestNG?
easy
A. @Test(priority = 1)
B. @Test(order = 1)
C. @Test(sequence = 1)
D. @Test(rank = 1)

Solution

  1. Step 1: Recall TestNG annotation syntax

    TestNG uses @Test(priority = number) to set the execution order of tests.
  2. Step 2: Identify the correct attribute name

    The correct attribute is priority, not order, sequence, or rank.
  3. Final Answer:

    @Test(priority = 1) -> Option A
  4. Quick Check:

    TestNG priority syntax = @Test(priority = x) [OK]
Hint: Use 'priority' attribute inside @Test for order [OK]
Common Mistakes:
  • Using wrong attribute names like order or rank
  • Missing parentheses after @Test
  • Confusing priority with dependsOnMethods
3. Given the following TestNG code, what will be the order of test execution?
@Test(priority = 2)
public void testB() { }

@Test(priority = 1)
public void testA() { }

@Test(priority = 3)
public void testC() { }
medium
A. testA, testC, testB
B. testB, testA, testC
C. testA, testB, testC
D. testC, testB, testA

Solution

  1. Step 1: Identify priorities assigned to each test

    testA has priority 1, testB has priority 2, testC has priority 3.
  2. Step 2: Understand TestNG runs tests in ascending priority order

    Tests run from lowest priority number to highest: 1, then 2, then 3.
  3. Final Answer:

    testA, testB, testC -> Option C
  4. Quick Check:

    Priority order = 1, 2, 3 [OK]
Hint: Lower priority number runs first in TestNG [OK]
Common Mistakes:
  • Assuming higher priority number runs first
  • Ignoring priority and expecting alphabetical order
  • Confusing priority with dependsOnMethods
4. What is wrong with this TestNG test method if we want testB to run only after testA completes successfully?
@Test
public void testA() { }

@Test(dependsOnMethods = {"testA"})
public void testB() { }

@Test(dependsOnMethods = {"testC"})
public void testC() { }
medium
A. testA should have dependsOnMethods attribute
B. testB does not depend on testA correctly
C. No errors, code is correct
D. testC depends on itself, causing a circular dependency error

Solution

  1. Step 1: Analyze dependencies declared

    testB depends on testA, which is correct. testC depends on "testC" itself, which is a circular dependency.
  2. Step 2: Understand circular dependency impact

    A test depending on itself causes TestNG to throw an error and stop execution.
  3. Final Answer:

    testC depends on itself, causing a circular dependency error -> Option D
  4. Quick Check:

    Self-dependency causes error [OK]
Hint: Avoid tests depending on themselves [OK]
Common Mistakes:
  • Thinking testB dependency is wrong
  • Adding dependsOnMethods to testA unnecessarily
  • Ignoring circular dependency errors
5. You want to run three tests: loginTest, searchTest, and logoutTest. searchTest should run only after loginTest passes, and logoutTest should run last. Which TestNG setup correctly structures this execution?
hard
A. @Test(priority = 1) public void loginTest() {} @Test(priority = 2, dependsOnMethods = {"loginTest"}) public void searchTest() {} @Test(priority = 3) public void logoutTest() {}
B. @Test(priority = 2) public void loginTest() {} @Test(priority = 4, dependsOnMethods = {"loginTest"}) public void searchTest() {} @Test(priority = 3) public void logoutTest() {}
C. @Test(priority = 3) public void loginTest() {} @Test(priority = 2, dependsOnMethods = {"logoutTest"}) public void searchTest() {} @Test(priority = 1) public void logoutTest() {}
D. @Test(priority = 1) public void loginTest() {} @Test(priority = 3, dependsOnMethods = {"logoutTest"}) public void searchTest() {} @Test(priority = 2) public void logoutTest() {}

Solution

  1. Step 1: Check loginTest priority and dependencies

    loginTest has priority 1 and no dependencies, so it runs first.
  2. Step 2: Verify searchTest depends on loginTest and runs second

    searchTest has priority 2 and depends on loginTest, so it runs after loginTest passes.
  3. Step 3: Confirm logoutTest runs last with priority 3

    logoutTest has priority 3 and no dependencies, so it runs last.
  4. Final Answer:

    loginTest (priority=1), searchTest (priority=2, dependsOnMethods={"loginTest"}), logoutTest (priority=3) -> Option A
  5. Quick Check:

    loginTest -> searchTest -> logoutTest with correct priority and dependsOnMethods [OK]
Hint: Use priority ascending and dependsOnMethods for order [OK]
Common Mistakes:
  • Setting wrong priority numbers
  • Wrong dependsOnMethods causing wrong order
  • Making logoutTest depend on searchTest incorrectly
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard