본문 바로가기

Java&JSP&Spring/Java

[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페이지를 참고 해 주세요

참고 링크

 

Overview (JUnit 5.0.1 API)

Runner and annotations for configuring and executing tests on the JUnit Platform in a JUnit 4 environment.

junit.org

이상으로 간단한 JUnit 5 활용법에 대해서 포스팅해 보았습니다.

728x90
반응형