테스트/0+ JUnit

[JUnit5] JUnit5 기본 어노테이션

힘들면힘을내는쿼카 2023. 5. 4. 22:38
728x90
반응형

[JUnit5] JUnit5 기본 어노테이션

💬 학습에 들어가기에 앞서

요즘 취업 공고를 보면 많은 기업들이 단위 테스트, 통합 테스트 작성 경험을 자격 요건으로 공고를 내놓는 경우가 있습니다.

 

왜 이러한 경험을 요구할까요? 🤔
먼저, 테스트는 에러가 있다는 것은 보여줄 수 있지만,
에러가 없다는 것을 보여줄 수 없습니다.

 

저 역시 에러가 없는 애플리케이션은 존재하지 않는다고 생각합니다.
그러면 모든 에러를 처리할 수 없으니 그냥 방치하는게 좋을까요?
아니라고 생각합니다.
예상할 수 있는 에러는 처리하도록 설계하는 것이 좋다고 생각합니다.
그래서 기업들이 테스트 코드를 작성 경험을 요구하는 것 같습니다.😃

 

또한, 기업의 서비스의 규모가 커지면서 많은 개발자들이 필요하고,
많은 개발자들이 함께 지속 가능한 개발을 하기 위해서는 협업 해야 합니다.
이때 개발자들이 서로 신뢰할 수 있는 간단 명료한 방법 중 하나가 00님이 작성한 기능이 테스트 코드를 통과 했을까?라고 생각합니다.

 

테스트를 읽는 것이 코드를 이해하기 쉽게 한다. 라는 말을 들어보셨나요?
만약 A팀에 새로운 개발자 분이 오셨습니다.
만약 테스트 코드가 있다면 새로온 개발자는 금방 서비스에 적응할 수 있을 것 입니다.

 

결국, 신입 개발자, 기존 개발자들 간에 서로 신뢰하며 서비스를 안정적으로 운영하기 위해서는
테스트 코드를 작성하는 것이 중요하다고 할 수 있습니다…!

 

그래서 저도 서로 신뢰할 수 있는 개발자가 되기 위해서
JUnit을 학습하고 이에 대한 내용을 정리하려고 합니다.^^

JUnit5님은 누구인가요? 🤷🏻‍♂️

 

JUnit5TestEngine API 구현체라고 할 수 있습니다.
즉, 자바 개발자가 가장 많이 사용하는 테스팅 프레임 워크 입니다.

 

JUnit PlatformJVM에서 테스트 프레임 워크를 사용하기 위한 인터페이스(TestEngine API) 입니다.
JUnit JupiterTestEngine API 를 구현한 구현체 입니다.
JUnit VintageJUnit 4, 3을 지원하는 TestEngin API를 구현한 구현체 입니다.

 

  • JUnit
    • JUnit Platform
      • 테스트를 실행해주는 런처 제공함
      • TestEngine API를 제공함
    • JUnit Jupiter
      • TestEngine API 구현체(JUnit5)
    • JUnit Vintage
      • JUnit 4, 3을 지원하는 TestEngine API 구현체

 

참고

JUnit 기본 어노테이션

JUnit에서 사용하는 기본 어노테이션은 다음과 같습니다.

 

실행 어노테이션

  • @Test
    • 단위 테스트 실행
  • @BeforeAll
    • 클래스 내에 모든 단위 테스트 실행 전 1회만 호출
  • @AfterAll
    • 클래스 내에 모든 단위 테스트 실행 후 1회만 호출
  • @BeforEach
    • 각각의 단위 테스트 실행 전 1회씩 호출
  • @AfterEach
    • 각각의 단위 테스트 실행 후 1회씩 호출
  • @Disable
    • 단위 테스트 실행하지 않음

 

import org.junit.jupiter.api.*;

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

class StudyTest {

    @Test
    void create() {
        Study study = new Study();
        System.out.println("테스트 실행");
    }

    @BeforeAll
    static void beforeAll() {
        System.out.println("BeforeAll는 클래스 내에 모든 테스트 실행전 1회만 호출 된다. 반드시 반환 타입을 static void로 작성해야 한다.");
    }

    @AfterAll
    static void afterAll() {
        System.out.println("AfterAll은 클래스 내에 모든 테스트 실행 후 1회만 호출된다. 반드시 반환 타입을 static void로 작성");
    }

    @BeforeEach
    void beforeEach() {
        System.out.println("BeforeEach는 각각의 테스트 실행 전에 1회씩 호출된다.");
    }

    @AfterEach
    void afterEach() {
        System.out.println("AfterEach는 각각의 테스트 실행 후 1회씩 호출된다.");
    }

    @Disabled
    void disabled() {
        System.out.println("Disabled는 테스트를 실행하지 않는다.");
    }
}

 

결과

 

테스트 이름을 설정하는 방법

위 결과를 보시면 create()라는 테스트를 실행 했다고 나옵니다.
create()말고 우리가 테스트 이름을 만들 수 는 없을까요? 🤔
왜냐하면 메소드 이름만으로는 테스트 케이스를 표현하기 어렵습니다..
복잡한 로직이면 메소드 이름이 길어지겠죠?

 

만들 수 있습니다^^!

 

  • @DisplayNameGeneration
    • MethodClass 레퍼런스를 사용해서 사용자가 정의한 테스트 이름을 표기
    • 기본 구현체는 ReplaceUnderscores
    • DisplayNameGenerator의 구현체를 사용하면 됩니다.
      • @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
  • @DisplayName
    • Method에 테스트 이름을 직접 정의하는 방법
      • @DisplayName(“새로운 테스트”)와 같이 사용하면 됩니다.
    • @DisplayNameGeneration 보다 우선 순위가 높음

 

@DisplayNameGeneration

import org.junit.jupiter.api.*;

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

// Method와 Class 레퍼런스를 사용해서 테스트 이름을 표기하는 방법을 설정
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
class StudyTest {

    @Test
    void my_new_test() {
        System.out.println("새로운 테스트 입니다.");
    }
}

 

결과
my_new_test()에서 _를 공백으로 치환하여 my new test 라는 이름의 테스트가 실행되었습니다.

 

@DisplayName

import org.junit.jupiter.api.*;

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

// Method와 Class 레퍼런스를 사용해서 테스트 이름을 표기하는 방법을 설정
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
class StudyTest {

    @Test
      @DisplayName("새로운 테스트")
    void my_new_test() {
        System.out.println("새로운 테스트 입니다.");
    }
}

 

결과
@DisplayName("새로운 테스트”)에서 설정한 새로운 테스트라는 이름으로 테스트가 실행되었습니다.
또한, @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) 보다 우선순위가 높다는 것도 확인할 수 있습니다.^^

참고

728x90
반응형