Comprehensive testing framework for Java with annotations, data-driven testing, and parallel execution capabilities
TestNG's XML configuration system provides powerful declarative test orchestration through XML files. This enables complex test suite organization, parameterization, parallel execution, and group management without requiring code changes.
The root configuration class representing a test suite with comprehensive settings for execution behavior, parallel processing, and test organization.
/**
* Root configuration class for TestNG test suites
*/
public class XmlSuite {
// Parallel execution modes
public enum ParallelMode {
TESTS, // Run tests in parallel
METHODS, // Run test methods in parallel
CLASSES, // Run test classes in parallel
INSTANCES, // Run test instances in parallel
NONE // No parallel execution
}
// Configuration failure policies
public enum FailurePolicy {
SKIP, // Skip dependent tests on configuration failure
CONTINUE // Continue with dependent tests on configuration failure
}
// Constructor
public XmlSuite();
public XmlSuite(XmlSuite parent);
// Basic configuration
public void setName(String name);
public String getName();
public void setVerbose(int verbose);
public int getVerbose();
public void setPreserveOrder(boolean preserveOrder);
public boolean getPreserveOrder();
// Parallel execution configuration
public void setParallel(ParallelMode parallel);
public ParallelMode getParallel();
public void setThreadCount(int threadCount);
public int getThreadCount();
public void setDataProviderThreadCount(int dataProviderThreadCount);
public int getDataProviderThreadCount();
public void setTimeOut(String timeOut);
public String getTimeOut();
// Group configuration
public void setGroups(XmlGroups groups);
public XmlGroups getGroups();
// Test management
public void setTests(List<XmlTest> tests);
public List<XmlTest> getTests();
public void addTest(XmlTest test);
// Suite-level parameters
public void setParameters(Map<String, String> parameters);
public Map<String, String> getParameters();
public void addParameter(String name, String value);
public String getParameter(String name);
// Listener configuration
public void setListeners(List<String> listeners);
public List<String> getListeners();
public void addListener(String listener);
// Suite files (for suite-of-suites)
public void setSuiteFiles(List<String> suiteFiles);
public List<String> getSuiteFiles();
public void addSuiteFile(String suiteFile);
// Failure handling
public void setConfigFailurePolicy(FailurePolicy configFailurePolicy);
public FailurePolicy getConfigFailurePolicy();
public void setSkipFailedInvocationCounts(boolean skipFailedInvocationCounts);
public boolean skipFailedInvocationCounts();
// Method selectors
public void setMethodSelectors(List<XmlMethodSelector> methodSelectors);
public List<XmlMethodSelector> getMethodSelectors();
// Object factory
public void setObjectFactory(String objectFactory);
public String getObjectFactory();
// Utility methods
public XmlSuite shallowCopy();
public Object clone();
public void setFileName(String fileName);
public String getFileName();
}Usage Examples:
import org.testng.xml.*;
import java.util.*;
public class XmlSuiteExamples {
public void createBasicSuite() {
// Create a basic test suite
XmlSuite suite = new XmlSuite();
suite.setName("Basic Test Suite");
suite.setVerbose(1);
suite.setPreserveOrder(true);
// Add suite-level parameters
suite.addParameter("environment", "staging");
suite.addParameter("browser", "chrome");
// Create and add a test
XmlTest test = new XmlTest(suite);
test.setName("Smoke Tests");
// Add test classes
XmlClass xmlClass1 = new XmlClass("com.example.LoginTest");
XmlClass xmlClass2 = new XmlClass("com.example.HomePageTest");
test.setXmlClasses(Arrays.asList(xmlClass1, xmlClass2));
suite.addTest(test);
System.out.println("Created suite: " + suite.getName());
}
public void createParallelSuite() {
XmlSuite suite = new XmlSuite();
suite.setName("Parallel Execution Suite");
// Configure parallel execution
suite.setParallel(XmlSuite.ParallelMode.METHODS);
suite.setThreadCount(4);
suite.setDataProviderThreadCount(2);
suite.setTimeOut("300000"); // 5 minutes
// Configure failure handling
suite.setConfigFailurePolicy(XmlSuite.FailurePolicy.CONTINUE);
suite.setSkipFailedInvocationCounts(true);
XmlTest test = new XmlTest(suite);
test.setName("Parallel Test Execution");
test.setParallel(XmlSuite.ParallelMode.METHODS);
test.setThreadCount(2);
suite.addTest(test);
}
public void createSuiteWithGroups() {
XmlSuite suite = new XmlSuite();
suite.setName("Grouped Test Suite");
// Configure groups at suite level
XmlGroups groups = new XmlGroups();
// Run groups
XmlRun run = new XmlRun();
run.onInclude("smoke");
run.onInclude("regression");
groups.setRun(run);
// Group dependencies
XmlDependencies dependencies = new XmlDependencies();
Map<String, String> dependencyMap = new HashMap<>();
dependencyMap.put("regression", "smoke");
dependencies.setDependencies(dependencyMap);
groups.setDependencies(dependencies);
suite.setGroups(groups);
XmlTest test = new XmlTest(suite);
test.setName("Grouped Tests");
suite.addTest(test);
}
public void createSuiteOfSuites() {
// Parent suite that includes other suites
XmlSuite parentSuite = new XmlSuite();
parentSuite.setName("Master Test Suite");
// Add child suite files
parentSuite.addSuiteFile("smoke-tests.xml");
parentSuite.addSuiteFile("regression-tests.xml");
parentSuite.addSuiteFile("integration-tests.xml");
// Configure parallel execution of suites
parentSuite.setParallel(XmlSuite.ParallelMode.TESTS);
parentSuite.setThreadCount(3);
System.out.println("Created suite-of-suites: " + parentSuite.getName());
}
public void createSuiteWithListeners() {
XmlSuite suite = new XmlSuite();
suite.setName("Suite with Listeners");
// Add listeners
suite.addListener("com.example.CustomTestListener");
suite.addListener("com.example.CustomSuiteListener");
suite.addListener("com.example.EmailReporter");
// Set custom object factory
suite.setObjectFactory("com.example.GuiceObjectFactory");
XmlTest test = new XmlTest(suite);
test.setName("Listener Test");
suite.addTest(test);
}
}Represents an individual test within a suite, providing test-specific configuration and class/method selection.
/**
* Configuration class for individual tests within a suite
*/
public class XmlTest {
// Constructor
public XmlTest();
public XmlTest(XmlSuite suite);
// Basic configuration
public void setName(String name);
public String getName();
public void setVerbose(int verbose);
public int getVerbose();
public void setPreserveOrder(boolean preserveOrder);
public boolean getPreserveOrder();
// Suite relationship
public void setSuite(XmlSuite suite);
public XmlSuite getSuite();
// Parallel execution (overrides suite settings)
public void setParallel(XmlSuite.ParallelMode parallel);
public XmlSuite.ParallelMode getParallel();
public void setThreadCount(int threadCount);
public int getThreadCount();
public void setTimeOut(long timeOut);
public long getTimeOut();
// Test-level parameters
public void setParameters(Map<String, String> parameters);
public Map<String, String> getParameters();
public void addParameter(String name, String value);
public String getParameter(String name);
// Class configuration
public void setXmlClasses(List<XmlClass> xmlClasses);
public List<XmlClass> getXmlClasses();
public void addClass(XmlClass xmlClass);
// Package configuration
public void setXmlPackages(List<XmlPackage> xmlPackages);
public List<XmlPackage> getXmlPackages();
public void addPackage(XmlPackage xmlPackage);
// Group configuration (overrides suite groups)
public void setGroups(XmlGroups groups);
public XmlGroups getGroups();
public void setIncludedGroups(List<String> includedGroups);
public List<String> getIncludedGroups();
public void setExcludedGroups(List<String> excludedGroups);
public List<String> getExcludedGroups();
// Method selectors
public void setMethodSelectors(List<XmlMethodSelector> methodSelectors);
public List<XmlMethodSelector> getMethodSelectors();
// Utility methods
public Object clone();
public void setIndex(int index);
public int getIndex();
}Usage Examples:
public class XmlTestExamples {
public void createParameterizedTest() {
XmlSuite suite = new XmlSuite();
suite.setName("Parameterized Suite");
XmlTest test = new XmlTest(suite);
test.setName("Browser Compatibility Test");
// Add test-specific parameters
test.addParameter("browser", "chrome");
test.addParameter("version", "latest");
test.addParameter("platform", "linux");
// Configure classes
XmlClass browserTest = new XmlClass("com.example.BrowserCompatibilityTest");
test.addClass(browserTest);
suite.addTest(test);
}
public void createGroupedTest() {
XmlSuite suite = new XmlSuite();
suite.setName("Grouped Test Suite");
XmlTest smokeTest = new XmlTest(suite);
smokeTest.setName("Smoke Tests");
smokeTest.setIncludedGroups(Arrays.asList("smoke", "critical"));
smokeTest.setExcludedGroups(Arrays.asList("slow", "flaky"));
XmlClass testClass = new XmlClass("com.example.SmokeTest");
smokeTest.addClass(testClass);
XmlTest regressionTest = new XmlTest(suite);
regressionTest.setName("Regression Tests");
regressionTest.setIncludedGroups(Arrays.asList("regression"));
regressionTest.setExcludedGroups(Arrays.asList("manual"));
XmlClass regressionClass = new XmlClass("com.example.RegressionTest");
regressionTest.addClass(regressionClass);
suite.addTest(smokeTest);
suite.addTest(regressionTest);
}
public void createPackageBasedTest() {
XmlSuite suite = new XmlSuite();
suite.setName("Package-based Suite");
XmlTest test = new XmlTest(suite);
test.setName("Package Tests");
// Include entire packages
XmlPackage unitTestPackage = new XmlPackage("com.example.unit.*");
XmlPackage integrationTestPackage = new XmlPackage("com.example.integration.*");
test.addPackage(unitTestPackage);
test.addPackage(integrationTestPackage);
suite.addTest(test);
}
public void createMethodSelectorTest() {
XmlSuite suite = new XmlSuite();
suite.setName("Method Selector Suite");
XmlTest test = new XmlTest(suite);
test.setName("Selective Method Execution");
// Create method selector
XmlMethodSelector methodSelector = new XmlMethodSelector();
methodSelector.setClassName("com.example.CustomMethodSelector");
methodSelector.setPriority(1);
test.setMethodSelectors(Arrays.asList(methodSelector));
suite.addTest(test);
}
}Represents a test class configuration with specific method inclusion/exclusion and parameter settings.
/**
* Configuration class for test classes within a test
*/
public class XmlClass {
// Constructors
public XmlClass();
public XmlClass(String className);
public XmlClass(Class<?> clazz);
// Basic configuration
public void setName(String name);
public String getName();
public void setClass(Class<?> clazz);
public Class<?> getSupportClass();
// Method inclusion/exclusion
public void setIncludedMethods(List<XmlInclude> includedMethods);
public List<XmlInclude> getIncludedMethods();
public void setExcludedMethods(List<String> excludedMethods);
public List<String> getExcludedMethods();
// Parameters
public void setParameters(Map<String, String> parameters);
public Map<String, String> getParameters();
public void addParameter(String name, String value);
// Utility methods
public Object clone();
public void setIndex(int index);
public int getIndex();
}Usage Examples:
public class XmlClassExamples {
public void createSelectiveMethodExecution() {
XmlSuite suite = new XmlSuite();
suite.setName("Selective Method Suite");
XmlTest test = new XmlTest(suite);
test.setName("Specific Methods Only");
XmlClass xmlClass = new XmlClass("com.example.CompleteTestClass");
// Include only specific methods
XmlInclude method1 = new XmlInclude("testCriticalFeature");
XmlInclude method2 = new XmlInclude("testSecurityValidation");
XmlInclude method3 = new XmlInclude("testPerformance");
xmlClass.setIncludedMethods(Arrays.asList(method1, method2, method3));
// Exclude flaky methods
xmlClass.setExcludedMethods(Arrays.asList("testFlakyBehavior", "testUnstableFeature"));
// Add class-specific parameters
xmlClass.addParameter("testData", "critical-data.json");
xmlClass.addParameter("timeout", "30000");
test.addClass(xmlClass);
suite.addTest(test);
}
public void createParameterizedMethodExecution() {
XmlSuite suite = new XmlSuite();
suite.setName("Parameterized Method Suite");
XmlTest test = new XmlTest(suite);
test.setName("Data-Driven Tests");
XmlClass xmlClass = new XmlClass("com.example.DataDrivenTest");
// Include parameterized methods with invocation numbers
XmlInclude parameterizedMethod = new XmlInclude("testWithMultipleDataSets");
parameterizedMethod.setInvocationNumbers(Arrays.asList(0, 2, 4)); // Run only specific data sets
xmlClass.setIncludedMethods(Arrays.asList(parameterizedMethod));
test.addClass(xmlClass);
suite.addTest(test);
}
}Complete XML configuration file examples showing real-world usage patterns.
<!-- Basic TestNG Suite Configuration -->
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="Complete Test Suite" verbose="1" preserve-order="true">
<!-- Suite-level parameters -->
<parameter name="environment" value="staging"/>
<parameter name="browser" value="chrome"/>
<parameter name="timeout" value="30000"/>
<!-- Suite-level listeners -->
<listeners>
<listener class-name="com.example.CustomTestListener"/>
<listener class-name="com.example.EmailReporter"/>
</listeners>
<!-- Group definitions -->
<groups>
<run>
<include name="smoke"/>
<include name="regression"/>
<exclude name="manual"/>
<exclude name="flaky"/>
</run>
<dependencies>
<group name="regression" depends-on="smoke"/>
<group name="integration" depends-on="unit"/>
</dependencies>
</groups>
<!-- Test definitions -->
<test name="Smoke Tests" preserve-order="true">
<parameter name="testType" value="smoke"/>
<groups>
<run>
<include name="smoke"/>
<include name="critical"/>
</run>
</groups>
<classes>
<class name="com.example.LoginTest"/>
<class name="com.example.HomePageTest">
<methods>
<include name="testPageLoad"/>
<include name="testNavigation"/>
<exclude name="testSlowFeature"/>
</methods>
</class>
</classes>
</test>
<test name="Regression Tests" parallel="methods" thread-count="3">
<parameter name="testType" value="regression"/>
<groups>
<run>
<include name="regression"/>
</run>
</groups>
<packages>
<package name="com.example.regression.*"/>
</packages>
</test>
</suite><!-- Parallel Execution Configuration -->
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="Parallel Suite" parallel="methods" thread-count="4"
data-provider-thread-count="2" preserve-order="false">
<parameter name="parallel" value="true"/>
<test name="Parallel Method Execution" parallel="methods" thread-count="2">
<classes>
<class name="com.example.ParallelTest1"/>
<class name="com.example.ParallelTest2"/>
</classes>
</test>
<test name="Parallel Class Execution" parallel="classes" thread-count="2">
<classes>
<class name="com.example.ClassParallelTest1"/>
<class name="com.example.ClassParallelTest2"/>
</classes>
</test>
</suite><!-- Suite of Suites Configuration -->
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="Master Suite" parallel="tests" thread-count="3">
<suite-files>
<suite-file path="smoke-tests.xml"/>
<suite-file path="regression-tests.xml"/>
<suite-file path="integration-tests.xml"/>
</suite-files>
</suite>// Supporting configuration classes
public class XmlGroups {
public void setRun(XmlRun run);
public XmlRun getRun();
public void setDependencies(XmlDependencies dependencies);
public XmlDependencies getDependencies();
}
public class XmlRun {
public void onInclude(String name);
public void onExclude(String name);
public List<String> getIncludes();
public List<String> getExcludes();
}
public class XmlDependencies {
public void setDependencies(Map<String, String> dependencies);
public Map<String, String> getDependencies();
}
public class XmlInclude {
public XmlInclude(String name);
public void setName(String name);
public String getName();
public void setInvocationNumbers(List<Integer> invocationNumbers);
public List<Integer> getInvocationNumbers();
public void setDescription(String description);
public String getDescription();
}
public class XmlPackage {
public XmlPackage(String name);
public void setName(String name);
public String getName();
public void setInclude(List<String> include);
public List<String> getInclude();
public void setExclude(List<String> exclude);
public List<String> getExclude();
}
public class XmlMethodSelector {
public void setClassName(String className);
public String getClassName();
public void setPriority(int priority);
public int getPriority();
public void setScript(XmlScript script);
public XmlScript getScript();
}
public class XmlScript {
public void setLanguage(String language);
public String getLanguage();
public void setScript(String script);
public String getScript();
}Install with Tessl CLI
npx tessl i tessl/maven-org-testng--testng