[Java/JUnit5]#2 이클립스에서 JUnit 5 활용하기
안녕하세요 미나라이입니다.
이번 포스팅에서는 JUnit5의 다양한 기능에 대해 활용해 보려고 합니다.
프로젝트 환경
OS : Windows 10
IDE : Eclipse 2021-12 (4.22.0)
JDK : 16.0.2
JRE : JavaSE-14
JUnit : 5.8.1
@Test
테스트 대상 메소드를 지정합니다.
해당 어노테이션이 붙어있는 메소드는 JUnit테스트 대상이 됩니다.
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.*;
@Test
void sumTest() {
System.out.println("> Sum Test");
assertEquals(3, cal.sum(1, 2));
}
@BeforeEach, @AfterEach
테스트 시작 전에 한번씩 실행되는 어노테이션으로
클래스 내부에 @Test어노테이션이 존재하면 그 개수만큼 반복합니다.
private Calculator cal;
@BeforeEach
void setup() {
System.out.println("Instance Setup");
cal = new Calculator();
}
@Test
void sumTest() {
System.out.println("> Sum Test");
assertEquals(3, cal.sum(1, 2));
}
@Test
void subTest() {
System.out.println("> Sub Test");
assertEquals(1, cal.sub(2, 1));
}
@AfterEach
void exit() {
cal = null;
System.out.println("Instance Dispose");
}
콘솔 출력 결과
Instance Setup > Sum Test Instance Dispose Instance Setup > Sub Test Instance Dispose |
@BeforeAll, @AfterAll
테스트 클래스 내부에서 딱 한 번씩만 도는 어노테이션입니다.
private Calculator cal;
@BeforeAll
static void start() {
System.out.println("=== Calc Test Start ===");
}
@BeforeEach
void setup() {
System.out.println("Instance Setup");
cal = new Calculator();
}
@Test
void sumTest() {
System.out.println("> Sum Test");
assertEquals(3, cal.sum(1, 2));
}
@Test
void subTest() {
System.out.println("> Sub Test");
assertEquals(1, cal.sub(2, 1));
}
@AfterEach
void exit() {
cal = null;
System.out.println("Instance Dispose");
}
@AfterAll
static void end() {
System.out.println("=== Calc Test End ===");
}
콘솔 출력 결과
=== Calc Test Start === Instance Setup > Sum Test Instance Dispose Instance Setup > Sub Test Instance Dispose === Calc Test End === |
@DisplayName
이것은 테스트 결과 항목에 별칭을 붙혀주는 작업인데요
Junit5부터 사용 할 수 있게 되었습니다.
@Test
@DisplayName("덧셈")
void sumTest() {
System.out.println("> Sum Test");
assertEquals(3, cal.sum(1, 2));
}
결과 표시
좌측 결과에 덧셈이라고 표시 되어서 출력 된 것을 확인 할 수 있습니다.
@Nested
중첩 클래스라고 해서 클래스 안에 클래스가 들어가있는겁니다.
하나의 클래스 안에서 테스트 항목을 분류 하고 싶을 때 사용합니다.
@Nested
class TestA {
@Test
@DisplayName("덧셈")
void sumTest() {
System.out.println("> Sum Test");
assertEquals(3, cal.sum(1, 2));
}
@Test
@Tag("Sub")
void subTest() {
System.out.println("> Sub Test");
assertEquals(1, cal.sub(2, 1));
}
}
@Nested
class TestB {
@Test
void mulTest() throws InterruptedException {
System.out.println("> Mul Test");
Assertions.assertTimeout(Duration.ofMillis(10),
() -> assertEquals(6, cal.mul(2, 3)));
}
@Test
@Timeout(value = 500, unit = TimeUnit.MILLISECONDS)
void divTest() {
System.out.println("> Div Test");
assertEquals(2, cal.div(4, 2));
}
}
결과 표시
하나의 클래스 안에서 카테고리를 나눈 것을 볼 수 있습니다.
Exception결과 예상 테스트
테스트를 하다보면 에러 결과를 예상해야 하는 경우가 있습니다.
이럴 때 예상되는 에러를 리턴 해 주는 로직을 짤 수 있습니다.
샘플 소스는 나눗셈 로직에서 인자를 0으로 주었을 때 에러가 나는 것을 예상 한 테스트입니다.
@Test
void divTestThrows() {
Exception exception = assertThrows(ArithmeticException.class, () ->
cal.div(1, 0));
assertEquals("/ by zero", exception.getMessage());
// 에러가 나면 테스트 결과가 정상
}
처리 시간 테스트(timeout)
최적화 작업을 하면서 처리 시간이나 이런 부분에 대한 테스틀 진행하는 경우가 있습니다.
이럴 때는 타임아웃 기능을 추가해서 해당 타임(밀리초)이 지나면 테스트 실패를 반환시킬 수 있는 기능이 있습니다.
방법 1
@Test
void mulTest() throws InterruptedException {
System.out.println("> Mul Test");
Assertions.assertTimeout(Duration.ofMillis(10),
() -> assertEquals(6, cal.mul(2, 3)));
}
방법 2
@Test
@Timeout(value = 500, unit = TimeUnit.MILLISECONDS)
void divTest() {
System.out.println("> Div Test");
assertEquals(2, cal.div(4, 2));
}
여러 클래스를 한꺼번에 테스트 하기(@Suite)
단위 테스트를 클래스 단위로 할 때 한꺼번에 진행하는 방법입니다.
일괄 테스트를 위해 AllTests.java를 새로 작성합니다.
※ 새로만들기 - JUnit Test Suite는 JUnit4 기반으로 작성되기 때문에 Junit5는 별도로 작성 해 주어야 합니다..
ClacTest , TextTest , ArrayTest 테스트를 한 번에 진행하기 위해서 SelectClasses로 묶었습니다.
package com.test;
import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;
import org.junit.platform.suite.api.SuiteDisplayName;
@Suite
@SuiteDisplayName("MultiTest")
@SelectClasses({CalcTest.class,
TextTest.class,
ArrayTest.class})
public class AllTests {
}
콘솔 출력 결과
=== Calc Test Start === Instance Setup > Sub Test Instance Dispose Instance Setup > Sum Test Instance Dispose Instance Setup > Mul Test Instance Dispose Instance Setup > Div Test Instance Dispose Instance Setup Instance Dispose Instance Setup > Sum and Sub Test Instance Dispose === Calc Test End === === Text Test Start === Instance Setup > String StartsWith Instance Dispose Instance Setup > String EndsWith Instance Dispose Instance Setup > Object Compare Instance Dispose Instance Setup > String EndsWith Throws Instance Dispose Instance Setup > String Compare Instance Dispose === Text Test End === === Array Test Start === Instance Setup > IntArr Compare Instance Dispose Instance Setup > StrArr Compare Instance Dispose === Array Test End === |
테스트 결과
원하는 부분만 테스트 하기(@Tag,)
테스트를 하다 보면 필요한 부분만 빼서 하고 싶을 때가 있습니다.
이럴 때는 @Tag기능을 이용해서 테스트를 진행할 수 있습니다.
JUnit4에서는 Category를 썻지만 JUnit5가 더 한층 간편해진 느낌이었습니다.
CalcTest.java
부분 테스트를 진행 할 항목에 @Tag를 추가합니다.
@Test
@DisplayName("덧셈")
@Tag("Sum")
void sumTest() {
System.out.println("> Sum Test");
assertEquals(3, cal.sum(1, 2));
}
@Test
@Tag("Sub")
void subTest() {
System.out.println("> Sub Test");
assertEquals(1, cal.sub(2, 1));
}
Tag로 지정한 항목만 테스트 할 경우
테스트 파일 우클릭 - Run As - RunConfiguration을 선택합니다.
여기서 Include and exclude tag의 Configure을 선택합니다.
태그로 지정한 항목만 테스트를 진행하고 싶은 경우 Include Tags에 체크를 넣고 Tag의 이름을 넣습니다.
OK를 누르고 Run을 누릅니다.
콘솔 출력 결과
=== Calc Test Start === Instance Setup > Sub Test Instance Dispose Instance Setup > Sum Test Instance Dispose === Calc Test End === |
테스트 결과
Tag로 지정한 항목만 출력되는 것을 확인할 수 있습니다.
※ Tag로 지정한 부분만 테스트 건너뛰기는 Exclude의 체크를 넣고 추가하면 해당 부분만 건너 뛰고 테스트를 진행 합니다.
그 외 기본적인 assertEquals의 사용법이 있는데 이 부분은 샘플 소스에 올려놓도록 하겠습니다.
샘플 소스 첨부합니다.
자세한 내용은 API페이지를 참고 해 주세요
참고 링크
이상으로 간단한 JUnit 5 활용법에 대해서 포스팅해 보았습니다.
'Java&JSP&Spring > Java' 카테고리의 다른 글
[JAVA]Boolean↔String형변환 예제 (0) | 2022.03.19 |
---|---|
[JAVA]자바의 Call by Value / Call by Reference (0) | 2022.03.13 |
[Java/JUnit5]#1 이클립스에서 JUnit 5 시작하기 (1) | 2021.12.20 |
[Java/JUnit4]#2 이클립스에서 JUnit 4 활용하기 (0) | 2021.12.17 |
[Java/JUnit4]#1 이클립스에서 JUnit 4 시작하기 (0) | 2021.12.17 |