펭킹 2022. 7. 11. 17:53

JUnit은 테스팅 프레임워크이며 JUnit5는 3가지 모듈로 구성되어있다. 

 - JUnit Platform : 테스팅 프레임워크 구동하기 위한 런처와 테스트 엔진을 위한 API 제공

 - JUnit Jupiter : JUnit5를 위한 테스트 API와 실행 엔진을 제공

 - JUnit Vintage : JUnit 3,4로 작성된 테스트를 JUnit5에서 플랫폼에서 실행하기 위한 모듈 제공

 

의존설정

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.5.2</version>
    <scope>test</scope>
</dependency>

 

테스트할 클래스는 다음과 같다.

 

public class test_case_1 {
	public int sum(int a, int b) {
		return a+b;
	}
}

 

다음 경로에 테스트 클래스를 생성한다.

 

 

JUnit5에서 클래스 생성 시 Public 명령어가 필요 없고, return이 존재하지 않는다.

애노테이션 내용
@DisplayName 테스트 클래스나 테스트 메서드 이름을 붙일 때 사용
기본적으로 테스트 이름은 메서드 이름을 사용
@BeforeEach 각 테스트 메서드가 실행되기 전 실행되어야 되는 메서드 명시
테스트 이전 필요한 데이터 세팅 목적으로 사용
@Test, @RepeatedTest,@ ParameterizedTest, @TestFactory가 붙은 테스트 메서드 실행 전 실행
@AfterEach @Test, @RepeatedTest,@ ParameterizedTest, @TestFactory가 붙은 테스트 메서드 실행 후 실행
@BeforeAll 각 테스트 메서드 마다 실행, 테스트 실행 전 한 번만 실행
메서드는 반드시 static, private과 리턴타입이 존재하면 안됨
@AfterAll 각 테스트 메서드 마다 실행, 테스트 실행 후 한 번만 실행
메서드는 반드시 static, private과 리턴타입이 존재하면 안됨
@Disabled 해당 메서드의 동작을 중지 시킨다.

 

예제에서 사용한 import는 다음과 같다. (필요없는 것은 지우고 사용할 것)

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assumptions.assumingThat;

import java.time.Duration;

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.DisplayName;
import org.junit.jupiter.api.DisplayNameGeneration;
import org.junit.jupiter.api.DisplayNameGenerator;

import chap02.test_case_1;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledOnOs;
import org.junit.jupiter.api.condition.OS;
import org.junit.jupiter.api.Assumptions.*;

 

public class tester_case_2 {
	@Test
	@DisplayName("더하기 함수 테스트 1")
	void test1() {
		test_case_1 t1 = new test_case_1();
		assertEquals(3, t1.sum(1, 2));
		assertNotNull(t1);
		System.out.println("첫번째 메서드");
	}
	
	@Test
	@DisplayName("더하기 함수 테스트 2")
	void test2() {
		System.out.println("두번째 메서드");
	}
	
	@BeforeAll
	static void beforeall() {
		System.out.println("before_all");
	}
	
	@AfterAll
	static void afterall() {
		System.out.println("after_all");
	}
	
	@BeforeEach
	void beforeeach() {
		System.out.println("before_each");
	}
	
	@AfterEach
	void aftereach() {
		System.out.println("after_each");
	}
}

 

콘솔에서 실행결과는 다음과 같다.

 

before_all
before_each
첫번째 메서드
after_each
before_each
두번째 메서드
after_each
after_all

 

 

이때 assertEquals(3, t1.sum(1, 2));함수의 파라미터 값의 앞부분을 4로 바꾸어 오류를 발생시키면 다음과 같이 출력된다.

 

 

오류 발생 이유를 알려준다. (assertEquals는 파라미터를 비교하여 불일치시 false를 반환한다.)

 

Assertion 는 다음과 같은 메서드들이 존재한다.

Assertion 내용
assertEquals(exected,actual) 실제 값이 기대한 값과 같은지 확인
assertNotNull(actual) 값이 null이 아닌지 확인
assertTrue(boolean) 다음 조건이 참인지 확인
assertAll(exectables) 모든 확인 구문 확인
assertThrows(exectedType,executable) 예외 발생 확인
assertTimeout(duration,executable) 특정 시간 안에 실행이 완료되는지 확인

 

람다식을 통해 메세지를 적용할 수 있다.

	@Test
	@DisplayName("더하기 함수 테스트 1")
	void test1() {
		test_case_1 t1 = new test_case_1();
		assertEquals(4, t1.sum(1, 2),()->"기대값과 같지 않음 ");
		System.out.println("첫번째 메서드");
	}

 

한번에 여러개의 오류를 처리하기 위해 assertAll과 람다식을 사용한다.

 

	@Test
	@DisplayName("더하기 함수 테스트 1")
	void test1() {
		test_case_1 t1 = new test_case_1();
		assertAll(
			()->assertEquals(4, t1.sum(1, 2),()->"기대값과 같지 않음"),
			()->assertTrue(t1.getSum()>1,()->"sum값이 1보다 크지 않음")//getSum() 메서드를 test_case_1에 생성
		);
	}

 

애노테이션을 통하여 특정하여 메서드를 사용할 수 있다.

애노테이션 내용
@EnabledOnOs() 특정 운영체제일 경우 실행환경 설정. 올바르지 않은 OS에서 실행시 오류가 아니라 무시됨. 하나 또는 여러개 설정 가능
@DisabledIOnOS() 특정 운영체제는 해당 메서드를 실행하지 않음.
@EnabledOnJre() 특정 Java 버전에서 동작하도록 설정

 

	@Test
	@DisplayName("더하기 함수 테스트 1")
	@EnabledOnOs({OS.WINDOWS})
	void test1() {
		test_case_1 t1 = new test_case_1();
		assertEquals(4, t1.sum(1, 2),()->"기대값과 같지 않음 ");
	}