공부방/JAVA

JUnit5을 이용한 테스트코드 작성 방법 - 2편

EVO. 2023. 8. 5. 12:31

JUnit 5: 테스트 반복하기


@RepeatedTest

반복 테스트를 위한 테스트 템플릿 입니다 

다음과 같이 인자로 value는 10을 전달하면 총 10번 테스트를 반복하며 테스트할때 정확히 볼 수 있게 name 인자값도 정할 수 있습니다.

또한 RepetitionInfo라는 클래스를 활용해서 현재 반복 횟수와 총 반복 횟수 등의 정보를 제공합니다 

 

실행 결과


@ParameterizedTest 와 @ValueSource

  • 테스트에 여러 매개변수를 대입해가며 반복 실행할 수 있습니다
  • @ParameterizedTest 를 이용한 파라미터화된 테스트는 하나의 테스트를 각기 다른 인수로 여러 번 실행할 수 있게 합니다
  • 파라미터화 된 테스트를 정의하려면 반드시 하나 이상의 source를 선언해야 합니다 

출력 결과

message = 날씨가
message = 많이
message = 추워지고
message = 있네요

@ValueSource에는 source로 int도 가능합니다

@ValueSource(ints = {10,20,30})

그리고 테스트에서 받을 인자는 source가 int타입이라고 테스트 메서드에서도 int로 받지 않아도 됩니다

JUnit에서는 암묵적 타입 변환도 가능합니다 

어떤 것을 타입 변환을 할 수 있는지 여기서 확인을 하시면 됩니다

https://junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests-argument-conversion-implicit

 

또한 객체로도 타입을 변환 할 수 있습니다

SimpleArgumentConverter 상속받은 구현체를 제공하여 @ConvertWith와 함께 명시적으로 타입을 변환하면 됩니다


@CsvSource

여러 인자를 한번에 받아오는것도 가능합니다

아래 예제와 같은 경우 (10,'자바 스터디') (20,스프링)을 테스트를 했습니다 

실행결과

다음과 같은 방식으로도 바꿀 수 있습니다


JUnit 5 : 테스트 인스턴스


 

문제를 하나 내겠습니다

다음과 같은 테스트 코드가 있습니다

통합 테스트를 진행했을때 각각의 value는 뭐라고 출력이 될까요?

보통 생각을 하면 CalculateTest클래스의 인스턴스를 생성하고 테스트를 진행하니 각각 1,2 로 찍힐 것이라고 예상됩니다

 

실행결과

하지만 예상과 다르게 둘 다 1이 찍힙니다. Calculate클래스의 인스턴스를 생성하고 모든 테스트 메서드를 실행하는데 하나의 인스턴스에서 이 두개의 테스트를 모두 실행하는 것이 아닌 각 테스트마다 새로운 인스턴스를 생성합니다

이는 단위테스트간에 의존성을 줄이려는 전략으로 새롭게 인스턴스를 생성하도록 한 것입니다

 

인스턴스의 주소를 찍어보면 다름을 확인할 수 있습니다

 

 

그런데 JUnit5부터는 이 전략을 바꿀 수 있게 되었습니다. 즉 클래스당 하나의 인스턴스만을 만들어서 공유할 수 있는 방법이 있습니다 


@TestInstance

@TestInstance에 인자로 Lifecycle.PER_CLASS를 전달하면 클래스당 하나의 인스턴스만을 만들 수 있습니다

이는 테스트마다 새로운 인스턴스를 생성하지 않고 오직 하나만의 인스턴스를 생성하기에 성능적인 면에 장점을 보입니다 

 

 

실행결과

 

 

또한 BeforeAll은 모든 테스트 인스턴스에서 딱 한번만 실행되는 메서드 이기에 static 메소드를 붙였어야 했는데 위 전략을 사용하면 클래스마다 하나의 인스턴스만을 만들기 때문에 static을 빼도 됩니다

 

테스트 순서


테스트 순서는 내부 로직에 따라 실행되는데 항상 같은 순서를 반복하지 않습니다 그렇다고 이 로직을 또 공개하지는 않습니다.

왜냐하면 단위테스트간에 의존성이 있어서는 안되기에 순서를 중요하게 생각하지 말라는 JUnit5의 의도가 숨겨져 있습니다. 하지만 경우에 따라서는 원하는 테스트 순서대로 하고 싶을 때가 생깁니다. 예를들어 가입=>로그인=>개인페이지 같이 시나리오 테스트를 할 때 상태 정보를 유지하면서(데이터를 공유하면서) 테스트를 진행해야 하는데 이때 JUnit5에서 순서를 정의할 수 있는 어노테이션이 등장했습니다


@TestMethodOrder

각 테스트마다 Order 어노테이션으로 순서를 부여하며 테스트 순서를 정할 수 있습니다. 이때 Order 어노테이션은 스프링 프레임워크의 @Order가 아니고 test의 @Order이니 구별을 잘 하시길 바랍니다

 

실행결과


출처


https://www.inflearn.com/course/the-java-application-test/dashboard

 

더 자바, 애플리케이션을 테스트하는 다양한 방법 - 인프런 | 강의

자바 프로그래밍 언어를 사용하고 있거나 공부하고 있는 학생 또는 개발자라면 반드시 알아야 하는 애플리케이션을 테스트하는 다양한 방법을 학습합니다., 그냥 개발자를 넘어 '더 나은 개발

www.inflearn.com