Showing posts with label order. Show all posts
Showing posts with label order. Show all posts

Monday, 5 July 2021

Junit5: Execute test methods in custom order

By implementing 'org.junit.jupiter.api.MethodOrderer' interface, we can specify the order of execution of test methods.

 

Step 1: Define Custom Order by implementing MethodOrderer interface.

 

MethodNameOrderer.java

package com.sample.app.util;

import java.util.Comparator;

import org.junit.jupiter.api.MethodDescriptor;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.MethodOrdererContext;

public class MethodNameOrderer implements MethodOrderer {
	@Override
	public void orderMethods(MethodOrdererContext context) {
		context.getMethodDescriptors().sort(METHOD_NAME_COMPARATOR);
	}

	private static final Comparator<MethodDescriptor> METHOD_NAME_COMPARATOR = new Comparator<MethodDescriptor>() {

		@Override
		public int compare(MethodDescriptor methodDescriptor1, MethodDescriptor methodDescriptor2) {

			return methodDescriptor1.getMethod().getName().compareTo(methodDescriptor2.getMethod().getName());

		}

	};

}

Step 2: Use ‘MethodNameOrderer’ with @TestMethodOrder annotation to execute the test methods in alphabetical order.

 

MethodNameOrdererDemo.java

package com.sample.app;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;

import com.sample.app.util.MethodNameOrderer;

@TestMethodOrder(MethodNameOrderer.class)
public class MethodNameOrdererDemo {
	@Test
	void A_1() {
		System.out.println("Executing A_1");
	}

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

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

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

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

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

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


Run MethodNameOrdererDemo class, you will see below messages in console.

Executing A
Executing A_1
Executing B
Executing C
Executing D
Executing F
Executing H


You can download complete working application from this link.

https://github.com/harikrishna553/junit5/tree/master/junit5-examples

 

  

Previous                                                    Next                                                    Home

Junit5: TestMethodOrder and Order annotations

In general, unit test are independent. One unit test is not dependent on other unit tests. But there are cases, while writing integration, system tests, order of execution of test methods may matter to you.

 

You can specify the order of test methods using @TestMethodOrder and Order annotations.

 

Example 1: Using @TestMethodOrder and Order annotation.

Annotate your test class or test interface with @TestMethodOrder and specify the desired MethodOrderer implementation. In this example, I am going to use ‘OrderAnnotation’ which execute test methods based on @Order annotation.

 

OrderedTestMethodDemo.java

package com.sample.app;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.junit.jupiter.api.MethodOrderer.OrderAnnotation;
import org.junit.jupiter.api.Order;

@TestMethodOrder(OrderAnnotation.class)
public class OrderedTestMethodDemo {

	@Test
	@Order(1)
	public void loginTest() {
		System.out.println("Executing login test");
	}

	@Test
	@Order(3)
	public void logoutTest() {
		System.out.println("Logged out Successfully!!!!");
	}

	@Test
	@Order(2)
	public void sendMoneyTest() {
		System.out.println("Transferred money");
	}

	@Test
	@Order(3)
	public void receiveReceiptTest() {
		System.out.println("Received receipt");
	}

}

 

Run above class, you will see below messages in console.

Executing login test
Transferred money
Received receipt
Logged out Successfully!!!!

Example 2: Sort test methods alphanumerically.

'org.junit.jupiter.api.MethodOrderer.Alphanumeric' class is used to execute the test methods in alphanumeric order.

 

AlphaNumericOrderedTestMethodDemo.java

package com.sample.app;

import org.junit.jupiter.api.MethodOrderer.Alphanumeric;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;

@TestMethodOrder(Alphanumeric.class)
public class AlphaNumericOrderedTestMethodDemo {

	@Test
	void A_1() {
		System.out.println("Executing A_1");
	}
	
	@Test
	void A() {
		System.out.println("Executing A");
	}

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

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

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

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

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


When you ran above test, you will see below messages in console.

Executing A
Executing A_1
Executing B
Executing C
Executing D
Executing F
Executing H


You can download complete working application from this link.

https://github.com/harikrishna553/junit5/tree/master/junit5-examples

 




 

 

 

Previous                                                    Next                                                    Home

Sunday, 15 March 2020

TestNG: Prioritize test methods execution order

By default test methods execute in alphabetical order of method names.

TestPriority.java
package com.sample.app.tests;

import org.testng.annotations.Test;

public class TestPriority {

 @Test
 public void A() {
  System.out.println("Inside A");
 }

 @Test
 public void B() {
  System.out.println("Inside B");
 }

 @Test
 public void C() {
  System.out.println("Inside C");
 }

 @Test
 public void D() {
  System.out.println("Inside D");
 }

 @Test
 public void E() {
  System.out.println("Inside E");
 }
}

When you ran TestPriority.java, you will see below messages in console.
[RemoteTestNG] detected TestNG version 7.0.0
Inside A
Inside B
Inside C
Inside D
Inside E
PASSED: A
PASSED: B
PASSED: C
PASSED: D
PASSED: E

===============================================
    Default test
    Tests run: 5, Failures: 0, Skips: 0
===============================================


===============================================
Default suite
Total tests run: 5, Passes: 5, Failures: 0, Skips: 0
===============================================

As you see the console messages, methods are executed in the order A -> B -> C -> D -> E.

How can I execute the methods in the order B -> D -> A -> C -> E?
By prioritizing the methods order of execution, you can execute the methods in the order you want.

@Test(priority = 3)
public void C() {
         System.out.println("Inside C");
}

Lower priorities will be scheduled first. If you do not specify the priority, then it is set to 0 by default.

TestPriority.java
package com.sample.app.tests;

import org.testng.annotations.Test;

public class TestPriority {

 @Test(priority = 2)
 public void A() {
  System.out.println("Inside A");
 }

 @Test
 public void B() {
  System.out.println("Inside B");
 }

 @Test(priority = 3)
 public void C() {
  System.out.println("Inside C");
 }

 @Test(priority = 1)
 public void D() {
  System.out.println("Inside D");
 }

 @Test(priority = 4)
 public void E() {
  System.out.println("Inside E");
 }
}

Run TestPriority.java, you will see below messages in console.

[RemoteTestNG] detected TestNG version 7.0.0
Inside B
Inside D
Inside A
Inside C
Inside E
PASSED: B
PASSED: D
PASSED: A
PASSED: C
PASSED: E

===============================================
    Default test
    Tests run: 5, Failures: 0, Skips: 0
===============================================


===============================================
Default suite
Total tests run: 5, Passes: 5, Failures: 0, Skips: 0
===============================================





Previous                                                    Next                                                    Home