본문 바로가기
Develop/Spring

Spring MVC - Testing(1)

by jaeyoungb 2022. 11. 8.

애플리케이션을 구현만 하면 끝일까?

 

우리는 클라이언트가 아무런 이상 없이 사용할 수 있게끔 잘 만들어야 한다.

즉, 개발자 입장에서는 에러를 최소화하여 애플리케이션을 만들어내야 한다.

 

에러를 최소화할 수 있는 방법이 바로 'Testing'이다.

 

 

단위 테스트란?

단위 테스트를 Unit Test라고 부른다.

우선, 각각의 테스트들에 대해 간략하게 알아보자.

 

  • 기능 테스트

애플리케이션을 사용하는 클라이언트의 입장에서 애플리케이션의 기능들이 정상적으로 동작하는지를 테스트하는 것

(외부의 서비스와 연동될 수 있기 때문에 단위 테스트라고 보기는 어렵다)

 

  • 통합 테스트

여러 계층이 얽힌 동작을 테스트하는 것으로, 애플리케이션을 만든 개발자가 테스트의 주체가 된다.

(여러 계층이 묶여 있는 테스트여서 독립적인 테스트라고 볼 수 없기에 단위 테스트라고 보기는 어렵다)

 

  • 슬라이스 테스트

하나의 계층 내에서의 기능을 테스트하는 것으로, 애플리케이션의 일부만 테스트하기 때문에 부분 통합 테스트라고도 부른다. (단위 테스트라고 부르기에는 단위가 큰 테스트이다)

 

  • 단위 테스트

주로 메서드 단위의 테스트를 단위 테스트라고 본다. 단위 테스트는 최대한 독립적이고, 작은 단위일수록 좋다.

 

 

단위 테스트의 장점

  • 구현한 기능이 의도한대로 동작하는지 여부를 빠르게 확인할 수 있다.
  • 매번 외부 실행 툴(Postman, ...)을 열어서 HTTP 요청을 보내는 과정을 단순화할 수 있다.
  • 작은 단위 테스트로 작은 부분부터 문제의 원인을 찾아나갈 수 있기 때문에, 결과적으로 에러 해결에 더 적은 시간을 들일 수 있다.

 

단위 테스트를 위한 F.I.R.S.T 원칙

  • Fast

테스트 케이스는 빨라야 한다. 자주 돌려서 빠르게 문제를 찾아 해결해나가는 게 목적이다.

 

  • Independent

각각의 테스트 케이스는 독립적이어야 한다. 다른 케이스와는 아무런 연관없이 정상 실행이 보장되어야 한다.

 

  • Repeatable

어떤 환경에서도 반복해서 실행이 가능해야 한다. 단위 테스트 시에는 외부의 서비스, 리소스의 연동을 끊어주는 것이 바람직하다.

 

  • Self-validating

테스트 케이스 스스로 결과가 옳은지 그른지 판단할 수 있어야 한다.

 

  • Timely

단위 테스트는 기능 구현을 하기 직전에 작성해야 한다. 구현하고자 하는 기능을 단계적으로 테스팅해보면서, 조금씩 업그레이드하는 것이 바람직하다.

 

 

Given-When-Then 표현 스타일

BDD(Behavior Driven Development)라는 테스트 방식에서 사용하는 용어이다.

테스트 케이스의 가독성을 높이기 위해, 다음과 같은 표현 방식을 사용한다.

  • Given

테스트에 필요한 전제 조건들을 포함한다. 테스트 대상에 전달되는 입력 값도 포함된다.

 

  • When

테스트할 동작 대상(메서드)을 지정하고, 조건에 맞게 호출한다.

 

  • Then

테스트의 결과를 검증한다. 예상 값(expected)와 실제 동작 수행 결과(actual) 값을 비교해서 검증한다.

 

given-when-then 표현 방식 사용 예시 - JUnit

 

 

JUnit

Java언어로 만들어진 애플리케이션을 테스트하기 위한 오픈 소스 테스트 프레임워크로, Java의 표준 테스트 프레임워크라고 볼 수 있다.

(Spring Boot의 디폴트 테스트 프레임워크는 JUnit이다)

 

Junit을 사용한 테스트 케이스의 기본 구조

@Test 애너테이션을 붙여주기만 하면 된다.

 

 

Assertion 메서드 사용하기

Assertion은 '검증한다'는 의미로, 예상하는 결과 값이 true이길 바라는 논리적인 표현이다.

 

  • assertEquals() : 예상 값과 실제 동작 값이 같은지 여부 테스트
  • assertNotNull() : Null 여부 테스트
  • assertThrows() : 예외 테스트

 

테스트 케이스 실행 전, 전처리

테스트 케이스를 실행하기 전에 어떤 객체나 값에 대한 초기화 작업 등의 전처리 과정을 해야할 경우가 있다.

이를 도와주는 애너테이션은 다음과 같다.

 

  • @BeforeEach : 이 애너테이션을 추가한 메서드는 각각의 테스트 케이스가 실행되기 전에 먼저 실행된다.
  • @BeforeAll : 각각의 테스트 케이스가 실행되기 전에 딱 한 번만 실행된다.

 

테스트 케이스 실행 후, 후처리

테스트 케이스 실행이 끝난 시점에 후처리 작업을 할 수 있는 애너테이션은 다음과 같다.

(전처리 과정의 애너테이션들과 동작 방식은 동일하다)

 

  • @AfterEach
  • @AfterAll

 

 

 

 

 

Reference