Home > TDD(Test-Driven Development) > 테스트 코드 및 TDD의 필요성

테스트 코드 및 TDD의 필요성
java

테스트 코드의 필요성

TDD의 필요성을 살펴보기 전에 테스트 코드의 필요성부터 살펴보자. 테스트 코드를 작성해야 하는 이유에 대해서는 이미 많은 글에서 말하고 있지만, 이 글에서는 내가 지금까지 개발을 해오며 느낀 주관적인 생각을 담아 작성했다!

1. 코드의 품질 보장

  • 테스트 코드를 작성하기 전에 가장 처음 들었던 생각은, “버그 없이 완벽하게 코드를 작성하면, 굳이 테스트 코드가 필요할까?”였다. 지금 와서 이 생각에 대한 답을 해보자면, “버그 없이 완벽하게 코드를 작성했다는 결론을 어떻게 내렸는가?”이다. 즉, 테스트 코드를 작성하고 이것이 성공했음을 보여줌으로써 코드의 품질에 대해서 말할 수 있는 것이다.
    • 테스트 코드를 작성할 때는 다양한 시나리오를 검증하는 것이 가장 중요하다고 생각한다. 정상 동작뿐만 아니라 엣지 케이스, 예외 처리, 오류 상황 등을 충분히 테스트해야 한다.

2. 회귀 테스트로 사용

회귀 테스트는 개발하고 테스트한 소프트웨어가 이후에 코드를 수정하거나 추가해도 기존 코드가 올바르게 동작하는지 확인하기 위한 테스트이다. 간단히 말해서, 이전에 정상 동작하던 기능이 변경으로 인해 손상되지 않았는지 확인하는 테스트이다.

  • 테스트 코드는 회귀 테스트로 사용할 수 있다. 코드는 지속적으로 수정되거나 추가되는데, 코드를 수정하거나 추가할 때 앞서 작성한 테스트 코드를 사용하면 다른 기능에 문제가 없는지 바로 확인할 수 있다. 즉, 테스트 코드는 변경한 코드로 인해 소프트웨어가 비정상적으로 동작하는 것을 사전에 막아준다.
    • 테스트 코드가 없다면 회귀 테스트를 체계적으로 진행하기 어렵고, 더 많은 시간과 노력이 필요하다.

3. 테스트 자동화를 통한 테스트 시간 감소

  • REST API E2E 테스트의 경우를 보면, “직접 Postman과 같은 API 테스트 도구를 사용해서 테스트하면 되는데 굳이 테스트 코드를 작성해야 할까?”라는 생각이 들기도 한다. 이에 대한 답은 “수동으로 모든 기능을 테스트할 필요 없이, 자동화된 테스트로 빠르게 확인할 수 있다.”이다. 즉, 테스트 자동화는 테스트 시간을 줄여준다.
    • 이전 글들에서도 이야기했듯이, “테스트를 자동화한다는 것 = 코드로 작성한 테스트를 실행한다는 것“이다.

TDD 필요성

위에서 테스트 코드의 필요성에 대해 살펴보았다. 그렇다면 TDD의 필요성은 무엇일까? TDD의 필요성을 살펴보기 전에 TDD의 흐름을 다시 짚어보면, TDD는 구현 전에 테스트를 작성하고 리팩토링을 포함하는 개발 방법론이다.

1. 설계 과정을 진행

  • TDD 자체가 설계는 아니지만, TDD를 하다 보면 테스트 코드를 작성하는 과정에서 일부 설계를 진행하게 된다. TDD 흐름과 예시를 보면, 테스트 코드를 작성하는 과정에서 (1)클래스 이름, (2)메서드 이름, (3)메서드 파라미터, (4)실행 결과를 결정했다. 이 네 가지를 결정하는 것이 곧 설계 과정이다. 이러한 설계 과정은 내가 무엇을 만들어야 하는지 명확하게 파악할 수 있도록 해준다.

2. 디버깅 시간 감소

개발 시간은 크게 처음 코딩 시간, 테스트 시간, 디버깅 시간으로 나눌 수 있고, 이 과정은 개발을 완료할 때까지 반복된다. 전체 개발 시간을 줄이려면 코딩 시간뿐만 아니라 테스트 시간과 디버깅 시간을 줄여야 한다. 테스트 시간은 위의 테스트 코드의 필요성에서 말했듯 테스트 자동화, 즉 테스트 코드 작성을 통해 줄일 수 있다.

  • 코드를 작성한 시점과 테스트를 하는 시점에 차이가 날수록 어떤 문제가 발생했을 때 원인을 찾는 데 시간이 필요하다. 아무리 코드를 잘 만들었다 해도 코드를 다시 읽고 분석해야 하기 때문이다. 반면에 TDD는 기능을 구현하자마자 테스트를 진행한다. 바로 전에 코드를 작성했기 때문에 테스트에 실패해도 원인을 빨리 찾을 수 있다. 즉 TDD는 디버깅 시간을 줄여준다.
    • 사실 TDD를 적용하지 않고 구현 이후 테스트 코드를 작성할 때, 구현을 끝내고 즉시 테스트 코드를 작성한다면 꼭 TDD가 아니여도 디버깅 시간을 감소할 수 있다. 그러나, 테스트 코드 작성을 미루는 경우가 많다. 시간이 지나고 나서야 테스트 코드를 작성하고 디버깅을 진행한다면, 디버깅은 물론 테스트 코드 작성에도 많은 시간이 소요될 수 있다.

3. 지속적인 코드 정리

  • TDD는 리팩토링할 대상이 눈에 들어오면 리팩토링을 진행해서 코드 구조와 가독성을 개선한다. 즉, TDD는 개발 과정에서 지속적으로 코드 정리를 하므로 코드 품질이 급격히 나빠지지 않게 막아준다. 또한, 정리된 코드는 향후 코드 수정과 추가를 쉽게 할 수 있게 해주는데, 이는 곧 미래의 코딩 시간을 줄여준다.

  • 참고 자료
    테스트 주도 개발 시작하기(저자: 최범균)
    https://www.quora.com/Is-it-necessary-to-perform-tests-in-software-development-even-if-the-code-is-written-to-never-break-down-during-operation
    https://stackoverflow.com/questions/247086/should-unit-tests-be-written-before-the-code-is-written
    https://www.growin.com/the-importance-of-testing-code