들어가기에 앞서 먼저 단위 테스트가 뭔지 알아보고 TDD에 대해 설명하고자 한다.
단위 테스트(Unit Test)
- 모든 함수, 메서드등에 대해 각각 잘돌아가는지 확인을 위해 테스트 케이스를 작성하는 것을 의미.
- TDD에서 테스트 코드를 작성할 때, 단위 테스트를 사용.
통합 테스트(Integration Test)
- 모든 함수, 메서드, 클래스 등이 서로 연결관계를 가질때, 모든 모듈간 통합되어 잘 동작되는 지 확인.
- 기능에 대한 개발 전체를 끝내고 테스트
단위테스트의 원칙(FIRST 원칙)
- 1. 테스트 코드의 실행은 빨라야 함.
- 2. 독립적인 테스트가 가능해야 한다.
- 3. 테스트가 매번 같은 결과를 만들어야 한다.
- 4. 테스트는 그 자체로 실행하여 그 결과를 확인 할 수 있어야 한다.
- 5. 만약 TDD 환경 속에서 개발 중이라면, 단위 테스트는 비지니스 코드보다 선행되어야 함. (Optional)
TDD
먼저 TDD에 대해 알아보려고 한다. TDD란 Test Driven Development의 약자로 테스트가 개발보다 선행되어 개발을 한다는 의미이다.
즉, 단위 테스트 코드를 개발하고 이에 부합하는 개발을 한다는 의미이다.
쉽게 설명하기 위해 일련의 개발 과정을 예로 들려고 한다.
음식 주문 회사 개발자로 취업한 개발자 A, B는 이제 현장에 투입이 되었다. A, B에게 맡겨진 업무는 다음과 같다.
"음식 주문을 고객이 했을때, 주문 내역을 데이터베이스에 저장하는 기능에서 Controller를 구현하라"
이때, 개발자 A는 개발을 할때, Controller 클래스를 먼저 설계를 하기로 했다. 설계가 끝났다면 실제 코드를 작성하고 테스트 코드를 작성해 잘 동작을 하는지 테스트를 하고 이제 개발자 A는 개발을 끝냈음을 보고할 계획을 갖고 있다.
앞선 일련의 과정을 끝내고 테스트를 시작했는데, 오류가 발생을 헀다. 하지만 현재 Controller안에 메서드들은 서로 참조관계이기 때문에 하나의 메서드만 수정해도 여러 메서드에 영향을 끼친다. 즉, 수정하는데 많은 비용이 든다.
하지만 개발자 B는 TDD를 활용한 개발방식을 채택해서 개발을 진행했다. 먼저, Controller-Service-Repository 구조에서 Repository 관련해서 해당 클래스를 설계한 후 테스트 코드를 작성해 모든 테스트를 통과한다면 그 이후, Repository의 실제코드를 작성하고 이를 활용한 Service 클래스 작성, Controller 클래스 작성 순으로 개발을 하였다. 이렇게 작성하자 A가 겪었던 side-effect가 줄었다.
변경된 내용은 다음과 같다.
- 기존 ) 구조를 설계하고 실제 코드를 작성한다. 이 후, 테스트 코드 작성해 문제를 파악하는데 문제가 있으면 구조를 다시 설계한다.
- TDD) 구조를 설계하고 테스트코드를 작성한다. 이 후, 테스트 코드가 잘동작한다면 실제 코드를 작성한다.
"TDD란 테스트를 먼저 설계 및 구축 후 테스트를 통과할 수 있는 코드를 짜는 것"
TDD의 장점
- 코드의 안정성을 높일 수 있다. : 테스트를 통과해야한다는 목표에 부합한 코드기에 안정성이 높다.
- 나중에 미리 작성한 테스트코드를 통해 테스트하면서 기능을 추가하거나 변경하면 추가, 수정으로 인해 발생할 수 있는 side-effect를 줄일 수 있다.
- 테스트 코드를 통과하기 위한 목적을 충족하기 위한 코드가 작성되기에 코드의 목적이 명확하고 불필요한 내용없이 간결하다.
TDD를 통한 개발을 다시 한번 예로 들면
Repository클래스의 메서드 단위로 'TDD를 활용한 단위 테스트'를 통해 개발을 하고 이 결과물로 Repository 클래스가 나왔다면 클래스 전체가 잘 돌아가는 지 '단위 테스트'가 가능하다. 이후 Service 클래스에서도 마찬가지, Controller에서도 마찬가지로 작업 후, 전체 기능에 대해 '통합 테스트'를 진행한다.
TDD 구현 방법
- 가짜로 구현하기: 최대한 빨리 테스트를 통과하기 위해 정답이 아닌 가짜 정답을 구현하는 방법
- 삼각측량법: 값이 다른 여러 테스트를 작성하고, 이를 일반화하여 정답을 구현하는 방법
- 명백하게 구현하기: 정답을 바로 구현하는 방법
Spring에서 단위테스트를 구현하는 방법(주관적)
- DAO, Service, Controller 순으로 개발한다.
- DAO 테스트는 H2와 같은 인메모리 데이터베이스 기반으로 진행하여 DB에 영향을 줄인다. JPA로 한다고 가정.
- Service 테스트는 Mockito를 사용해 Repository 계층을 가짜로 주입받아 테스팅한다.
- Controller 테스트는 SpringTest의 MockMvc를 사용해 HTTP Request를 테스팅한다.
'Server Development > Testing' 카테고리의 다른 글
Apache Jmeter (0) | 2023.05.15 |
---|---|
Test Coverage with Jacoco (0) | 2023.04.02 |
Unit Test with MVC (0) | 2023.04.02 |
Swagger (0) | 2023.04.01 |
Testing HTTP Request with Insomnia (0) | 2023.03.27 |