본문 바로가기

소프트웨어-이야기/소프트스킬

TDD와 테스트코드의 장점

회사 내에서 Ruby On Rails 테스트 코드인 Rspec을 공유하는 세션을 하게 되었다. 그래서 TDD를 하고, 테스트코드를 작성하면서 경험한 장점들을 정리해봤다.

TDD의 장점

이미지 참고


1. 단계별로 어떤 기능을 구현해야하는지 쉽게 정리할 수 있다

나는 기능 구현을 할 때, 필요한 테스트 항목들을 Description으로 나열한다. 그러면 내가 어떤 기능을 단계적으로 만들야하는지 정리할 수 있다.

TDD를 하면, 테스트 케이스를 기능 구현과 동시에 작성하게 되는거다. 그러다보니 예외 케이스를 빨리 인지할 수 있다. 


2. 개발 사이클이 짧아진다

테스트를 자동화하면, 기대하는 값을 바로 확인할 수 있다. 그러다보면 개발 주기가 짧아진다.

서버 개발을 할 때, 주로 API를 구현한다. 그래서 이걸 테스트하려면, 포스트맨이나 rails console으로 값을 확인한다. 그래서 로직을 변경했을 때, 이게 잘 적용되었는지를 확인하려면, 매번 수동으로 테스트해줘야한다. 이걸 계속 반복하다보면 정신이 혼미해진다.

리팩토링 서적을 보면, 개발 사이클을 짧게 하는게 중요하다는 말들이 나온다. 즉, 내가 만든 코드가 잘 적용되었는지 즉각적으로 확인할 수 있어야한다.

그러면 디버깅 시간도 짧아지고, 일의 시작과 끝이 명확해진다. 

내가 짠 로직이 잘 돌아가는지 테스트하는데 리소스가 크다면, 위의 장점을 얻기 힘들다.


3. 리팩토링하기 편하다

A. 리팩토링을 할 때, 코드를 수정할 때마다 수동으로 테스트하긴 힘들다. 그러다보니, 개선하고는 싶지만, 수정하기 부담스러울 때가 있다. 그런데 테스트코드가 있으면, 내가 개선한 코드가 정상동작하는지 즉각적으로 확인할 수 있다.

B. 리팩토링 요소를 찾기 쉽다

테스트 케이스가 많아서, 테스트코드를 짜기 어렵거나, Mock처리를 많이 해야하는 경우, 메서드 / 클래스 분리가 필요한 경우다. 


4. 외부와 의존성 있는 로직을 테스트하기 편하다

외부와 통신하는 로직을 Mock으로 처리해두면, 외부에서 발생할 수 있는 여러 환경을 내가 가짜로 구성할 수 있다.

그러면 외부에서 테스트 서버를 아직 안열어줬어도, 기능 구현을 미리 시작할 수 있다.



테스트 코드의 장점 

1. 테스트 환경 셋팅 자동화

특수한 상황마다 다르게 동작하는 로직을 구현해야하는 경우들이 있다. 이러한 로직을 수동으로 테스트하려면, 특수한 상황을 가짜 데이터로 다 만들어줘야한다. 여러개의 특수 상황을 테스트할 경우, 계속 가짜 데이터 값을 변경해줘야하는데, 그러다 보면 개발 사이클이 길어지게 된다.

예를 들어, 3개월만에 접속한 유저에게는 설치형 광고를 더 많이 보여줘야한다는 비즈니스 로직이 있다고 생각해보자. 

이 로직을 테스트하려면, 유저와 관련된 데이터들을 로컬에 셋팅해줘야한다. 그리고 이 유저의 마지막 로그인 데이터를 3개월 전으로 세팅해줘야한다. 그리고 설치형광고를 생성한 다음에, 광고를 내려주는 API를 호출해야한다.

API를 요청할 때 보내는 파라미터는 유효성 체크를 다 통과해야하며, 3개월만에 접속한 유저를 식별할 수 있는 ADID 값등을 셋팅해줘야한다.  

테스트코드를 사용하면, 이러한 환경도 가상으로 만들어줄 수 있다. Rails / Django 환경에서는 FactoryBot을 사용하면, 가짜 DB 등을 만들 수 있다. 

그리고 특수한 상황에 맞는 파라미터도 사전에 정의할 수 있기 때문에, 매번 파라미터값을 수동으로 바꿔가면서 테스트하지 않아도 된다. 


2. 통합 테스트 시간을 줄여준다

A. 테스트 환경 셋팅을 자동화해준다.

그래서 테스트 준비 시간을 줄여준다.

B. 이미 테스트 코드로 검증된 테스트는 수동으로 테스트하지 않아도 된다. 그래서 시간이 단축된다.

통합 테스트에는 테스트코드로 검증하기 어려운 부분( 클라이언트 인터페이스 / 배치 스크립트와의 호환성 등 )에만 집중하면 된다.


3. 전체 테스트를 자동화해준다 

모든 세부 기능을 통합 테스트에서 다 확인하기는 어렵다. 전체 테스트가 자동화되면, 수정된 코드가 다른 기능에 미친 영향을 쉽게 확인할 수 있다.


4. 서비스를 안정적으로 운영할 수 있다

테스트코드가 깨지는 것은, 서비스 장애가 발생할 수 있다는 것을 의미한다. 

그래서 CI로 전체 테스트가 잘 도는지 모니터링하면, 서비스가 정상적으로 운영되는 데에 도움이 된다.