[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