Java/JavaSpring
JUNIT
펭킹
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),()->"기대값과 같지 않음 ");
}