How to make testng.xml at runtime or programmatically

We might face some scenarios where we have to make a testng.xml file at runtime or programmatically. So, in this post, we will learn how to make a testng.xml file at runtime and execute it.

Let’s first create a test case that we want to execute programmatically

package Test;

import org.testng.Assert;
import org.testng.annotations.Test;

public class CodekruTest {

	@Test
	public void executeTest() {
		System.out.println("Excecuting the test");
		Assert.assertTrue(true);
	}
}

We will create a testng.xml file that will help us run the above test case.

<suite name="codekru">
	<test name="codekru">
		<classes>
			<class name="Test.CodekruTest" />
		</classes>
	</test>
</suite>

The above XML file will execute every test case under CodekruTest class.

Output –

Excecuting the test

===============================================
codekru
Total tests run: 1, Failures: 0, Skips: 0
Now, how to create the above XML file programmatically?

We have equivalents of the <suite>, <test>, <class> tags in org.testng package.

  • <suite> is equivalent to XmlSuite class.
  • <test> is equivalent to XmlTest class.
  • <class> is equivalent to XmlClass class.

So, keeping that in mind, and let’s try to make the equivalent of the above XML file, it will look something like this.

		XmlSuite suite = new XmlSuite();
		suite.setName("codekru"); // this means <suite name = "codekru">

		XmlTest test = new XmlTest(suite);
		test.setName("codekru"); // this means <test name = "codekru">
		List<XmlClass> classes = new ArrayList<XmlClass>(); // <classes>
		classes.add(new XmlClass("Test.CodekruTest")); // this means <class name = "Test.CodekruTest">
		test.setXmlClasses(classes);

To execute the suite named “codekru”, we have to make a TestNG object and pass a list of suites to it, as shown below.

		List<XmlSuite> suites = new ArrayList<XmlSuite>();
		suites.add(suite);
		TestNG testng = new TestNG();
		testng.setXmlSuites(suites);
		testng.run();

So, the whole class would be

import java.util.ArrayList;
import java.util.List;

import org.testng.TestNG;
import org.testng.xml.XmlClass;
import org.testng.xml.XmlSuite;
import org.testng.xml.XmlTest;

public class GenerateXmlAndExecuteItAtRuntime {
	
	public static void main(String[] args) {
		XmlSuite suite = new XmlSuite();
		suite.setName("codekru"); // this means <suite name = "codekru">

		XmlTest test = new XmlTest(suite);
		test.setName("codekru"); // this means <test name = "codekru">
		List<XmlClass> classes = new ArrayList<XmlClass>(); // <classes>
		classes.add(new XmlClass("Test.CodekruTest")); // this means <class name = "Test.CodekruTest">
		test.setXmlClasses(classes);

		List<XmlSuite> suites = new ArrayList<XmlSuite>();
		suites.add(suite);
		TestNG testng = new TestNG();
		testng.setXmlSuites(suites);
		testng.run();
	}
}

Now, run this main() method like a standard java application and all test cases under Test.CodekruTest will also execute.

Output –

Excecuting the test

===============================================
codekru
Total tests run: 1, Failures: 0, Skips: 0
===============================================

There are many “What If” scenarios that are left –

Don’t worry. We have covered it all, too. Give it a try in our next post.

We hope that you liked the article. If you have any doubts, please feel free to write us in the comments or mail us at [email protected].

Liked the article? Share this on

Leave a Comment

Your email address will not be published. Required fields are marked *