on
[Java/JUnit5]#2 이클립스에서 JUnit 5 활용하기
[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 활용법에 대해서 포스팅해 보았습니다.
from http://nameybs.tistory.com/48 by ccl(A) rewrite - 2021-12-20 16:27:16