JAVA/JUnit
[JUnit5] Extension
테스트를 진행하면서, 추가적인 기능을 부여해야 하는 경우가 종종 있습니다. 이런 기능을 하는 모델들을 확장 모델(Extension Model)이라고 합니다. JUnit4에서 사용했던 Runner, TestRule, MethodRule들이 JUnit5가 되면서 Extension API로 통일되었습니다. Extension 생성 - Lifecycle 사용하려는 케이스에 따라 Extension의 생성 방식 달라집니다. 자세한 내용은 SpringExtension.class를 살펴보시면 됩니다. 먼저 생명 주기를 기준으로 나누어보겠습니다. 생명 주기에 따라 사용되는 Extension이 다릅니다. 크게 범위를 보자면 다음과 같습니다. 실행 순서대로 설명하겠습니다. 1st. TestInstanceFactory 테스트 ..
[JUnit5] 병렬 실행
시작하기 앞서 아직까지는 JUnit Team에서 실험적인 기능이라 공표하였기 때문에 정식으로 릴리즈 되면 사용하는 것을 추천합니다. 기존의 JUnit 실행은 단일 스레드에서 순차적으로 실행됩니다. 이 기능을 사용하려면 다음 장을 확인하시면 됩니다. 사용 방법 1st. 활성화 junit-platform.properties에서 'junit.jupiter.execution.parallel.enabled = true'로 설정하면 기본적인 활성화가 됩니다. 2nd. 제어 모드 설정 첫 번째 과정을 거쳐도 아직까지는 단일 스레드 - 순차 실행이 유지됩니다. 추가적으로 모드를 설정해 병렬 실행으로 변경해야 합니다. 실행 모드는 총 두 가지가 있으며 디폴트 값은 SAME_THREAD입니다. SAME_THREAD 해당 ..
[JUnit5] Dynamic Test - @TestFactory
동적 테스트 Jupiter에는 기존에 사용하던 @Test를 통한 표준 테스트 외에도 새로운 종류의 테스트 프로그래밍 모델이 생겼습니다. 이것은 바로 @TestFactory 어노테이션이 달린 팩토리 메서드에 의해 런타임 시 생성되는 동적 테스트입니다. 동적 테스트의 실행 파일은 함수형 인터페이스 @FunctionalInterface입니다. 즉, 람다 및 메서드 참조를 사용할 수 있습니다! @TestFactory? 기존의 @Test와 달리 @TestFactory 메서드는 테스트 케이스 자체가 아니라, 테스트 케이스를 위한 팩토리 메서드입니다. 그렇기 때문에 이 메서드의 결과는 단일 DynamicNode나 DynamicNode 인스턴스의 [배열, Stream, Collection, Iterable, Itera..
[JUnit5] 테스트 작성(8) - 반복 테스트 (@ParameterizedTest)
@ParameterizedTest @ParameterizedTest를 사용하면 단순히 같은 내용을 반복하는 것이 아닌 여러 파라미터들을 입력해가며 실행할 수 있습니다. @ParameterizedTest는 @RepeatedTest와 같이 name 속성을 이용해서 Test UI에 어떻게 표현할지 나타낼 수 있습니다. 참고로 @RepeatedTest에서의 currentRepetition은 @ParameterizedTest에서 index로 대체됩니다. 예시 : @ValueSource 선언 // [current] message="value"로 표기 @DisplayName("ValueSource를 이용한 파라미터 입력") @ParameterizedTest @ValueSource(strings = { "ValueSo..
[JUnit5] 테스트 작성(7) - 반복 테스트 (@RepeatedTest)
Jupiter는 @RepeatedTest를 통해 원하는 만큼 테스트를 반복하는 기능을 제공합니다. 반복되는 각 테스트들은 @Test와 같이 작동합니다. @RepeatedTest(10) @Test void repeatTest1(){ System.out.println("test"); } 이 반복 테스트에 시너지를 내 줄 몇몇 @RepeatedTest 속성들이 있습니다. name 속성 기본적으로 JUnit에서는 반복 시 해당 테스트가 몇 번째 테스트인지와 같은 기본적인 정보를 시각적으로 제공합니다. 만약 이를 다르게 표기하고 싶다면, name 속성에 파라미터들을 동적으로 입력하시면 됩니다. 다른 동적 파라미터들과 같이 중괄호('{ }') 안에 입력하시면 됩니다. 반복 횟수와 같은 정보들은 RepeatedTes..
[JUnit5] 내부동작(1) - 생성자와, 메서드의 매개변수
모든 JUnit들에서는 생성자나 메서드에서 매개변수를 가질 수 없었습니다. (Runner 구현체에서 허용하지 않음) 이번 JUnit5가 되면서 Jupiter의 가장 중요한 변경 사항 중 하나가 바로 테스트 생성자와 메서드 모두 매개변수를 가질 수 있게 된 것입니다! 이를 통해 테스트에서도 의존관계 주입(DI)이 가능해지는 등 더 큰 유연성을 허용할 수 있습니다. 특히 'ParameterResolver'는 매개변수(파라미터)를 런타임 중 동적으로 확인 및 등록하는 역할을 합니다. 현재 JUnit에는 3개의 내장 리졸버가 있습니다. ParameterResolver 구현체 설명 TestInfoParameterResolver 생성자 또는 메서드의 파라미터가 TestInfo 타입인 경우 사용. 이 컨테이너 또는 ..
[JUnit5] 테스트 작성(6) - Nested Test
보통은 클래스를 분리해서 테스트를 진행하나, 일부의 테스트의 경우 테스트 간의 관계를 표현하기 위해서 중첩 클래스를 이용하는 경우가 있습니다. 이런 경우에 '@Nested'를 사용합니다. 추가적으로 가장 많이 쓰는 이유는, 전체 테스트 클래스의 메커니즘을 파악하는데 굉장히 유용하기 때문입니다. @DisplayName("A stack") public class NestedTest { Stack stack; @Test @DisplayName("is instantiated with new Stack()") void isInstantiatedWithNew() { new Stack(); } @Nested @DisplayName("when new") class WhenNew { @BeforeEach void cre..
[JUnit5] 테스트 작성(5) - 라이프사이클과 테스트 순서(Order)
라이프 사이클 JUnit의 중요한 특성 중 하나는 테스트들을 실행할 때 각 테스트 클래스의 새 인스턴스를 만들어 각각 독립적으로 실행되는 것입니다. 이를 통해 테스트 인스턴스의 예상치 못한 부작용을 피할 수 있습니다. public class MethodLifecycleTest { int count = 1; @BeforeAll static void init() { System.out.println("===테스트 시작==="); } @AfterAll static void destroy() { System.out.println("===테스트 종료==="); } @DisplayName("테스트1") @Test void plus1() throws Exception{ System.out.println(++count..