Execution order of lifecycle methods in JUnit - Build an Automation Script
import org.junit.jupiter.api.*; import java.util.ArrayList; import java.util.List; import static org.junit.jupiter.api.Assertions.*; @TestInstance(TestInstance.Lifecycle.PER_CLASS) public class LifecycleOrderTest { private final List<String> executionOrder = new ArrayList<>(); @BeforeAll void beforeAll() { executionOrder.add("BeforeAll"); } @BeforeEach void beforeEach() { executionOrder.add("BeforeEach"); } @Test void testOne() { executionOrder.add("TestOne"); } @Test void testTwo() { executionOrder.add("TestTwo"); } @AfterEach void afterEach() { executionOrder.add("AfterEach"); } @AfterAll void afterAll() { executionOrder.add("AfterAll"); // Now verify the order // Expected order: // BeforeAll // BeforeEach, TestOne, AfterEach // BeforeEach, TestTwo, AfterEach // AfterAll List<String> expectedOrder = List.of( "BeforeAll", "BeforeEach", "TestOne", "AfterEach", "BeforeEach", "TestTwo", "AfterEach", "AfterAll" ); assertEquals(expectedOrder, executionOrder, "Lifecycle methods did not execute in expected order"); } }
This test class uses JUnit 5 lifecycle annotations to track the order of method execution.
We use a list executionOrder to record each lifecycle method call.
@BeforeAll runs once before all tests, so it adds "BeforeAll" first.
@BeforeEach runs before each test method, so it adds "BeforeEach" before each test.
Each @Test method adds its own name to the list.
@AfterEach runs after each test method, adding "AfterEach".
@AfterAll runs once after all tests, adding "AfterAll" and then asserting the entire order matches the expected sequence.
We use @TestInstance(Lifecycle.PER_CLASS) to allow non-static @BeforeAll and @AfterAll methods for simplicity.
This approach confirms the lifecycle methods execute in the correct order by checking the list contents at the end.
Now add data-driven testing with 3 different test methods to verify lifecycle order for each