JUnit 5 테스트 인스턴스, 테스트 실행순서

Chori·2021년 11월 15일
0

JUnit 5

목록 보기
6/6
post-thumbnail

테스트 내 객체와 인스턴스를 만들어 메서드들간에 공유를 할 수 있다.
JUnit의 기본적인 전략으로는 테스트 메서드마다 인스턴스를 새로 만든다.
이렇게 하는 이유는 테스트 메서드를 독립적으로 실행해, 부작용을 막기 위함이다.
그런데, JUnit 5부터는 이 전략을 수정하여 사용할 수 있다.


@TestInstance

@TestInstance(Lifecycle.PER_CLASS)라는 어노테이션을 클래스에 선언하여
하나의 클래스 내에 있는 메서드들 간의 인스턴스를 공유할 수 있다.

@TestInstance(Lifecycle.PER_CLASS) //클래스 마다 인스턴스를 생성하기 때문에, 이 클래스에 있는 모든 메서드가 하나의 인스턴스를 공유하게 된다.
class StudyTest {
	//테스트 간 의존성을 없게 만들어야 한다.
	//의존성이 있을 경우 실행순서에 문제가 생긴다.
	@Test
	void test1_tt_pp() {
		System.out.println(this);
		System.out.println(value++); //결과값 1
		Study actual = new Study(value++);
		assertThat(actual.getLimit()).isGreaterThan(0);
	}
	
	@Test
	void test2_tt_pp() {
		System.out.println(this);
		Study actual = new Study(value++); 
		System.out.println(value++); //결과값 1
	}
    
	@BeforeAll	//모든 test코드가 실행되기 전에 딱 한번 호출된다.
	//static void beforeAll() { //BeforeAll을 구현할 때는 static을 사용해야 한다, 리턴 타입이 존재할 수 없고 void만 가능하다.
	void beforeAll() { //현재 클래스에서 인스턴스를 만들기 때문에, 메서드들이 static일 필요 없다.
		System.out.println("before all");
	}
}

테스트가 실행되는 순서

테스트는 내부적으로 실행되는 순서가 있다.
그러나 내부적 순서에 의존해서는 안된다. 순서는 JUnit 내부 구조에 따라 바뀔 수 있다.
테스트 실행 시 순서가 중요하다면 @TestMethodOrder를 사용해 순서를 지정할 수 있다.

@TestMethodOrder(OrderAnnotation.class)
class StudyTest {

  @Order(2)
  @Test
  @FastTest
  void test1_tt_pp() {
  }

  @Order(1)
  @Test
  @SlowTest
  void test2_tt_pp() {
  }
}

@TestMethodOrder를 선언하고, @Order어노테이션으로 명시적인 순서지정이 가능하다.
단, 스프링의 @Order와 다름으로 주의해야 한다.

단위 테스트는 순서가 중요하지 않다. 의존적이면 안되기 때문이다.
하지만 경우에 따라 순서가 중요할 수 있기 때문에 순서를 별도로 지정할 수 있다.


본 글는 백기선님의 더 자바, 애플리케이션을 테스트하는 다양한 방법을 수강하며 학습한 내용입니다.

profile
꾸준한 성장

0개의 댓글