JUnit5 アノテーション (前後処理、構造化、実行順序)
1. テストの前後で処理を実行する(@BeforeAll, @BeforeEach, @AfterEach, @AfterAll)
@BeforeAll: クラス内のテストが実行される前に一度だけ実行される。
@BeforeEach: クラス内の各テストの前にそれぞれ実行される。
@AfterEach: クラス内の各テストの後にそれぞれ実行される。
@AfterAll: クラス内のテストが実行される後に一度だけ実行される。
使用例:
package test;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class MainTest {
@BeforeAll
public static void beforeAll() {
System.out.println("Before All");
}
@BeforeEach
public void beforeEach() {
System.out.println("Before Each");
}
@AfterEach
public void afterEach() {
System.out.println("After Each");
}
@AfterAll
public static void afterAll() {
System.out.println("After All");
}
@Test
public void test1() {
System.out.println("テスト1");
}
@Test
public void test2() {
System.out.println("テスト2");
}
}
実行結果:
Before All
Before Each
テスト1
After Each
Before Each
テスト2
After Each
After All
2. テストを構造化する(@Nestd)
@Nested: クラス内のテストをサブクラスに分割する。
使用例:
package test;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
public class MainTest {
@Nested
class Nest1{
@Test
public void test1_1() {
System.out.println("テスト1-1");
}
@Test
public void test1_2() {
System.out.println("テスト1-2");
}
}
@Nested
class Nest2{
@Test
public void test2_1() {
System.out.println("テスト2-1");
}
@Test
public void test2_2() {
System.out.println("テスト2-2");
}
}
}
実行結果:
テスト1-1
テスト1-2
テスト2-1
テスト2-2
3. 構造化されたテストクラスのテストの前後で処理を実行する(1と2の組み合わせ)
使用例:
package test;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
public class MainTest {
@BeforeAll
public static void beforeAllInMainTest() {
System.out.println("Before All (MainTest)");
}
@BeforeEach
public void beforeEachInMainTest() {
System.out.println("Before Each (MainTest)");
}
@AfterEach
public void afterEachInMainTest() {
System.out.println("After Each (MainTest)");
}
@AfterAll
public static void afterAllInMainTest() {
System.out.println("After All (MainTest)");
}
@Nested
class Nest1{
@BeforeAll
public static void beforeAllInNest1() {
System.out.println("Before All (Nest1)");
}
@BeforeEach
public void beforeEachInNest1() {
System.out.println("Before Each (Nest1)");
}
@AfterEach
public void afterEachInNest1() {
System.out.println("After Each (Nest1)");
}
@AfterAll
public static void afterAllInNest1() {
System.out.println("After All (Nest1)");
}
@Test
public void test1_1() {
System.out.println("テスト1-1");
}
@Test
public void test1_2() {
System.out.println("テスト1-2");
}
}
@Nested
class Nest2{
@BeforeAll
public static void beforeAllInNest2() {
System.out.println("Before All (Nest2)");
}
@BeforeEach
public void beforeEachInNest2() {
System.out.println("Before Each (Nest2)");
}
@AfterEach
public void afterEachInNest2() {
System.out.println("After Each (Nest2)");
}
@AfterAll
public static void afterAllInNest2() {
System.out.println("After All (Nest2)");
}
@Test
public void test2_1() {
System.out.println("テスト2-1");
}
@Test
public void test2_2() {
System.out.println("テスト2-2");
}
}
}
実行結果:
Before All (MainTest)
Before All (Nest1)
Before Each (MainTest)
Before Each (Nest1)
テスト1-1
After Each (Nest1)
After Each (MainTest)
Before Each (MainTest)
Before Each (Nest1)
テスト1-2
After Each (Nest1)
After Each (MainTest)
After All (Nest1)
Before All (Nest2)
Before Each (MainTest)
Before Each (Nest2)
テスト2-1
After Each (Nest2)
After Each (MainTest)
Before Each (MainTest)
Before Each (Nest2)
テスト2-2
After Each (Nest2)
After Each (MainTest)
After All (Nest2)
After All (MainTest)
4. テストの実行順序を設定する(@TestClassOrder, @TestMethodOrder, @Order)
@TestClassOrder: サブクラスの順番を定義することを宣言する。
@TestMethodOrder: テストメソッドの順番を定義することを宣言する。
@Order: 実際にそのサブクラス・テストメソッドの順番を定義する。
使用例:
package test;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.ClassOrderer;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestClassOrder;
import org.junit.jupiter.api.TestMethodOrder;
@TestClassOrder(ClassOrderer.OrderAnnotation.class)
public class MainTest {
@BeforeAll
public static void beforeAllInMainTest() {
System.out.println("Before All (MainTest)");
}
@BeforeEach
public void beforeEachInMainTest() {
System.out.println("Before Each (MainTest)");
}
@AfterEach
public void afterEachInMainTest() {
System.out.println("After Each (MainTest)");
}
@AfterAll
public static void afterAllInMainTest() {
System.out.println("After All (MainTest)");
}
@Order(2)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@Nested
class Nest1{
@BeforeAll
public static void beforeAllInNest1() {
System.out.println("Before All (Nest1)");
}
@BeforeEach
public void beforeEachInNest1() {
System.out.println("Before Each (Nest1)");
}
@AfterEach
public void afterEachInNest1() {
System.out.println("After Each (Nest1)");
}
@AfterAll
public static void afterAllInNest1() {
System.out.println("After All (Nest1)");
}
@Order(2)
@Test
public void test1_1() {
System.out.println("テスト1-1");
}
@Order(1)
@Test
public void test1_2() {
System.out.println("テスト1-2");
}
}
@Order(1)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@Nested
class Nest2{
@BeforeAll
public static void beforeAllInNest2() {
System.out.println("Before All (Nest2)");
}
@BeforeEach
public void beforeEachInNest2() {
System.out.println("Before Each (Nest2)");
}
@AfterEach
public void afterEachInNest2() {
System.out.println("After Each (Nest2)");
}
@AfterAll
public static void afterAllInNest2() {
System.out.println("After All (Nest2)");
}
@Order(2)
@Test
public void test2_1() {
System.out.println("テスト2-1");
}
@Order(1)
@Test
public void test2_2() {
System.out.println("テスト2-2");
}
}
}
実行結果:
Before All (MainTest)
Before All (Nest2)
Before Each (MainTest)
Before Each (Nest2)
テスト2-2
After Each (Nest2)
After Each (MainTest)
Before Each (MainTest)
Before Each (Nest2)
テスト2-1
After Each (Nest2)
After Each (MainTest)
After All (Nest2)
Before All (Nest1)
Before Each (MainTest)
Before Each (Nest1)
テスト1-2
After Each (Nest1)
After Each (MainTest)
Before Each (MainTest)
Before Each (Nest1)
テスト1-1
After Each (Nest1)
After Each (MainTest)
After All (Nest1)
After All (MainTest)