TDD
1. TDD란?
TDD는 Test Driven Development의 약자로, 테스트 주도 개발을 의미합니다. 이는 테스트를 통한 기능의 구현이라고 표현할 수 있습니다. 이번 시간에 학습할 테크닉은 단위 테스트(Unit Test)입니다.
1.1. 단위 테스트란?
단위 테스트(Unit Test)는 특정 조건에서 함수(Unit)가 어떻게 작동해야 하는지 정의하고, 그 정의대로 함수가 잘 작동하는지 확인하는 방법론입니다.
테스트의 종류 소프트웨어 개발에서 사용되는 대표적인 테스트 유형은 다음과 같습니다.
- 단위 테스트: 코드의 가장 작은 단위를 테스트합니다. 이때의 단위는 함수, 메서드 또는 클래스일 수 있습니다. 단위 테스트는 일반적으로 개발자가 작성하며 별도의 테스트 파일을 통해 실행됩니다.
- E2E 테스트: 소프트웨어 시스템의 전체 기능을 테스트합니다. 브라우저와 상호 작용을 통하여 테스트를 진행하며, 사용자 시나리오를 시뮬레이션합니다. 예를 들어, 테스트 라이브러리에서 지원하는 API 명령어의 cy.visit() 메서드를 사용하여 특정 URL로 이동하고 cy.click() 메서드를 사용하여 버튼을 클릭할 수 있습니다.
각각의 테스트는 소프트웨어의 다른 부분을 검증하기 때문에 모두 중요합니다. 단위 테스트는 내가 작성한 함수가 올바르게 작동하는지 확인하는 데 도움이 되고, E2E 테스트는 전체 시스템이 올바르게 작동하는지 확인하는 데 도움이 됩니다.
TDD 라이브러리인 Jasmine을 사용하여 실습을 진행해보겠습니다.
Jasmine | TDD2. TDD의 단계
TDD에서는 기능을 바로 개발하지 않고, 테스트 코드를 먼저 작성합니다. 이때 테스트 코드는 다음과 같은 단계를 반복합니다.
- 적색 단계(RED) : 성공하기 위해 테스트에 실패하는 단계
- 녹색 단계(GREEN) : 테스트에 성공한 단계
- 리팩터 단계(REFACTOR) : 테스트에 성공한 코드를 기반으로 코드의 품질을 높이는 단계 (refactoring)
2.1. Jasmine 실습
자스민은 자바스크립트 테스트 프레임워크로, 읽기 쉽고 이해하기 쉬운 형태로 테스트 코드를 작성할 수 있게 합니다.
자스민의 환경 구성은 간단하게 스탠드얼론 방식을 이용합니다.
자스민 환경 구성은 여러 가지 방법이 있지만, 간단한 스탠드얼론 방식을 사용합니다.
-
간단한 함수를 테스트합니다.
function sum(a, b) { return a + b; } describe('sum 함수 테스트', () => { it('두 수의 합을 반환', () => { expect(sum(1, 2)).toBe(3); }); });
function sum(a, b) { return a + b; } describe('sum 함수 테스트', () => { it('두 수의 합을 반환', () => { expect(sum(1, 2)).toBe(3); }); });
-
객체지향적 코드를 구현하여 테스트합니다.
class Calculator { sum(a, b) { return a + b; } } describe('Calculator 클래스 테스트', () => { let calculator; beforeEach(() => { calculator = new Calculator(); }); it('두 수의 합을 반환', () => { expect(calculator.sum(1, 2)).toBe(3); }); });
class Calculator { sum(a, b) { return a + b; } } describe('Calculator 클래스 테스트', () => { let calculator; beforeEach(() => { calculator = new Calculator(); }); it('두 수의 합을 반환', () => { expect(calculator.sum(1, 2)).toBe(3); }); });
3. TDD의 장점
TDD를 이용하면 다음과 같은 장점을 얻을 수 있습니다.
- 코드의 안정성과 견고함 향상
자바스크립트는 인터프리터 언어로, 컴파일러의 역할을 테스트를 통해 대신 수행하여 기능의 구동을 보장합니다. - 서비스 이해와 품질 향상
테스트 코드를 작성하기 위해서는 구현해야 하는 기능에 대한 높은 분석을 요구하기 때문에 서비스에 대한 이해도가 상승하고 품질을 우선하는 품질 중심의 개발 문화를 형성할 수 있습니다.
4. TDD 사용 시 주의할 점
여러 장점에도 불구하고 TDD를 사용함에 있어서 주의할 점이 있습니다.
- 개발 시간
TDD는 기능을 구현하는 것보다 우선해서 테스트 코드를 작성해야 하기 때문에 초기 개발 시간이 증가합니다. 따라서 프로젝트의 성격에 따라서 TDD의 도입을 고려해야 합니다. 개발 기간이 짧아 구현이 급박하다면 TDD를 사용하지 않는 것이 좋습니다. - 모든 예외 상황을 고려하지 않음
TDD가 모든 예외 상황을 완벽히 해결해주지 않습니다. 테스트 코드 또한 사람이 작성하기 때문에 모든 상황이 고려되지 않을 수 있습니다. 테스트 코드는 견고하고 안정적인 코드를 지향하는 것이지 결코 모든 상황을 대비하는 것은 아닙니다.