The real power comes when Maven and testng.xml work together. You define different testng.xml files for different purposes — smoke tests, regression tests, cross-browser tests — and tell Maven which one to run. This is how real projects organize test execution.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="Smoke Test Suite" verbose="1">
<listeners>
<listener class-name="com.testerrank.listeners.AllureListener"/>
<listener class-name="com.testerrank.listeners.RetryListener"/>
</listeners>
<test name="Banking Portal - Smoke">
<groups>
<run>
<include name="smoke"/>
</run>
</groups>
<classes>
<class name="com.testerrank.tests.LoginTest"/>
<class name="com.testerrank.tests.DashboardTest"/>
<class name="com.testerrank.tests.TransferTest"/>
</classes>
</test>
</suite><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="Regression Test Suite" verbose="1" parallel="classes" thread-count="3">
<listeners>
<listener class-name="com.testerrank.listeners.AllureListener"/>
<listener class-name="com.testerrank.listeners.RetryListener"/>
</listeners>
<test name="Banking Portal - Login Module">
<classes>
<class name="com.testerrank.tests.LoginTest"/>
<class name="com.testerrank.tests.ForgotPasswordTest"/>
<class name="com.testerrank.tests.RegistrationTest"/>
</classes>
</test>
<test name="Banking Portal - Transactions">
<classes>
<class name="com.testerrank.tests.TransferTest"/>
<class name="com.testerrank.tests.PaymentTest"/>
<class name="com.testerrank.tests.StatementTest"/>
</classes>
</test>
<test name="Banking Portal - Account Management">
<classes>
<class name="com.testerrank.tests.DashboardTest"/>
<class name="com.testerrank.tests.ProfileTest"/>
<class name="com.testerrank.tests.SettingsTest"/>
</classes>
</test>
</suite><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="Cross-Browser Suite" verbose="1" parallel="tests" thread-count="3">
<test name="Chrome Tests">
<parameter name="browser" value="chrome"/>
<classes>
<class name="com.testerrank.tests.LoginTest"/>
<class name="com.testerrank.tests.TransferTest"/>
</classes>
</test>
<test name="Firefox Tests">
<parameter name="browser" value="firefox"/>
<classes>
<class name="com.testerrank.tests.LoginTest"/>
<class name="com.testerrank.tests.TransferTest"/>
</classes>
</test>
<test name="Edge Tests">
<parameter name="browser" value="edge"/>
<classes>
<class name="com.testerrank.tests.LoginTest"/>
<class name="com.testerrank.tests.TransferTest"/>
</classes>
</test>
</suite><!-- In pom.xml properties section -->
<properties>
<suiteXmlFile>testng.xml</suiteXmlFile> <!-- default suite -->
</properties>
<!-- In Surefire plugin -->
<configuration>
<suiteXmlFiles>
<suiteXmlFile>${suiteXmlFile}</suiteXmlFile>
</suiteXmlFiles>
</configuration># Run smoke tests
mvn clean test -DsuiteXmlFile=testng-smoke.xml
# Run regression tests
mvn clean test -DsuiteXmlFile=testng-regression.xml
# Run cross-browser tests
mvn clean test -DsuiteXmlFile=testng-crossbrowser.xml
# Or use profiles (cleaner)
mvn clean test -Psmoke
mvn clean test -Pregression
mvn clean test -Pchrome,staging,regressionIn real projects, the CI pipeline decides which suite runs. Jenkins runs testng-smoke.xml on every commit (fast, catches critical bugs). Nightly job runs testng-regression.xml (slow, comprehensive). Before release, cross-browser suite runs. Your job is to set this up correctly in pom.xml.
Q: How do you manage multiple test suites with Maven?
A: We create separate testng.xml files for different purposes: testng-smoke.xml for critical path tests (runs on every commit, 10-15 tests, finishes in 5 minutes), testng-regression.xml for full coverage (runs nightly, 200+ tests), and testng-crossbrowser.xml for browser compatibility. In pom.xml, we parameterize the suiteXmlFile property so it can be overridden from the command line: mvn test -DsuiteXmlFile=testng-smoke.xml. We also create Maven profiles for cleaner commands: mvn test -Psmoke. Jenkins jobs are configured with different profile combinations for different stages of the pipeline.
Key Point: Create separate testng.xml files for smoke/regression/cross-browser. Parameterize suiteXmlFile in pom.xml so CI can switch suites via -D or -P flags.