테스트코드 작성 하시나요?
얼마 전 모임에서 만난 후배 개발자가 면접 경험을 공유했다. '면접관이 테스트 코드 작성 여부를 물었다'라고 했다. 나 역시 면접에서 이를 중요하게 여긴다.
면접에서 나는 테스트 코드 작성의 이유를 반드시 질문한다. 단순히 테스트를 어떻게 작성에 대한 하드스킬에 대한 질문의 의도가 아니다. 테스트를 정말 작성을 한다면 경험을 기반으로 한 필요성에 대해서 설명할 수 있다고 생각하기 때문이다.
실제 업무에서 테스트코드 작성을 하게 된다면 업무 생상성뿐만이 아니라 좋은 코드 설계도 가능하다고 생각하기 때문이다. 왜 그렇게 생각하는지를 좀 정리를 해보려고 한다.
첫 번째 이유는 빠른 피드백이다. 예를 들어 회원가입 API를 만드는 Task 가 있다고 하자. 이메일 형식을 검증하는 요구사항이 있는데, POST /users API를 작성하면서 회원가입 시 이메일을 유효성 검사기능을 개발자 수준에서 테스트를 해야 할 것이다. 테스트 코드가 없다면 코드를 작성하고 API를 호출해서 테스트하고, 버그가 있다며 다시 수정하고 API 호출 테스트 해보고 이 사이클을 계속적으로 반복하게 된다. 아무리 빨라도 5초 정도 소요가 된다고 하자. 이를 테스트코드를 이용한다면 처음 작성이 시간이 걸리겠지만, 처음 이후에는 1s 도 안 걸릴 것이다. 만약 이런 상황이 누적된다면 생산성에 많은 기여를 할 것이다.
두 번째는 복잡한 요구사항을 표현할 수 있다. 프로그래밍을 하다가 if 문을 통해서 로직의 분기를 해야 하는 상황이 있다. 그런 상황은 십중팔구 비즈니스 요구사항이 들어간다. “최소주문 금액보다 음식가격이 낮다면 주문 실패를 한다.”라는 요구사항을 위해 분기문을 사용할 수밖에 없다. 이런 의도를 테스트코드로 작성을 하고 누군가가 해당 코드를 리팩토링 하다가 지우는 버그도 예방을 할 수가 있다. 그래서 나는 팀에서 Branch(Condition) Coverage를 관리를 한다.
세 번째는 자유로운 리팩토링이 가능하다. 테스트 코드를 작성하며 개발하는 도중, 한 선배 개발자가 프로젝트의 패키지 구조를 대대적으로 변경한 적이 있다. 당연히 내가 작성한 코드에도 영향이 있었고, 처음에는 큰 변화에 대한 두려움이 있었다. 실제를 conflict를 스스로 해결해 보았는데, 테스트코드 때문에 오히려 심리적 안전하다는 생각이 들었다. 그래서 리팩토링의 첫 단계는 테스트코드라고 말하는 것이다.
네 번째는 설계의 개선이 가능하다는 것이다. 테스트코드를 작성을 쉽게 하기 위해서는 유연한 의존성이 필수적이다. 자연스레 코어 비즈니스로직과 세부사항을 분리를 하게 된다. 단위 테스트 대상 클래스와 협력하는 클래스 간의 의존성이라 메시지 규약도 고려를 하게 된다.
아주 가볍게 내가 생각하는 이유들을 적어 보았다. 동의하는 부분도 있을 테고 동의하지 않는 부분도 있을 것이다. (다양한 의견 환영합니다.) 나도 이 글을 쓰면서 이 글을 읽으시는 분들에게 빠르게 피드백을 받고자 하는 목적도 있기 때문이다.
빠른 피드백, 유연한 의존성, 그리고 리팩토링의 용이성을 갖추어 나가다 보면 어제 보다 나은 코드를 만들기 위한 프로덕트의 기본 바탕이 될 수 있지 않을까 생각한다. 다음에는 좀 더 구체적인 사례로 테스트 코드 작성을 어떻게 할 수 소개해 보도록 하겠다.