[JUnit 4] @Nested 없이 계층 구조의 테스트 코드 작성하기
by 배부른코딩로그💡 JUnit4에서 계층 구조의 테스트 코드를 작성해보자!
목표
- 계층 구조의 테스트 코드를 설명할 수 있다.
- JUnit4에 @Nested가 없어도 계층 구조로 테스트를 작성할 수 있다.
- 기존에 작성한 JUnit5의 @Nested와 어떻게 다른지 설명할 수 있다.
의지와 상관없이 노후화된 서비스가 있다면, JUnit 5를 사용하지 못하는 경우가 생기기 마련이다.
계측 구조의 테스트 코드는 조금 더 읽기 쉽고 명료한 테스트를 작성할 수 있게끔 도와주는데,
불행하게도 JUnit4는 @Nested 애노테이션을 사용할 수 없다.
@Nested 애노테이션은 JUnit 5부터 릴리즈 되었기 때문이다.
링크된 글에서 간단한 예제를 살펴볼 수 있다.
이러한 JUnit4의 단점은 다음과 같은 라이브러리를 통해 개선할 수 있다.
<dependency>
<groupId>de.bechte.junit</groupId>
<artifactId>junit-hierarchicalcontextrunner</artifactId>
<version>4.12.2</version>
<scope>test</scope>
</dependency>
위 의존성을 추가했다면, Test Class(JUnit Test Case)를 만들어보자.
@RunWith(HierarchicalContextRunner.class)
public class Junit4LikeNestedTest {
}
`@RunWith(HierarchicalContextRunner.class)` 애노테이션을 추가하면, 계층 구조의 테스트를 작성할 수 있다.
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.MethodSorters;
import de.bechte.junit.runners.context.HierarchicalContextRunner;
@RunWith(HierarchicalContextRunner.class)
public class Junit4LikeNestedTest {
static TestMethod method;
@Before
public void setup() {
method = new TestMethod();
}
public class Nested_Deep1 {
public class Nested_Deep2 {
String validFixture = TestFixture.validFixture;
String invalidFixture = TestFixture.invalidFixture;
@Test
public void withValidRequest() {
String response = null;
try {
Assert.assertEquals(true, Util.isNotNull(validFixture));
response = method.send(String.valueOf(validFixture));
Assert.assertEquals(true, Util.isNotNull(response));
Assert.assertEquals(
AgentResponseCode.SUCCESS,
AgentResponseCode.enumTypeOf(code));
} catch (Exception e) {
e.printStackTrace();
Assert.fail("Response code: " + response);
}
}
@Test
public void withInvalidRequest() {
String response = null;
try {
Assert.assertEquals(true, Util.isNotNull(invalidFixture));
response = method.send(String.valueOf(invalidFixture));
Assert.assertEquals(true, Util.isNotNull(response));
Assert.assertEquals(
AgentResponseCode.REQUEST_PARAM_ERROR,
AgentResponseCode.enumTypeOf(response));
} catch (Exception e) {
e.printStackTrace();
Assert.fail("Response code: " + response);
}
}
}
}
}
간단한 계층 구조의 테스트 코드를 작성해보았다.
기존과 다르게 inner class를 작성 후 JUnit Test를 실행해도 테스트가 정상적으로 동작하는 것을 확인할 수 있다.
√ com.junit.test.nested.Junit4LikeNestedTest
└─ √ com.junit.test.nested.Junit4LikeNestedTest.Nested_Deep1
└─ √ com.junit.test.nested.Junit4LikeNestedTest.Nested_Deep2
@DisplayName 애노테이션을 사용할 수 없기 때문에 각 테스트 제목은 아쉽긴 하다.
하지만, 테스트 코드를 계층 구조로 작성하는 것만으로도 관심사 별로 구분/분류하기 쉬워진다.
이는 더 읽기 쉽고 명료한 테스트를 작성할 수 있게 된 것이다!!!
개발 환경이 완벽할 수 없다고 생각한다.
스테이블 한 레거시가 필요한 곳도 존재하기 때문이다.
할 수 있는 범위 내에서 코드 리팩터링 하고, 더 읽기 쉽고 명료한 코드를 작성해야 한다.
나를 위해서가 아닌 후배를 위한 테스트 코드는 필수적이다.
출처
- Writing Nested Unit Tests, PETRIKANINULAINEN, 2016-08-07
- The “Best Practices” of Nested Unit Tests, PETRIKANINULAINEN, 2016-08-14
- GitHub - bechte/junit-hierarchicalcontextrunne, Stefan Bechtold, 2019-04-15
- JUnit 테스트 실행 순서 : 테스트 순서 JUnit 4 Vs JUnit 5
Last Updated. 2022. 04. 21.
'TDD > JUnit' 카테고리의 다른 글
[JUnit 4] @FixedMethodOrder 통합 테스트 코드 작성하기 (0) | 2022.04.22 |
---|---|
[JUnit 5] @ParameterizedTest 사용하기 (0) | 2021.06.14 |
블로그의 정보
배부른코딩로그
배부른코딩로그