Priority & preserve-order in TestNG: How to Execute Tests in a Custom Order

Print View Mobile View

In our Annotations in TestNG post, we understood that if there are multiple @Test annotations in a single class, they are executed alphabetically based on method name. Thankfully, TestNG provides us a better way to order our test cases rather than following a particular naming convention.

Priority Parameter in TestNG

To sort the execution flow of test cases, we can use the 'priority' parameter. You can assign priority starting ‘0‘ – highest priority, to the number of @Test methods you have. Let’s understand this with an example:

File: Priority.java

package TestNGDemo;

import org.testng.annotations.Test;

public class Priority {

	@Test(priority = 3)

	public void One() {

		System.out.println("Test Case One");

	}

	@Test(priority = 2)

	public void Two() {

		System.out.println("Test Case Two");

	}

	@Test(priority = 1)

	public void Three() {

		System.out.println("Test Case Three");

	}

	@Test(priority = 0)

	public void Four() {

		System.out.println("Test Case Four");

	}

}

If you execute the above code, Four() would be run first and One() will be the last as it has the least priority – ‘3‘.

Note:

  • If multiple @Test methods have the same priority, order falls back to alphabetical sequence.
  • If priority parameter is not specified, by default test cases are assigned ‘0‘.

preserve-order Attribute in TestNG

Now let’s look at a use case where you might actually want to use alphabetical ordering when executing test cases using testng.xml file.

File: A1.java

package TestNGDemo;

import org.testng.annotations.Test;

public class A1 {

	@Test
	public void Test1() {
		System.out.println("Executing Test1");
	}
}

class A2 {
	@Test
	public void Test2() {
		System.out.println("Executing Test2");
	}
}

class A3{

	@Test
	public void Test3() {
		System.out.println("Executing Test3");
	}
}

class A4{

	@Test
	public void Test3() {
		System.out.println("Executing Test4");
	}
}

File: testng.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="PreserveOrderDemo">

	<test name="test-case1">
		<classes>
			<class name="TestNGDemo.A4" />
			<class name="TestNGDemo.A1" />
			<class name="TestNGDemo.A3" />
			<class name="TestNGDemo.A2" />
		</classes>
	</test>

</suite>

As per the default behavior, when you run this suite file, TestNG will run tests in the order they are found. So the output would look like:
preserve-order true in TestNG

Now if you want the classes and methods listed in this file to be run in sorted (alphabetically) order, you just have to set the preserve-order attribute to false in the XML file.

With the preserve-order set false, the output would now appear as:
preserve-order false in TestNG