본문 바로가기
JAVA

[Java] JUnit5 테스트

by 햄과함께 2020. 12. 10.
320x100

JUnit5

JUnit5는 JUnit Platform, JUnit Jupiter, JUnit Vintage 모듈로 구성된다.

JUnit Platform JVM 기반 테스팅 프레임워크 실행을 위한 기반 모듈.
플랫폼에서 실행되는 테스트 프레임워크 개발을 위한 TestEngine API를 정의(인터페이스).
JUnit4 기반 환경의 플랫폼에서 TestEngine을 실행하기 위한 JUnit4 기반 Runner도 제공.
JUnit Jupiter JUnit 5 버전에서 테스트 코드를 작성하기 위한 프로그래밍 모델, 확장 모델을 지원하는 모듈.
테스트 작성, 확장을 위한 JUnit Jupiter API(junit-jupiter-api)모듈과 테스트 실행을 위한 TestEngine 구현(junit-jupiter-engine) 모듈이 분리되어 있다.
이는 5.4 버전부터 junit-jupiter artifact에서 함께 제공하게 변경되어 의존성 관리를 더 간편하게 할 수 있게 되었다.
JUnit Vintage JUnit 3, JUnit 4 버전으로 작성된 테스트 코드 실행 시 사용되는 모듈


JUnit4와의 차이점

구분 JUnit4 JUnit5
Architecture 단일 jar 3개의 하위 프로젝트
JDK 버전 Java5 이상 Java8 이상

이 외에 어노테이션 이름 변경, 기능 추가.

어노테이션

@Test : 해당 메서드가 테스트 메서드임을 명시함.

@Test
void test() {
    // ...
}

@ParameterizedTest : 매개변수가 있는 테스트 메서드임을 명시함.

@ParameterizedTest
@ValueSource(strings = { "gildong" })
void test(String name) {
    // ...
}

@RepeatedTest : 반복되는 테스트임을 명시함.

@RepeatedTest(3)
void test() {
    // ...
}

@TestFactory : 동적 테스트임을 명시함. 런타임에 생성되는 동적테스트. 그 자체가 테스트라기보다는 테스트 케이스를 위한 팩토리.

@TestFactory
Collection<DynamicTest> dynamicTestsFromCollection() {
      return Arrays.asList(dynamicTest("1st dynamic test", () -> assertEquals(6, 3 * 2)),
                         dynamicTest("2nd dynamic test", () -> assertEquals(4, 2 * 2)));
}

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

 

@TestTemplate : 여러번 호출할 수 있게 설계된 테스트 템플릿.

@TestMethodOrder : 테스트 메서드 실행 순서 명시.

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class HelloJavaTest {

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

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

@TestInstance : 테스트 인스턴스 생명주기를 명시.

@DisplayName : 테스트 클래스나 메서드에 사용자 지정 표기 이름을 명시.

@DisplayNameGeneration : 테스트 클래스에 사용자 지정 표기 이름을 명시.

Standard, Simple, ReplaceUnderScores, IndicativeSentences

import org.junit.jupiter.api.DisplayNameGeneration;
import org.junit.jupiter.api.DisplayNameGenerator;
import org.junit.jupiter.api.Test;

@DisplayNameGeneration(DisplayNameGenerator.IndicativeSentences.class)
class HelloJavaTest {

    @Test
    void aTest() {
    }

}

 

@BeforeAll : 클래스에 있는 모든 테스트 전에 한 번 실행. static 함수로 생성.

@AfterAll : 클래스에 있는 모든 테스트 후에 한 번 실행. static 함수로 생성.

@BeforeEach : 각 테스트 실행 전에 한 번씩 실행

@AfterEach : 각 테스트 실행 후에 한 번씩 실행

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

class HelloJavaTest {

    @BeforeAll
    static void beforeAll() {
        System.out.println("beforeAll");
    }

    @AfterAll
    static void afterAll() {
        System.out.println("afterAll");
    }

    @BeforeEach
    void beforeEach() {
        System.out.println("beforeEach");
    }

    @AfterEach
    void afterEach() {
        System.out.println("afterEach");
    }

    @Test
    void test1() {
        System.out.println("test1");
    }

    @Test
    void test2() {
        System.out.println("test2");
    }

    @Test
    void test3() {
        System.out.println("test3");
    }
}

결과

@Nested : 중첩클래스

@Tag : 클래스나 메서드 수준의 테스트 필터링을 위함.

@Disabled : 테스트 비활성화

@Timeout : 실행시간이 명시한시간보다 초과한다면 테스트 실패.

@ExtendWith : 확장을 선언적으로 등록하는데 사용.

@RegisterExtension : 필드를 통해 프로그래밍 방식으로 확장을 등록하는데 사용.

@TempDir : 임시 디렉토리 제공 시 사용.

 

검증

assertEquals(expect, actual) : 같은지 검증

assertTrue(actual) : true인지 검증

assertFalse(actual) : false인지 검증

assertNull(actual) : null인지 검증

assertNotNull(actual) : null이 아닌지 검증

assertArrayEquals(expect, actual) : 배열 같은지 검증


참고

JUnit5 User Guide

howtodoinjava.com/junit5/junit-5-vs-junit-4/

stackoverflow.com/questions/48448331/difference-between-junit-jupiter-api-and-junit-jupiter-engine/55084036#55084036

www.javaguides.net/2018/07/junit-5-annotations-with-example.html


VS Code Java 개발환경 설정

참고 : Getting Started with Java in VS Code

 

vs code extension 설치하기

- Language Support for Java(TM) by Red Hat

- Debugger for Java

- Java Test Runner

 

Hello.java 파일을 만들면

오른쪽 아래와 같은 에러가 발생한다. 

java extension을 실행하려면 Java 11 이상의 버전이 필요하다.  최신버전의 JDK를 설치해줘라. 넌 아직 이전 버전의 JDK를 쓰고 있다. java.configuration.runtimes 확인해라.

왼쪽에 OpenJDK 11을 선택 후 다운로드한다.

 

File > Preferences > Settings

java.configuration.runtimes 검색. Edit in settings.json 클릭

위와 같이 설치한 jdk 11 경로를 추가한다.

name은 JavaSE-xx 로 해줘야 한다. xx에는 설치한 jdk 버전을 적는다.

public class Hello {
    public static void main(String[] args) {
        System.out.println("hi");
    }
}

java 파일을 위와 같이 만들고 Ctrl + F5로 디버깅하면

제대로 실행되는걸 확인할 수 있다.


InterlliJ JUnit5 테스트환경

Create New Project

Gradle > Java Next.

프로젝트명 작성 후 생성. 

 

mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter

gradle 의존성 정보 확인.

 

버전은 일단은 최신버전! 5.7.0.

// build.gradle

dependencies {
  testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter', version: '5.7.0'
}

test {
  useJUnitPlatform()
}

build.gradle 갱신

public class HelloJava {

    public String getName(String name) {
        return name;
    }
}

입력 문자열을 그대로 리턴하는 getName 함수를 생성.

작성한 함수 위에서 맥 기준 cmd + Shift + T를 누르면 테스트 생성이 가능하다.

Create New Test... 클릭(엔터).

Testing library를 JUnit5로 선택하고 OK.

HelloJavaTest 파일이 자동으로 생성된다.

테스트를 작성한 뒤 왼쪽에 있는 재생버튼을 누르면 해당 테스트가 실행된다.


vs code JUnit5 테스트 환경 설정

vscode extension - Gradle Tasks

$ gradle init --type java-application

테스트를 위한 자바 어플리케이션을 gradle init 명령어로 생성한다.

기타 설정은 모두 디폴트로.

 

// build.gradle

dependencies {
    // ...
    
    // Use JUnit test framework
    testRuntimeOnly("org.junit.platform:junit-platform-launcher:1.7.0")
    testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.7.0")
    testRuntimeOnly("org.junit.vintage:junit-vintage-engine:5.7.0")
}

build.gradle 파일에서 dependencies에 있는 JUnit 버전을 5.7로 변경한다.

생성된 파일들 중 자동으로 생성된 테스트를 한 번 돌려보자.

src/test/java/HelloJUnit/AppTest.java를 연다.

 testAppHasAGreeting 위에 있는 Run Test를 클릭하면 테스트가 돈다.

그리고 V 표를 클릭하면 테스트 결과 리포트를 확인할 수 있다.

왼쪽 아래에서 실패, 성공한 테스트들 수도 확인할 수 있다.

320x100

'JAVA' 카테고리의 다른 글

[Java] 이진검색트리(BST) 구현  (0) 2020.12.19
[Java] 클래스, 객체  (0) 2020.12.19
[Java] 연결리스트(Linked List), Stack, Queue 구현  (0) 2020.12.12
[Java] Github API 통신  (0) 2020.12.11
[Java] 선택문, 반복문  (0) 2020.12.10

댓글