윤개발

JUnit 5 테스트란 무엇이며 어떻게 사용할까? 본문

테스트

JUnit 5 테스트란 무엇이며 어떻게 사용할까?

DEV_SJ 2021. 6. 2. 15:40

해당 포스팅은 JUnit에서 자주 사용하는 가장 기본적인 어노테이션과 기본 테스트를 확인할 수 있습니다.

JUnit 이란?

대부분의 언어는 단위 테스트를 지원하며 이를 xUnit이라고 합니다. 즉 JUnit은 java의 단위테스팅 프레임워크라고 생각하면 됩니다.

JUnit은 테스트를 단순하게 System.out.print를 찍어서 확인하는 것이 아닌 메소드의 값과 결과가 동일한지, 해당 메소드가 기대한 동작을 하는지, 예외상황에서는 예외를 정확하게 반환하는지 등에 대한 테스트를 지원합니다.

@(어노테이션)을 이용해서 손쉽게 만들 수 있고 AssertEquals등을 활용해 코드로써 테스트가 가능합니다. 

 

지원되는 버전

어떤 프레임워크 또는 의존성을 사용하기 위해서는 항상 버전을 확인해야합니다.

JUnit 5는 런타임에 Java 8 이상이 필요합니다. 그러나 이전 버전의 JDK로 컴파일 된 코드는 계속 테스트 할 수 있습니다.

 

워밍업

알아보기 전에 간단하게 Junit 코드를 살펴봅시다.

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

import example.util.Calculator;

import org.junit.jupiter.api.Test;

class MyFirstJUnitJupiterTests {

    private final Calculator calculator = new Calculator();

    @Test
    void addition() {
        assertEquals(2, calculator.add(1, 1));
    }

}

MyFirstJUnitJupiterTests는 Calculator 클래스와 하나의 메소드를 가지고 있습니다.

Calcurator 클래스는 계산을 담당하는 클래스로 보입니다.

addition 메소드는 @Test라는 어노테이션을 달려 있고 내부에는 assertEquals 메소드가 선언되어있습니다.

 

1. 테스트를 실행하면 @Test가 달린 메소드가 실행이 됩니다.

2. 내부의 값 2와 calculator.add(1,1)의 값을 비교하여 Equals하다면 테스트 통과, 다르다면 테스트가 실패됩니다.

 

위에 코드는 JUnit으로써 테스트코드를 작성 할 수 있는 최소의 테스트 단위라고 할 수 있습니다.

이제 활용할 수 있는 어노테이션과 assert 종류에 대해 더 알아봅시다.

 

테스트를 간단하게 하는 Annotations, @

테스트에서 자주 쓰이는 어노테이션에 대해 알아봅시다.

 

@Test

  • 어노테이션이 붙은 메소드를 테스트로 지정합니다.
@Test 
public void test(){}

@DisplayName

  • 테스트 클래스나 테스트 메소드에 이름을 붙여줄 때 사용합니다.
@Test 
@DisplayName("~~를 테스트 하기위한 테스트이다.") 
public void test(){}

@BeforeAll

  • 다른 테스트가 시작하기 전 딱 한 번만 실행 됩니다.
@Test 
@BeforeAll 
public void test(){ 
	log.info("~~ 에 대한 전체 테스트를 시작합니다."); 
}

@BeforeEach

  • 각각 테스트 메소드가 실행되기전에 실행되어야 하는 메소드를 명시해줍니다.
  • 테스트 하기전에 필요한 목업 데이터를 미리 세팅하기 위해 주로 사용합니다.
@Test 
@BeforeEach 
public void test(){ 
	this.testObject = new TestObject(); 
}

@AfterAll

  • 다른 테스트가 완료되고 딱 한 번만 실행 됩니다.

@Test @AfterAll public void test(){ log.info("~~ 에 대한 전체 테스트를 완료하였습니다."); }

@Test 
@AfterAll 
public void test(){ 
	log.info("~~ 에 대한 전체 테스트를 완료하였습니다."); 
}

@AfterEach

  • 각각 테스트 메소드가 실행된 후 실행되어야 하는 메소드를 명시해줍니다.
@Test 
@AfterEach 
public void test(){ 
	this.testObject = null; 
}

 

 

위 4개에 대한 After, Before에 대한 과정은 그림과 같습니다. 이외에도 다양한 어노테이션이 있으니 공식문서에 자세히 나와 있으니 필요한 기능이 있다면 찾아보시기 바랍니다.

 

메소드에서 사용하는 Assert

Assert는 테스트에서 값, 예외상황을 확인할 수 있는 메소드들입니다.

 

assertEquals

가장 많이 쓰이지 않을까 생각해봅니다. 2개의 파라메터를 받아 값이 같은지 비교합니다.

    @Test
    public void isEqualsTest(){
        assertEquals(3, 1+2);
        assertEquals("name", "name");
        assertEquals(Integer.MAX_VALUE,2147483647);
    }

assertTrue

매개변수로 받은 값이 true 값인지 체크합니다.

    @Test
    public void isTrue(){
        assertTrue(true);
    }

 

assertThrows

해당 어노테이션은 개발자가 일부러 예외 상황을 발생시켯을 경우 예외가 잘 발생하는지를 테스트합니다.

    @Test
    public void divideZeroExpectedArithmeticException(){
        assertThrows(ArithmeticException.class, ()->{
            int n = 5/0;
        });
    }

수를 0 으로 나누면 ArithmeticException이 발생하게 됩니다. assertThrows에 지정한 예외 상황과 일치하는 예외가 발생한다면 테스트가 성공한 것입니다.

 

    @Test
    public void arrayIndexExpectedArrayIndexOutOfRange(){
        assertThrows(ArrayIndexOutOfBoundsException.class, ()->{
           int []arr = new int[3];
           int n = arr[5];
        });
    }

마찬가지로 배열을 생성하고 없는 원소에 접근하면 해당 ArrayIndexOutOfBoundsException이 나게되며 테스트가 성공하게 됩니다.

 

마무리

이로써 테스트에 대한 가장 기초적인 내용을 알아보았습니다. 해당 포스팅에서 나온 어노테이션과 메소드로 테스트 커버리지를 100%로 끌어올릴 수는 없습니다. 우리는 Spring, Rest, DB 값 등의 테스트를 동반해야하기 때문입니다. 다음에는 mock 테스트등을 알아보도록 하겠습니다.

 

 

 

참고: https://donghyeon.dev/junit/2021/04/11/JUnit5-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/

참고: https://www.nextree.co.kr/p11104/

참고 : https://junit.org/junit5/docs/current/user-guide/#writing-tests

 

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

 

'테스트' 카테고리의 다른 글

TDD - 테스트 주도 개발 by 켄트 백  (0) 2021.07.02
Test Doubles(테스트 더블) — Dummy, Fakes, Mocks, Spy and Stubs  (0) 2021.07.02
AssertJ  (0) 2021.07.01
Comments