tools & libs/단위테스트(junit, spock)

[junit] jupiter 1. 기본 설정 및 활용

  • -
반응형

이번 포스트에서는 단위테스트 자동화를 위한 junit에 대해서 살펴보자.

JUnit 5 User Guide

 

JUnit 5 User Guide

Although the JUnit Jupiter programming model and extension model will not support JUnit 4 features such as Rules and Runners natively, it is not expected that source code maintainers will need to update all of their existing tests, test extensions, and cus

junit.org

 

테스트 자동화와 JUnit

 

테스트와 자동화 필요성

테스트의 중요성은 프로그래밍 분야에서 언제나 강조되는 내용이다. 애플리케이션 개발 과정에서 테스트가 잘 이뤄지지 않은 경우는 호미로 막을 것을 가래로 막는 일이 발생할 수 있다.

다음처럼 나름 복잡한 메서드를 가진 Calculator 클래스를 생각해 보자.

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }

    public int divide(int a, int b) {
        return a / b;
    }
}

 

일반적으로 이 코드가 잘 동작하는지 확인하려면 호출해서 결과를 출력해 보게 된다.

public static void main(String[] args) {
  Calculator calculator = new Calculator();
  int result = calculator.add(10, 20);
  System.out.println(result);             // 결과가 30이군!
  
  result = calculator.divide(100, 20);
  System.out.println(result);             // 결과가 5군!
}

문제는 테스트 실행 결괏값을 텍스트로 확인해야 하고 또 시간이 지나면 결괏값이 무엇을 의미하는지 소스 코드를 분석해야 알 수가 있다. 즉 테스트 과정에서 시간이 너무 많이 걸리게 되고 자동화가 어렵다. 결과적으로 테스트를 등한시하게 된다. 이를 개선해서 테스트를 자동화하기 위한 도구가 JUnit이다.

 

JUnit을 이용한 테스트 자동화

junit은 특정 입력에 대한 기댓값을 미리 작성해 두고 동작의 결과를 시각적으로 알려준다. 따라서 매번 텍스트를 읽어서 동작 여부를 파악할 필요도 없고 테스트 케이스를 기억할 필요도 없어진다.

 

3을 기대했는데 결과도 3이면 성공!! 퇴근!!
4를 기대했지만 실제 값은 3이라면 실패!! 야근 ㅠㅠ

 

기본 annotation

 

life cycle annotation

JUnit은 여러 annotation으로 테스트의 라이프사이클을 정의하는데 @Test와 @BeforeAll, @AfterAll, @BeforeEach, @AfterEach가 있다.

annotation description
@Test  단위테스트를 통해서 확인하고 싶은 내용을 assert 계열의 메서드를 통해 검증하는 메서드 정의
@BeforeEach, @AfterEach 각각의 @Test 전/후에 공통적으로 처리할 사전/사후 작업 메서드 정의
@BeforeAll, @AfterAll 모든 @Test에 거쳐 한번 만 필요한 사전/사후 작업 메서드 정의. static 메서드에 작성

 

@DisplayName

@Test가 선언된 메서드의 검증 내용(목적)을 메서드 이름으로 사용하면 나중에 테스트 내용을 이해하기 용이하다. 하지만 메서드의 이름은 자바의 naming rule 상 필요한 내용을 작성하기에 한계가 많다.  이런 경우 @DisplayName을 이용하면 문자열 형태로 테스트 내용을 작성할 수 있다.

@Test
public void 두수를더해서나오는합을검증() {
  Calculator calculator = new Calculator();
  int result = calculator.add(1, 2);
  assertEquals(3, result);
}
@Test
@DisplayName("두 수의 합을 검증:예) 1+2=3")
public void addTest2() {
  Calculator calculator = new Calculator();
  int result = calculator.add(1, 2);
  assertEquals(4, result);
}

 

간단한 단위테스트

 

기본 설정

junit을 사용하기 위해서는 여러 가지 의존성이 필요한데 Junit Jupiter (Aggretator)를 사용하면 한 번에 다 가져올 수 있다.

Attregator는 junit-jupiter-api, junit-jupiter-params, junit-jupiter-engine을 포함한다.

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.10.1</version>
    <scope>test</scope>
</dependency>

위 라이브러리는 scope가 test로 설정되어 있으므로 maven을 사용 중이라면src/test/java에 테스트 코드를 작성해야 한다.

 

활용 예

테스트 코드의 작성 위치는 src/test/java로 한다.

import static org.junit.jupiter.api.Assertions.assertEquals;

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.Test;

import com.doding.mvntest.Calculator;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class CalculatorTest {
    @Test
    public void 두수를더해서나오는합을검증() {
        Calculator calculator = new Calculator();
        int result = calculator.add(1, 2);
        assertEquals(3, result);
    }

    @Test
    @DisplayName("두 수를 더해서 나오는 합을 검증: 1+2=3")

    public void addTest2() {
        Calculator calculator = new Calculator();
        int result = calculator.add(1, 2);
        assertEquals(4, result);
    }

    @BeforeAll
    static void setupBeforeAll() {
        log.debug("전체 테스트 진행 전 한번");
    }

    @AfterAll
    static void tearDownAfterAll() {
        log.debug("전체 테스트 진행 후 한번");
    }

    @BeforeEach
    void setupBeforeEach() {
        log.debug("매번 테스트 진행 전에 한번");
    }

    @AfterEach
    void tearDownAfterEach() {
        log.debug("매번 테스트 진행 후에 한번");
    }
}

Primary Side Bar에서 [Test]를 선택하면 해당 프로젝트의 모든 테스트 내용을 한눈에 확인할 수 있다.

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.