본문 바로가기
BackEnd/Java

[Java] JUnit5 애플리케이션을 테스트하는 다양한 방법 이야기 1부 - Assertion

by 뽀뽀이v 2020. 9. 15.

이 글은 백기선 님의 더 자바, 애플리케이션을 테스트하는 다양한 방법 강의를 듣고 복습 차원에서 적은 글입니다.

 

TDD(TEST-Driven Development) 테스트 주도 개발을 하는 곳이 많이 늘어나면서 테스트에 대한 확실한 공부가 필요하다고 생각했다. 자바 개발자가 가장 많이 사용하는 테스팅 프레임워크 JUnit에 대해서 공부하겠다. JUnit은 자바 8 이상 가능한 JUnit5를 중심으로 공부하겠다.

    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }

JUnit5 = JUnit Platform + Jupiter + Vintage

  • Platform : 테스트를 실행해주는 런처 제공, TestEngine API 제공.
  • Jupiter : TestEngine API 구현체로 JUnit5를 제공.
  • Vintage : JUnit4와 3을 지원하는 TestEngin 구현체.

JUnit5 외에는 사용하지 않겠다면 다음과 같이 exclude를 하면 된다.

테스트의 Class와 Method

  • Class : Test method를 포함하는 클래스
  • Test Method : @Test, @RepeatedTest, @ParameterizedTest, @TestFactory, @TestTemplate이 선언되어 있는 메서드
  • Lifecycle Method : @BeforaAll, @AfterAll, @BeforeEach, @AfterEach가 선언되어있는 메서드로 Test의 라이프사이클에 따라 실행되는 메서드 (※실행 순서 : BeforeAll → BeforeEach → Test → AfterEach → AfterAll)
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
class StudyTest {
    // 자바 리플렉션 사용 public 필요 없다.
    @Test
    @DisplayName("스터디 만들기")
    void create() {
        Study study = new Study();
        assertAll(
            () -> assertNotNull(study),
            () -> assertEquals(study.getStudyStatus(), StudyStatus.DRAFT, () -> "스터디를 처음 만들면 상태값이 DRAFT 이다."),
            () -> assertTrue(1 < 2)
        );

        // assertTimeoutPreemptively -> 시간이 지나면 종료
        assertTimeout(Duration.ofMillis(100), () -> {
            new Study();
            Thread.sleep(300);
        });
    }

    @Test
    @DisplayName("스터디 만들기 1")
    void create1() {
        System.out.println("create1");
    }

    @BeforeAll
    @Disabled // 해당 메소드는 Skip 한다.
    static void beforeAll() {
        System.out.println("before All");
    }

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

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

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

JUnit5 : Assertion

  • JUnit5에서 가장 많이 사용하는 구문이다.
  • AssertJ, Hemcrest, Truth 등의 라이브러리를 사용할 수도 있다.
assertEquals(expected, actual) 실제 값이 기대한 값과 같은지 확인
assertNotNull(actual) 값이 null이 아닌지 확인
assertTrue(boolean) 다음 조건이 참(true)인지 확인
assertAll(executables...) 모든 확인 구문 확인
assertThrows(expectedType, executable) 예외 발생 확인
assertTimeout(duration, executable) 특정 시간 안에 실행이 완료되는지 확인

JUnit5 : Assumption, @Enabled___&@Disabled___

  • 특정한 조건을 만족하는 경우 테스트를 실행하는 방법이다.
  • Assumption 메소드는 조건이 만족할 때 그 밑에 있는 코드들이 실행한다.
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
class StudyTest {
    // 자바 리플렉션 사용 public 필요 없다.
    @Test
    @DisplayName("스터디 만들기")
    @EnabledOnJre({JRE.JAVA_8, JRE.JAVA_9}) // Java Version 조건
    @EnabledIfEnvironmentVariable(named = "TEST_EVN", matches = "LOCAL") // 환경변수 값 조건
    void create() {
        Study study =  new Study();
        assumeTrue(study.getStudyStatus().equals("STARTED")); // 조건
        assumingThat(study.getStudyStatus().equals("STARTED"), () -> System.out.println("성공")); // 조건, 테스트
    }

    @Test
    @DisplayName("스터디 만들기 1")
    @DisabledOnOs(OS.WINDOWS) // OS 조건
    void create1() {
        System.out.println("create1");
    }
}

댓글