Backend/Java

Junit5 문법 / 예제 / 활용 방법

가은파파 2021. 1. 16. 00:41

#시작하며

모두가 테스트를 싫어하지만 최근 TDD환경이 트렌드로 되면서 Junit을 활용해 테스트코드를 짜는 개발방식이 중요해졌다.

Test Driven Development (Write test first, then code)

 

#Junit5 라이브러리 활용 방법 (vs code)

1. 아래 jar파일을 받아서 폴더에 저장한다.

mvnrepository.com/artifact/org.junit.platform/junit-platform-console-standalone

 

Maven Repository: org.junit.platform » junit-platform-console-standalone

Module "junit-platform-console-standalone" of JUnit 5. VersionRepositoryUsagesDate1.7.x1.7.0Central1Sep, 20201.7.0-RC1Central 0 Aug, 20201.7.0-M1Central 0 Apr, 20201.6.x1.6.3Central 0 Oct, 20201.6.2Central 0 Apr, 20201.6.1Central 0 Mar, 20201.6.0Central 0

mvnrepository.com

2. 저장된 jar파일의 경로를 Preferences : Open settings (Ctrl + Shift + P)를 통해 settings.json을 찾아서 아래 경로를 세팅한다.

"java.project.referencedLibraies": 부분 추가

#Junit5 특징과 구조

Junit5는 Jupiter / Vintage / EXT(3rd party)의 API로 구성되어 있다. 이 3가지 API가 Platform(Junit engine)에 실행되어 Junit을 사용할 수 있다.

  • Jupiter : Junit5에 새로운 테스트 문법들이 들어 있다.
  • Vintage : Junit4까지 있었던 레거시 문법들을 활용할 수 있다.
  • EXT : 3rd party의 테스트 문법들이 들어있다.

Maven surefire plugin을 활용해 테스트 코드를 실행하여 로컬 서버에서 결과를 볼 수 있다.

# Junit5 문법

[annotaion]

@Test : Junit Engine에게 테스트 java파일임을 알려주는 annotation.

 

@BeforeEach / @AfterEach : 각 @Test 전/후에에 작업을 하여 Duplication작업을 없앨 수 있다.

 

@BeforeAll / @AfterAll :모든 @Test 전/후에 실행된다.

MathUtils mathUtils;

@BeforeAll
static void beforeAllInit(){ //static으로 해야함.
	System.out.prinln("This needs to run before all");
}

@BeforeEach
void init(){ 
	mathUtils = new MathUtils();
}

@AfterEach
void cleanUp(){ 
	System.out.prinln("Cleaning up");
}

@DisplayName : Junit 테스트 제목이름을 다르게 보여준다.

@Disabled : 해당 케이스를 Skip한다

@Test
@Disabled
@DisplayName("TDD method. Should not run")
void testDisabled(){
	fail("This test should be disabled");
}

@Enabled 와 @Disabled 조건에 따른 다양한 어노테이션.

@DisabledOnOs / @EnabledOnOs

@DisabledOnJre / @EnabledOnJre

@DisabledIfSystemProperty / @EnabledIfSystemProperty

@DisabledIfEnvironmentVariable / @EnabledIfEnvironmentVariable

@DisabledIfSystemProperty and @EnabledIfSystemProperty,

 

@Nested : 케이스의 종류와 크기가 늘어나면서 그룹핑이나 organize가 필요한 경우 사용한다.

 

@RepeatedTest : 테스트 횟수를 늘릴 수 있다.

 

@Tag : 테스트의 종류마다 remark를 남길 수 있다.

 

[Assertions]

assertEquals(expected, actual);

- expected와 actual값이 맞는지 비교할 수 있은 테스트 문법

- assertArrayEquals, assertIterableEquals를 활용해 배열과 Collection 자료형도 비교가 가능하다.

- assertAll을 활용해 한번에 여러 케이스를 테스트 할 수 있다.

Asserting exceptions with assertThrows

@Test
void testDivide(){
	MathUtils mathUtils = new MathUtils();
    assertThrows(ArithmeticException.class, ()-> mathUtils.divide(1,0));
	         //예상되는 Exception을 적는다  //해당 매소드를 실행
}

[Assumtion]

assumeTrue(boolean value);

- value라고 assume하고 테스트한다.

 

[TestInfo and TestReporter]

- init()에 TestInfo객체를 생성해 놓고, logging활용에 좋음

 

[Stateful한 테스트 코드]

@TestInstance 를 활용하여 Stateful한 테스트 코드를 작성한다.

package test;

import org.junit.Test;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.TestMethodOrder;

@TestInstance(TestInstance.Lifecycle.PER_CLASS);
@TestMethodOrder(MethodOrderer.OrderAnnotation.class);
public class StatefulTest {

    private int number;

    @Test @Order(1)
    void test1(){
        System.out.println(number++);
    }

    @Test @Order(2)
    void test2(){
        System.out.println(number++);
    }
    
}