JUnit5 사용하기3

6171 단어 JUnit5JUnit5

1. 테스트 클래스 인스턴스 생성에 대해

1-1. 기본 전략

  • JUnit5는 각 테스트 메서드 마다 새로운 클래스의 인스턴스를 생성한다.
    이게 기본 전략이다. 기본 전략이라는건 전략을 바꿀 수 있다는 의미이기도 하다.

  • 우선 확인해보자

    • 인스턴스의 해시값을 찍어보면 서로 다른 인스턴스라는걸 확인할 수 있다.
  • 왜 이렇게 동작할까?

    • 각 테스트간의 의존성을 제거하기 위해서이다.

    • 만약 이 처럼 동작하지 않는다면 예로 전역변수를 사용한다고 했을 때 각 테스트마다 다른
      변수의 값을 가지고 테스트가 진행될 것이다.

1-2. 전략 변경

  • 클래스에 @TestInstance 어노테이션을 추가해주면된다.
  • TestInstance.Lifecycle.PER_CLASS 를 적용하면 클래스마다 인스턴스를 생성하게 되고
    한 클래스에 있는 테스트들은 같은 인스턴스를 사용한다.
  • 메서드마다 새 인스턴스를 생성하는 TestInstance.Lifecycle.PER_METHOD 전략 (디폴트)
    클래스마다 새 인스턴스를 생성하는 TestInstance.Lifecycle.PER_CLASS 전략이 존재한다.

  • 해시코드를 보면 같은 인스턴스임을 볼 수 있다.

이전에 @BeforeAll, @AfterAll 사용 시 메서드는 static이여야 한다고 했다.
그냥 그려러니 하고 별 생각없이 지나 갔지만 지금 생각해보면 이유를 알 수 있었다.

테스트마다 인스턴스가 생성되기 때문에 @BeforeAll, @AfterAll가 붙은 메서드들이 static하게 쓰이려면 static 키워드가 필요했지만, TestInstance.Lifecycle.PER_CLASS 전략 사용 시 하나의 인스턴스에서 모든 테스트들이 돌아가므로 static일 필요가 없다.


2. 테스트 순서

2-1. 기본 전략

  • 특정한 로직에 따라서 테스트 순서가 정해진다. 따라서 1번을 수행하든 10번을 수행하던 결과를 보면 매번 같은 순서로 실행된 걸 볼 수 있다. 또한 우리가 작성한 테스트 순서대로 수행이 되는것만 같다.
  • 하지만 우리는 그 순서에 의존해서는 절대 안된다. 이 순서는 JUnit 내부 구현 로직에따라 언제든지 바뀔 수 있다.
  • 단위테스트간의 의존성은 없어야 하기 때문에 어떤 테스트를 먼저 하던간에 결과는 바뀌면 안된다. 따라서 순서에 대한 개념이 없다.
  • 그러나 우리가 원하는 순서대로 테스트를 작성하고 싶을 때도 있다. 예로 통합테스트나, Functional 테스트, 시나리오 테스트 와 같은 테스트를 진행할 때 처럼 말이다.

2-2. 원하는 순서로 테스트하기

  • 위에서 적용한 @TestInstance(TestInstance.Lifecycle.PER_CLASS) 전략을 꼭 사용해야하는 건 아니다. 없어도 원하는 순서대로 동작 한다. 상태값을 공유하며 원하는 순서대로 테스트 하고싶을때 추가하면된다.

  • @TestMethodOrder 을 사용하면 된다. 파라미터로 MethodOrder 구현체를 넘겨줘야 하는데 기본적으로 제공되는 구현체들이 있다.

    • DisplayName : displayName 기반으로 정렬한다.
    • MethodName : 메소드 이름으로 정렬한다.
    • OrderAnnotation : @Order 어노테이션에 명시된 순서대로 정렬한다.
    • Random : 랜덤으로 정렬한다.
  • 사용 예시

    • @Order 는 스프링에서도 제공하는 어노테이션이 있다. 사용할 때 주의하자.

    • 숫자가 작을수록 높은 우선순위를 가지며, 따라서 test2가 먼저 실행된 걸 볼 수 있다.


3. JUnit 설정파일 사용하기

3-1. 설정파일 생성

  • 테스트를 위한 설정파일이기 때문에 test 디렉토리 아래 경로에 새 resources 디렉토리를 만들고
    junit-platform.properties 이름으로 파일을 생성하면 된다.

  • 하지만 ide가 아직 해당 경로를 인식하지 못하기 때문에 설정이 필요하다.
  • 생성한 resources 디렉을 선택 후 상단에 Test Resources를 클릭하면 우측에 경로가 추가된다.

3-2. 사용

// 모든 테스트 클래스는 클래스마다 인스턴스 생성하는 per_class 전략 사용
junit.jupiter.testinstance.lifecycle.default = per_class

// @Disabled 무시하고 테스트 실행
junit.jupiter.conditions.deactivate = org.junit.*DisabledCondition

//테스트 이름 표기 전략 설정
junit.jupiter.displayname.generator.default = \org.junit.jupiter.api.DisplayNameGenerator$ReplaceUnderscores
  • 이외에 두 가지정도 기능들이 더 있는데 자세한건 레퍼런스를 참고하자.

4. JUnit5 확장모델

  • JUnit 4의 확장 모델은 @RunWith(Runner), TestRule, MethodRule
  • JUnit 5의 확장 모델은 Extension 하나 뿐이다.
  • 이 부분은 레퍼런스를 참고하고 나중에 필요할 때 다시 봐야겠다.

5. JUnit5 마이그레이션

  • JUnit3, 4로 작성된 테스트들을 JUnit 5의 junit-platform으로 실행 할 수 있게 해주는 기능이다.
  • 사용하기 위해선 junit-vintage-engine 의존성을 추가해야 한다.
  • 이 부분도 마찬가지로 필요할 때 참고하면 될 듯 하다.

Ref

좋은 웹페이지 즐겨찾기