[Spring] Dynamic Test 도입

bagt13·2022년 10월 11일
0

Spring

목록 보기
9/11

Dynamic Test란?

Runtime 중에 생성되는 동적 테스트이며, given 안에서 when이 연속적으로 이루어지는 형태를 가진다.

Junit5부터 지원하며, 시나리오 테스트라고 부르기도 한다.


Dynamic Test의 특징

1. 다이나믹 테스트는 Runtime 시점에 생성된다.

일반적으로 사용되는 @Test를 이용한 테스트컴파일 시점에 완전히 지정되는 정적 테스트이다. 이는 동적인 기능에 대한 기본 테스트 형태를 제공하지만, 그 표현이 컴파일 시점에 제한된다는 한계를 가지고 있다.

이에 비해 다이나믹 테스트는 런타임 동안에 테스트가 생성되고 수행되기 때문에, 프로그램이 수행되는 도중에도 동작을 변경할 수 있는 특징이 있다.


2. 테스트 결과 데이터를 공유할 수 있기 때문에, 연속성 있는 테스트를 작성할 수 있다.

테스트가 동적으로 생성/수행되기 때문에 여러 dynamicTest에서 테스트 데이터를 공유할 수 있고, 연송성 있는 테스트를 작성할 수 있게 된다.


3. Dynamic Test는 @TestFactory 주석이 달린 팩토리 메소드에 의해 생성된다.

위는 @TestFactory에 들어가면 나오는 설명인데, 하나씩 살펴보면 아래와 같은 내용이다.

  • @TestFactory 어노테이션은 test factory 메서드임을 명시하기 위해 사용되며,

  • @Test 어노테이션과 다르게 테스트 케이스 자체가 아니라 테스트 케이스들을 위한 factory이며,

  • @TestFactory 메서드는 private 또는 static 이어서는 안되고 Stream, Collection, Iterable, Iterator 또는 DynamicNode로 이루어진 배열을 반환해야 하며,

  • DynamicNode로 사용될 수 있는 하위 클래스에는 DynamicContainer와 DynamicTest가 있다.


또한 컴파일 시점에 유효하지 않은 반환 유형을 감지할 수 없기 때문에, 다른 형태로 반환하면 JUnitException 이 발생한다는 특징이 있다.


4. JUnit의 생명주기 콜백 함수를 사용할 수 없다.

Dynamic Test는 JUnit의 생명주기 콜백 함수를 지원하지 않는다. 따라서 @BeforeEach@AfterEach와 같은 테스트 생명 주기와 관련된 요소들을 사용할 수 없다.


5. 실제 서비스와 같은 흐름으로 테스트를 진행할 수 있다.

  • 단위 테스트의 경우 하나의 Layer 또는 각 기능을 테스트 하는데 중점을 둔다면, 다이나믹 테스트는 실제 유저가 서비스를 이용하는 시나리오를 테스트하는 데에 용이하다.

규모가 큰 프로젝트에서는 각각의 기능에 따라 담당자가 나누어져 있기 때문에 이러한 시나리오 테스트보다는 단위 테스트가 더 필요하고 적합할 것이다.
또한 시나리오 테스트를 하고싶어도 다른 사람이 짠 코드를 같이 테스트 해야하기 때문에 여러가지 걸림돌이 있을 것이다.

하지만 규모가 작은 프로젝트의 경우 개발 인원이 적고, 한 사람이 여러가지 기능을 맡을 것이기 때문에 각 기능을 쪼개서 테스트하는 단위 테스트보다 시나리오 테스트가 더 적합할 수 있다.



Dynamic Test 적용해보기

Dynamic Test는 @Test 대신에 @TestFactory를 붙여주고, 위에서 언급한 반환타입 중 하나를 반환해주면 된다.

아래는 간단하게 작성해본 회원 테스트 코드이며, 여기서는 DynamicTest Stream을 반환했다.

각 DynamicTest 는 테스트 이름 또는 표시 이름실행 파일의 두 부분으로 구성된다.
실제 사용자가 서비스를 이용하는 흐름인 가입 -> 로그인 -> 수정 -> 탈퇴 순으로 테스트를 진행했다.



느낀 점

  • 일단 처음 사용해보는 테스트 형태인데도 별로 어렵지 않고 쉬웠다.

  • mock/stub 처럼 복잡한 테스트 환경 구성이 필요 없었다.

  • 팩토리 메서드 내에서 생성한 데이터를 각각의 테스트 코드에서 재사용할 수 있어서 테스트 데이터를 계속해서 만들 필요가 없었기 때문에 편리했다.

  • 실제 서비스 흐름으로 테스트하기 좋은 방법이라고 생각했다.

각 레이어를 분리하고 단위 테스트를 진행하는 것도 중요하지만, 개발 인원이 적은 프로젝트에서는 내가 구현한 기능들을 다이나믹 테스트로 구현해보는 것도 좋은 방법인 것 같다.

profile
주니어 백엔드 개발자입니다😄

0개의 댓글