단순히 test code를 작성하는 것과 테스트 주도 개발(TDD)은 다른 것이다. 이 게시글에서는 책을 참고하여 test code 자체에 대하여 정리해본다.
테스트 코드를 작성하는 이유
1. 서버를 실행시키지 않고도 개발 과정에서 미리 문제를 발견할 수 있다.
- TDD에 대하여 이야기하는 것이 아니기 때문에 로직을 작성하기 이전이든 이후든 테스트를 하면 비지니스 로직에 있을 수 있는 문제를 미리 테스트 과정에서 발견할 수 있다는 것이 테스트 코드 작성의 필요성이라고 할 수 있다.
2. 리팩토링 후 어플리케이션 동작 검토를 빠르게 할 수 있다.
- 1번과 같은 맥락이다. 리팩토링 후 내가 수정한 부분과 연결 된 다른 부분들이 정상적으로 작동하는지 검토를 해야하는데, 테스트 코드를 잘 작성하였다면 테스트를 실행하는 것만으로 확인할 수 있다.
3. 협업의 과정에서 명세 문서로의 기능을 할 수 있다.
- 우리는 개발을 할 때 대부분 협업을 통해서 일을 하게 되는데, 다른 사람의 코드를 이해하는게 쉬운일은 아니기 때문에 주석을 잘 작성하는 것이 흔히 중요하게 여겨진다. 테스트 코드를 잘 작성하면 비지니스 로직과 비교하면서 비교적 쉽게 코드의 의도를 파악할 수 있기 때문에 다른 사람의 코드를 이해하는데 도움이 된다.
-> 테스트 코드 작성의 이 모든 목적을 달성하기 위해서는 테스트 코드를 '잘' 작성해야할 것이다. 실행 성공에 대한 테스트는 물론이고 발생할 수 있는 오류나 예외 상황들을 고려하여 실패에 대한 테스트 코드를 꼼꼼히 작성하여야 제대로 된 테스트를 할 수 있을 것이다.
단위 테스트와 통합 테스트
단위 테스트
- 단위 테스트는 어플리케이션의 각 모듈마다 독립적으로 테스트 하는 방식으로 일반적으로는 메소드 단위로 테스트를 수행하게 된다. 메소드 호출을 통해 의도한 결과가 제대로 나오는지 확인하는 수준이다.
- 나는 단위 테스트 코드만 작성해봤었는데, 단순히 가정한 결과가 제대로 나오는지만 확인하기 때문에 이게 제대로 된 테스트가 맞는지 의문을 가진적이 있었다. 그만큼 코스트가 적게 들기 때문에 빠르게 피드백을 받을 수 있다.
통합 테스트
- 통합 테스트는 어플리케이션을 구성하는 다양한 모듈을 결합해 전체적인 로직이 의도한 대로 동작하는지 테스트하는 방식이다.
- 데이터베이스나 네트워크 같은 외부적인 요인들을 모두 포함하여 어플리케이션 자체가 정삭적으로 작동하는지를 테스트하는 것이다. 모든 요소가 제대로 동작하는지 검증하여야 하므로 그만큼 큰 코스트가 필요하다.
테스트 코드를 작성하는 방법
많이 사용하는 Given-When-Then 패턴
Given - 테스트를 수행하기 전 테스트에 필요한 환경을 설정한다. 테스트에 필요한 변수를 정의하거나 Mock객체를 통해 특정 상황에 대한 행동을 정의한다.
When - 테스트의 목적을 보여준다. 실제 테스트 코드가 포함되며 테스트를 통한 결과값을 가져온다.
Then - 테스트의 결과를 확인하는 단계이다. 주로 When 단계에서 나온 결과를 검증하는 작업을 수행한다.
-> Given-When-Then 패턴을 이용하면 코드가 불필요하게 길어질 수 있지만 테스트의 가정, 목적, 결과를 구분해서 보여주기 때문에 다른 사람이 코드를 잘 이해하도록 도와줄 수 있다.
출처: 스프링 부트 핵심 가이드