testng.xml is the single most powerful file in your automation framework. It controls WHAT tests run, in WHAT order, with WHAT configuration, and HOW they execute. Think of it as the remote control for your test suite — you can switch channels (groups), adjust volume (thread count), and select inputs (parameters) without touching a single test class.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="AutoPractice Test Suite">
<test name="Banking Module">
<classes>
<class name="com.autopractice.tests.BankingLoginTest" />
<class name="com.autopractice.tests.BankingDashboardTest" />
<class name="com.autopractice.tests.BankingTransferTest" />
</classes>
</test>
<test name="Shopping Module">
<classes>
<class name="com.autopractice.tests.ShoppingHomeTest" />
<class name="com.autopractice.tests.ShoppingCartTest" />
</classes>
</test>
</suite>The hierarchy is: suite → test → classes → class. A suite contains one or more <test> tags. Each <test> tag contains one or more test classes. When you run testng.xml, every test class listed runs.
You can pick exactly which methods to run or skip from a class:
<test name="Selected Login Tests">
<classes>
<class name="com.autopractice.tests.BankingLoginTest">
<methods>
<include name="testSuccessfulLogin" />
<include name="testInvalidPassword" />
<!-- Everything else in this class is excluded -->
</methods>
</class>
</classes>
</test>
<!-- Or exclude specific methods -->
<test name="All Except Broken">
<classes>
<class name="com.autopractice.tests.BankingLoginTest">
<methods>
<exclude name="testForgotPassword" />
<!-- Everything else runs -->
</methods>
</class>
</classes>
</test>This is how you run just smoke tests, or just regression tests. You tell testng.xml which groups to include or exclude:
<!-- Smoke test suite — runs only tests tagged with "smoke" -->
<suite name="Smoke Suite">
<test name="Smoke Tests">
<groups>
<run>
<include name="smoke" />
</run>
</groups>
<classes>
<class name="com.autopractice.tests.BankingLoginTest" />
<class name="com.autopractice.tests.ShoppingHomeTest" />
<class name="com.autopractice.tests.ShoppingCartTest" />
</classes>
</test>
</suite>
<!-- Regression suite — runs smoke + regression, excludes broken -->
<suite name="Regression Suite">
<test name="Full Regression">
<groups>
<run>
<include name="smoke" />
<include name="regression" />
<exclude name="broken" />
</run>
</groups>
<classes>
<class name="com.autopractice.tests.BankingLoginTest" />
<class name="com.autopractice.tests.BankingDashboardTest" />
<class name="com.autopractice.tests.ShoppingHomeTest" />
<class name="com.autopractice.tests.ShoppingCartTest" />
</classes>
</test>
</suite>In most companies, you have multiple testng.xml files: testng-smoke.xml (runs on every build, 2-5 minutes), testng-regression.xml (runs nightly, 30-60 minutes), testng-sanity.xml (runs after deployment, quick health check). You switch between them by changing the suiteXmlFile in pom.xml or passing it as a Maven parameter.
You can pass values from testng.xml to your test classes. This is how you switch browsers or environments without changing code:
<suite name="Cross-Browser Suite">
<parameter name="browser" value="chrome" />
<parameter name="baseUrl" value="https://www.testerrank.com" />
<test name="Banking on Chrome">
<parameter name="module" value="banking" />
<classes>
<class name="com.autopractice.tests.BankingLoginTest" />
</classes>
</test>
</suite>import org.testng.annotations.Parameters;
public class BaseTest {
@Parameters({"browser", "baseUrl"})
@BeforeMethod
public void setUp(String browser, String baseUrl) {
WebDriver driver;
switch (browser.toLowerCase()) {
case "chrome":
driver = new ChromeDriver();
break;
case "firefox":
driver = new FirefoxDriver();
break;
case "edge":
driver = new EdgeDriver();
break;
default:
throw new IllegalArgumentException(
"Unsupported browser: " + browser);
}
driver.manage().window().maximize();
driver.get(baseUrl);
}
}You can make entire groups depend on other groups. All smoke tests must pass before regression tests run:
<suite name="Ordered Suite">
<test name="Ordered Tests">
<groups>
<dependencies>
<group name="regression" depends-on="smoke" />
</dependencies>
<run>
<include name="smoke" />
<include name="regression" />
</run>
</groups>
<classes>
<class name="com.autopractice.tests.BankingLoginTest" />
<class name="com.autopractice.tests.BankingDashboardTest" />
</classes>
</test>
</suite><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="AutoPractice Full Suite"
parallel="tests" thread-count="2">
<parameter name="baseUrl" value="https://www.testerrank.com" />
<listeners>
<listener class-name="com.autopractice.listeners.TestListener" />
<listener class-name="com.autopractice.listeners.RetryTransformer" />
</listeners>
<test name="Banking Module">
<parameter name="module" value="banking" />
<groups>
<run>
<include name="smoke" />
<include name="regression" />
</run>
</groups>
<classes>
<class name="com.autopractice.tests.banking.LoginTest" />
<class name="com.autopractice.tests.banking.DashboardTest" />
<class name="com.autopractice.tests.banking.TransferTest" />
</classes>
</test>
<test name="Shopping Module">
<parameter name="module" value="shopping" />
<groups>
<run>
<include name="smoke" />
<include name="regression" />
</run>
</groups>
<classes>
<class name="com.autopractice.tests.shopping.HomeTest" />
<class name="com.autopractice.tests.shopping.SearchTest" />
<class name="com.autopractice.tests.shopping.CartTest" />
</classes>
</test>
</suite>Q: What is testng.xml and how do you use it?
A: testng.xml is the XML configuration file that controls the entire test suite. It defines which test classes to run, which groups to include or exclude, parameters like browser name and base URL, parallel execution settings, and listeners for custom reporting. In my project, I have multiple testng.xml files: testng-smoke.xml for quick checks on every build, testng-regression.xml for the full nightly suite. I switch between them by passing -DsuiteXmlFile to Maven.
Key Point: testng.xml controls what runs, how it runs, and with what configuration. Use groups, parameters, and multiple XML files for different execution strategies.