見出し画像

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)

この記事が気に入ったらサポートをしてみませんか?