포스트

[Spring] Test 어노테이션

[Spring] Test 어노테이션

1. 학습 계기

김영한님의 스프링 입문 강의를 통해 학습을 하는 중에 테스트 케이스를 작성하는 과정을 진행했다. 김영한님이 테스트 어노테이션을 사용하시면서 실무 개발에서 대량의 코드가 있을때 유용하게 사용된다고 하셨다.

그러나 나는 기존에 사용했던 테스트 사용은 API 메서드를 사용하기 전에 데이터가 제대로 요청되고 응답 받는지를 미리 확인하기 위해 단일 메소드만 사용했었고 다른 어노테이션도 잘 몰라서 테스트에 어려움이 있었다. 그래서 Test 어노테이션에 대해 학습해서 유용하게 사용하고 싶다.

2. 핵심 개념 정리

개념명

JUnit6 Test JUnit User Guide

주요 특징

  • 예외 검증이 가능하다.
  • void로 반환값이 없어야 한다.
  • 서로 독립적으로 실행된다.

3. 직접 실험해보기

실험 1. 속성이 선언되어 있는지 확인해보자

실험 목적: JUnit 4와 5에서 test의 특징을 비교해보자

JUnit5의 @Test

JUnit5 Test

JUnit5의 @Test는 별도의 속성을 선언하지 않는다.

JUnit4의 @Test   Github 링크

JUnit4 Test

JUnit4의 @Testexpected, timeout 속성을 제공한다.

JUnit 4와 5의 장단점

| JUnit | 장점 | 단점 | |:—|:—|:—| | JUnit4 | @Test만으로도 expected, timeout을 따로 선언없이 사용 가능 | Test가 너무 많은 역할을 수행하여 확장성이 떨어진다. | JUnit5 | 속성을 분리하여 확장성이 높다. | JUnit4와는 다르게 기능을 분리했기 떄문에 학습할 내용이 많아졌다. |

확인한 내용

  • JUnit4의 @Test는 expected, timeout 속성을 통해 여러 책임을 수행했다. 반면 JUnit5는 @Test를 순수하게 테스트 메서드 표시 용도로만 사용하고, 예외 검증과 시간 제한을 별도의 API와 어노테이션으로 분리하여 확장성과 유지보수성을 높였다.

실험 2. @Test가 접근제어자에 따라 결과가 달라지는지 궁금하다.

실험 목적:

false-test

테스트 메서드의 접근 제어자에 따른 동작을 확인하기 위해 private, package-private(default), protected, public 메서드에 각각 @Test를 적용하여 실행해 보았다.

실험 결과 package-private(default), protected, public 메서드는 정상적으로 테스트 대상으로 인식되어 실행되었다.

Modifier 공식 문서에는 접근제어자를 public, private 둘 다 지원한다고 적혀있었지만 현재 Spring Boot 프로젝트 환경에서 실험한 결과 private 메서드는 테스트 대상으로 탐지되지 않았다.

alt text 찾다 보니 아래 부분에 private와 static은 사용할 수 없다고 나와있더라 이런 문제가 발생하는 원인은 실행 중에 클래스, 메서드, 필드의 정보를 조회하거나 조작하는 기술인 Reflection이 접근 가능한 메서드일 때만 실행될 수 있어서라고 한다.

또한 일반 매개변수(String)를 선언한 테스트 메서드는 ParameterResolutionException이 발생하며 실행에 실패하였다.

JUnit4의 @Test   Github 링크

4. 배운 점 및 회고

@Test를 사용하는 방법을 자세히 알 수 있었다. 그리고 접근제어자를 Test에서 사용할 때 문제가 발생할 수 있다는 걸 알기 때문에 다음에 이런 유형의 문제가 발생하면 원인을 빨리 찾을 수 있을 것이라 생각한다.

아직 Test 어노테이션 외에 테스트 케이스를 작성할 때 사용하는 다른 어노테이션에 대한 내용을 학습하지 않았으니 다음엔 다른 어노테이션 관련하여 학습을 진행할 예정이다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.