애플리케이션을 구현만 하면 끝일까?
우리는 클라이언트가 아무런 이상 없이 사용할 수 있게끔 잘 만들어야 한다.
즉, 개발자 입장에서는 에러를 최소화하여 애플리케이션을 만들어내야 한다.
에러를 최소화할 수 있는 방법이 바로 '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) 값을 비교해서 검증한다.
JUnit
Java언어로 만들어진 애플리케이션을 테스트하기 위한 오픈 소스 테스트 프레임워크로, Java의 표준 테스트 프레임워크라고 볼 수 있다.
(Spring Boot의 디폴트 테스트 프레임워크는 JUnit이다)
@Test 애너테이션을 붙여주기만 하면 된다.
Assertion 메서드 사용하기
Assertion은 '검증한다'는 의미로, 예상하는 결과 값이 true이길 바라는 논리적인 표현이다.
- assertEquals() : 예상 값과 실제 동작 값이 같은지 여부 테스트
- assertNotNull() : Null 여부 테스트
- assertThrows() : 예외 테스트
테스트 케이스 실행 전, 전처리
테스트 케이스를 실행하기 전에 어떤 객체나 값에 대한 초기화 작업 등의 전처리 과정을 해야할 경우가 있다.
이를 도와주는 애너테이션은 다음과 같다.
- @BeforeEach : 이 애너테이션을 추가한 메서드는 각각의 테스트 케이스가 실행되기 전에 먼저 실행된다.
- @BeforeAll : 각각의 테스트 케이스가 실행되기 전에 딱 한 번만 실행된다.
테스트 케이스 실행 후, 후처리
테스트 케이스 실행이 끝난 시점에 후처리 작업을 할 수 있는 애너테이션은 다음과 같다.
(전처리 과정의 애너테이션들과 동작 방식은 동일하다)
- @AfterEach
- @AfterAll
Reference
- F.I.R.S.T 원칙에 대해
https://dzone.com/articles/writing-your-first-unit-tests
https://sites.google.com/site/unclebobconsultingllc/books - Given-When-Then에 대해
https://martinfowler.com/bliki/GivenWhenThen.html
https://en.wikipedia.org/wiki/Given-When-Then - BDD에 대해
https://en.wikipedia.org/wiki/Behavior-driven_development
- TestNG에 대해
https://testng.org/doc/ - JUnit 5의 Assertion 메서드에 대해
https://junit.org/junit5/docs/current/user-guide/#writing-tests-assertions - JUnit 5의 Assumption에 대해
https://junit.org/junit5/docs/current/user-guide/#writing-tests-assumptions
'Develop > Spring' 카테고리의 다른 글
Spring MVC - API 문서화 (1) | 2022.11.12 |
---|---|
Spring MVC - Testing(2) (0) | 2022.11.09 |
JPA(Java Persistence API)와 엔티티 매핑(Entity Mapping) (0) | 2022.11.01 |
Spring MVC - API 계층 (0) | 2022.10.30 |
GET, POST 메서드 요청 시, DTO 객체에는 setter가 필요한가? (0) | 2022.10.23 |