Runtime 중에 생성되는 동적 테스트이며, given 안에서 when이 연속적으로 이루어지는 형태를 가진다.
Junit5부터 지원하며, 시나리오 테스트라고 부르기도 한다.
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. 실제 서비스와 같은 흐름으로 테스트를 진행할 수 있다.
시나리오를 테스트
하는 데에 용이하다.
규모가 큰 프로젝트
에서는 각각의 기능에 따라 담당자가 나누어져 있기 때문에 이러한 시나리오 테스트보다는 단위 테스트가 더 필요하고 적합할 것이다.
또한 시나리오 테스트를 하고싶어도 다른 사람이 짠 코드를 같이 테스트 해야하기 때문에 여러가지 걸림돌이 있을 것이다.
하지만규모가 작은 프로젝트
의 경우 개발 인원이 적고, 한 사람이 여러가지 기능을 맡을 것이기 때문에 각 기능을 쪼개서 테스트하는 단위 테스트보다 시나리오 테스트가 더 적합할 수 있다.
Dynamic Test는 @Test 대신에 @TestFactory를 붙여주고, 위에서 언급한 반환타입 중 하나를 반환해주면 된다.
아래는 간단하게 작성해본 회원 테스트 코드이며, 여기서는 DynamicTest Stream을 반환했다.
각 DynamicTest 는 테스트 이름 또는 표시 이름
과 실행 파일
의 두 부분으로 구성된다.
실제 사용자가 서비스를 이용하는 흐름인 가입 -> 로그인 -> 수정 -> 탈퇴 순으로 테스트를 진행했다.
일단 처음 사용해보는 테스트 형태인데도 별로 어렵지 않고 쉬웠다.
mock/stub 처럼 복잡한 테스트 환경 구성이 필요 없었다.
팩토리 메서드 내에서 생성한 데이터를 각각의 테스트 코드에서 재사용할 수 있어서 테스트 데이터를 계속해서 만들 필요가 없었기 때문에 편리했다.
실제 서비스 흐름으로 테스트하기 좋은 방법이라고 생각했다.
각 레이어를 분리하고 단위 테스트를 진행하는 것도 중요하지만, 개발 인원이 적은 프로젝트에서는 내가 구현한 기능들을 다이나믹 테스트로 구현해보는 것도 좋은 방법인 것 같다.