[개발]TDD / 테스트코드 란?
resilient
·2021. 8. 10. 16:07
최근에 개발을 하면서 TDD, 테스트 케이스 등의 단어를 자주 접했다.
코드를 짜면서 점점 테스트 코드의 중요성을 알게 되었고 테스트 코드, 테스트 케이스 등 테스트를 이용한 개발이 무엇인지, 왜 중요한지에 대해서 정리해보려고 한다.
TDD란 무엇인가?
TDD란 Test Driven Development의 약자로 '테스트 주도 개발'이라고 한다. 반복 테스트를 이용한 소프트웨어 방법론으로, 작은 단위의 테스트 케이스를 작성하고 이를 통과하는 코드를 추가하는 단계를 반복하여 구현한다.
테스트 주도 개발은 말그대로 테스트 코드를 먼저 작성하는 것부터 시작하면 되고 순서는 아래와 같다.
- 먼저, 항상 실패하는 테스트를 먼저 작성하고
- 테스트를 통과 시키기 위한 실제 코드를 작성한다.
- 다음으로 테스트가 통과하면 중복 코드를 제거하고, 일반화시키는 과정인 리팩터링을 수행한다.
TDD와 일반적인 개발 방식의 가장 큰 차이점은 테스트 코드를 작성한 뒤에 실제 코드를 작성한다는 점이다.
디자인(설계) 단계에서 프로그래밍 목적을 반드시 미리 정의해야만 하고, 또 무엇을 테스트해야 할지 미리 정의(테스트 케이스 작성)해야만 한다.
테스트 코드를 작성하는 도중에 발생하는 예외 사항(버그, 수정사항)들은 테스트 케이스에 추가하고 설계를 개선한다. 이후 테스트가 통과된 코드만을 코드 개발 단계에서 실제 코드로 작성한다.
TDD가 왜 필요할까?
나는 테스트 코드를 작성하지 않을 때는
- 테스트 코드가 왜필요하지?
- Node.js는 에러가 나면 서버가 멈추고 콘솔에 찍히는 에러를 보고 찾아서 수정하면 되지!
- 또는 아무 문제 없이 잘 작동되는데? 서버 잘 돌아가고 웹도 잘 도는데? 앱도 문제없는데?
라는 (안일하고 부족한) 생각을 했다.
하지만 서비스가 에러가 발생했을 때, 로그가 제대로 찍히지 않거나 왜 멈췄는지 모를 때, 혹은 아무 문제가 없이 보이는데 에러가 생겼을 때, 그 에러를 보고 한참 삽질을 하다가 예외처리 부분이나 사소한 부분을 놓쳤던 많은 경험들이 쌓여 이제는 테스트 코드로 초장에 잡고 가야 한다 라는 생각을 갖게 됐다.
일반적인 개발 방식은 일반적으로 기획 -> 설계 -> 개발 -> 테스트 -> 배포의 프로세스를 갖는데 개발을 하면서 이런 방식은 많은 위험이 존재한다. 그 이유는 다음과 같다.
- 소비자의 요구사항이 처음부터 명확하지 않을 수 있다.
- 따라서 처음부터 완벽한 설계는 어렵다.
- 자체 버그 검출 능력 저하 또는 소스코드의 품질이 저하될 수 있다.
- 자체 테스트 비용이 증가할 수 있다.
- 유지보수가 매우 어려워진다.
TDD의 장점 / 단점
장점
- 객체지향적이고 효율적인 모듈형 코드를 생산할 수 있다.
- TDD는 테스트 코드를 작성해놓으면 몇 번이나 테스트를 할 수 있다. 그러므로 TDD 방식으로 개발을 하면 모듈화가 잘 이루어질 수 있다. 모듈화가 잘 이루어 질 수 있다는 점은 의존성이 낮은 독립적인 코드를 만들게 되고 코드에 문제가 생겨도 전체 코드에 영향을 덜 미칠 수 있다. - 디버깅 시간을 단축시켜서 효율적인 개발이 가능하다.
- 테스트 코드로 테스트를 해서 코드를 짜면 에러가 발생했을 때 쉽게 문제를 파악할 수 있고, 해결할 수 있다. - 유지보수가 쉽고 추가적인 기능 개발이 쉽다.
- 개발이 완료된 소프트웨어에 어떤 기능을 추가할 때 가장 우려되는 점은 해당 기능이 기존 코드에 어떤 영향을 미칠지 알지 못한다. 하지만 TDD의 경우 모듈형 코드로 잘 생산되어 있고, 의존성이 낮은 독립적인 코드로 이미 만들어져 있기 때문에 기능 추가가 쉽고 이는 유지보수가 쉽다고 말할 수 있다.
단점
- 단점은 단 한 가지, 시간이 오래 걸린다는 점이다. 하지만 이마저도 단점이 아닌 게 장기적으로 봤을 때는 오히려 시간을 단축시킬 수 있다는 점이다. TDD개발 방식을 이용하면 일반적인 개발 프로세스보다 약 20 % 정도 시간이 더 걸린다고 하는데 시간이 좀 더 써서 좋은 코드를 만드는 게 좋다고 생각한다.
다만, 시간에 촉박하게 어떤 서비스를 개발한다거나 시간이 쫓기고 있다면 사용하지 않는 게 더 나을 꺼같다는 생각이 든다.
TDD, 테스트 코드라고 하면 뭔가 되게 어려운 코드를 여러 줄 작성해서 파일도 새로 만들고 이것저것 할게 많고, 시간도 많이 들고...라는 생각이 먼저 든다.
하지만 테스트 코드는 하나씩만 간단하게 작성해도 엄청난 효과를 가져올 수 있다고 생각한다.
너무 어렵게 생각하지 않고 그냥 검사용 코드를 한 두 개 돌려본다 라는 생각을 습관처럼 하고 개발할 때 사용하게 되면 이게 TDD개발 방식을 따른다고 말할 수 있겠다.
나는 백앤드 개발을 할 때 Node.js 나 Nest.js를 사용하는데 다음 정리에서는 자바스크립트로 개발을 할 때 많이 사용하는 테스트 툴인 Jest에 대해서 정리해보려고 한다.
'글 > 개발' 카테고리의 다른 글
[개발/Spring] Soft delete vs Hard delete에 대한 나의 생각 (0) | 2023.03.29 |
---|---|
[개발] Pass By Value vs Pass By Reference 란? (0) | 2022.02.28 |
[Git] Git rebase, Git squash로 커밋 정리하기 (0) | 2021.11.30 |
[에러/삽질] vscode 에서 Delete `␍`eslintprettier/prettier 해결 (0) | 2021.08.08 |
[에러/삽질]Cannot use import statement outside a module 해결 (0) | 2021.08.01 |