목표: JUnit5 를 알아보자

개요

JUnit5는 크게 세 개의 요소로 나누어져있다

  • JUnit 플랫폼
  • JUnit 주피터(Jupiter)
  • JUnit 빈티지(Vintage)

현재 build.gradle 의 dependencies 내에 등록되어있는 jupiter는 JUnit을 실행시키기 위한 모듈이다.

plugins {
    id 'java'
}

group 'org.example'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
}

test {
    useJUnitPlatform()
}

사용법

기본

  • 메소드에 @Test를 붙인다.
  • 메소드의 접근 제어자는 private이면 안된다.

예시

@Test
void helloTest() {
}

검증 메서드

  • Assertions 클래스에서는 assertEquals() 같은 다양한 검증 정적 메서드를 제공한다.
  • assertEquals(expected, actual) expected 값과 actual 값의 순서를 주의해야한다.
    • expected, actual 의미 자체가 헷갈릴 수도 있다.
    • expected: 어떤 행동이 일어난 뒤에 기대되어지는 값이다.
      • a=1; b=1; sum(a, b); 해당 메서드의 기대되어지는 값은? (expected)
      • 2가 expected가 되고 sum(a, b)는 actual이 된다.

fail() 메서드

  • 테스트를 실패 처리한다.
  • assertThrows()assertDoesNotThrow()를 쓰는 게 더 명시적이다.
  • assertThrows()는 발생한 익셉션 객체를 리턴한다. 아래처럼 사용가능하다.
IlegalArgumentException thrown = assertThrows(IllegalArgumentException.class,
    () -> {
        ...
        });
assertTrue(thrown.getMessage().contains("id");

assertXXX 메서드

  • 실패하면 다음 코드를 실행하지 않고 바로 익셉션이 발생한다.
  • 전부 실행후 한번에 보고 싶으면 assertAll()을 사용하면 된다.

라이프 사이클

@BeforeEach and @AfterEach

  1. 테스트 메서드를 포함한 클래스의 객체 생성
  2. (존재하면) @BeforeEach 메서드 실행
  3. @Test 메서드 실행
  4. (존재하면) @AfterEach 메서드 실행

https://github.com/kyupid/tddb/commit/9d29f9c716e853a6b24def9b19aabb63900f4513
위 코드 참고하여 테스트 해보면 테스트 클래스의 객체가 두번 생성되어지는 것을 확인할 수 있다.

@BeforeAll and @AfterAll

모든 테스트 메서드가 실행되기 전이나 후에 수행할 작업을 넣으면 된다.

테스트 독립성

테스트 메서드 간의 실행 순서를 생각하거나 필드를 공유해서는 안된다.

JUnit에서 실행 순서를 지정하는 법을 제공하고 있긴 하지만, 테스트 메서드 간의 의존이 생기면 유지보수가 어려워진다.

한 테스트의 메서드의 결과에 따라 다른 테스트 메서드의 결과가 달라지거나 하면 안되고 독립적이어야한다.

테스트 코드 또한 코드이기 때문에 유지보수에 신경을 써야한다.

profile
TIL 남기는 공간입니다

0개의 댓글