Develop/java,spring

Junit5 가이드

kudl 2020. 11. 5. 16:34
Maven Dependencies

https://mvnrepository.com/artifact/org.junit/junit5-engine/5.0.0-ALPHA

@AssertAll

assertAll()은 모든 검증을 수행한다. 오류가 발생하더라도 검증을 모두 수행하고 오류가 발생한 검증들에 대해 결과를 출력한다.

assertTrue(), assertFalse()... 여러개의 assert문을 작성시 오류가 발생하면 오류 이후의 assert 문이 수행 안되는것과 차이가 있다.

 

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertEquals;

@SpringBootTest
public class AssertAllTest {

	@Test
	void assertAllTest() {
		String hello = "Hello";
		String world = "World";
		assertAll("headingV1",
				() -> assertEquals("Hello", hello),
				() -> assertEquals("Hello", hello),
				() -> {
					assertAll("headingV2",
							() -> assertEquals("World", world),
							() -> assertEquals("World", world)
					);
		});
	}
}

 

@EnabledOnOs, @DisabledOnOs, @EnabledOnJre, @DisabledOnJre, @EnabledIfSystemProperty, @DisabledIfSystemProperty

@EnabledOnOs : 특정 OS 에서 검증한다.

@DisabledOnOs : 특정 OS 에서는 검증을 하지 않는다.

@EnabledOnJre : 해당 버전에서 검증한다.

@DisabledOnJre : 해당 버전에서는 검증을 하지 않는다.

@EnabledIfSystemProperty : System Property가 있을 경우 검증한다.

@DisabledIfSystemProperty : System Property가 있을 경우 검증을 하지 않는다.

 

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.*;
import org.springframework.boot.test.context.SpringBootTest;

import static org.junit.jupiter.api.condition.JRE.JAVA_8;
import static org.junit.jupiter.api.condition.OS.*;

@SpringBootTest
public class ConditionTest {

	@Test
	@EnabledOnOs({MAC, LINUX})
	public void enable_Mac_Linux() {
		System.out.println("Mac and Linux");
	}

	@Test
	@DisabledOnOs({WINDOWS, MAC})
	public void disable_Windows_MAC() {
		System.out.println("Windows And Mac");
	}

	@Test
	@EnabledOnJre(JAVA_8)
	public void enable_Java8() {
		System.out.println("Java 8");
	}

	@Test
	@EnabledIfSystemProperty(named = "os.arch", matches = ".*64.*")
	void only64bit() {
	}

	@Test
	@DisabledIfSystemProperty(named = "test", matches = "true")
	void onlyTestProperty() {
	}
}

 

Exception 테스트

기존 Exception 테스트는 특정 에러에 대해서만 가능했지만 Junit 5 에서는 특정 에러가 발생 할때 메세지까지 검증이 가능하다.

 

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;

@SpringBootTest
public class ExceptionTest {

	@Test
	@DisplayName("NullPoint Exception")
	void nullPointException() {
		Throwable e = assertThrows(NullPointerException.class, () -> {
			throw new NullPointerException("Object Null Error");
		});
		assertEquals("Object Null Error", e.getMessage());
	}
}

 

Nested 테스트

@BeforeAll, @AfterAll

  • static 메서드 이어야 한다.
  • @Test 메서드 보다 전/후로 실행된다.

 

import org.junit.jupiter.api.*;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class NestedTest {

	@BeforeAll
	public static void beforeAll() {
		System.out.println("Foo beforeAll");
	}

	@AfterAll
	public static void afterAll() {
		System.out.println("Foo afterAll");
	}

	@BeforeEach
	public void beforeEach() {
		System.out.println("Foo beforeEach");
	}

	@AfterEach
	public void afterEach() {
		System.out.println("Foo afterEach");
	}

	@Test
	public void test() {
		System.out.println("Foo test");
	}

	@Nested
	public class Bar {
		@BeforeEach
		public void beforeEach() {
			System.out.println("Bar beforeEach");
		}

		@AfterEach
		public void afterEach() {
			System.out.println("Bar afterEach");
		}

		@Test
		public void test() {
			System.out.println("Bar Test");
		}
	}
}
// 실행 결과
Foo beforeEach
Bar beforeEach
Bar Test
Bar afterEach
Foo afterEach
Foo afterAll

 

@ParameterizedTest

하나의 테스트 메서드로 여러개의 파라미터를 사용하여 테스트가 가능하다.

 

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class ParameterTest {

	@ParameterizedTest
	@CsvSource({"1, 2", "3, 4"})
	void parameterTest(int i, int j) {
		System.out.println("ParameterTest ==> " + i + " :: " + j);
	}
}

 

Timeout Test

테스트 코드의 시간 초과, 시간 준수에 대해 검증이 가능하다.

 

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import static java.time.Duration.ofMillis;
import static java.time.Duration.ofMinutes;
import static org.junit.jupiter.api.Assertions.assertTimeout;

@SpringBootTest
public class TimeoutTest {

	@Test
	void timeoutNotExceeded() {
		assertTimeout(ofMinutes(2), () -> Thread.sleep(10));
	}

	@Test
	@DisplayName("시간 초과로 테스트가 실패한다.")
	void timeoutExceeded() {
		assertTimeout(ofMillis(10), () -> Thread.sleep(100));
	}
}

'Develop > java,spring' 카테고리의 다른 글

Intellij 단축키  (0) 2020.11.12
QueryDsl 설정부터 사용해보기  (0) 2020.11.12
application.properties 설정 목록  (0) 2020.11.04
MSA(Micro Service architecture)  (0) 2020.11.04
비동기  (0) 2020.11.04