테스트 주도 개발(TDD) – Jest와 Mocha로 테스트 작성하기
테스트 주도 개발(Test-Driven Development, TDD)은 소프트웨어 개발 방법론 중 하나로, 개발자가 코드를 작성하기 전에 테스트 코드를 먼저 작성하는 것을 원칙으로 합니다. TDD를 통해 코드의 품질을 높이고, 유지보수성을 향상시킬 수 있습니다. 이번 포스팅에서는 "TDD", "Jest", "Mocha", "테스트 작성"을 중심으로 TDD의 개념과 Jest 및 Mocha를 사용하여 테스트를 작성하는 방법을 설명하겠습니다. 중급 개발자를 대상으로 상세히 설명하고, 예제를 통해 실습해 보겠습니다.
테스트 주도 개발(TDD)이란?
테스트 주도 개발(TDD)은 소프트웨어 개발 방법론으로, 코드 구현 전에 테스트를 먼저 작성하는 방식을 채택합니다. TDD의 주요 목표는 코드의 신뢰성을 높이고, 결함을 조기에 발견하여 수정하는 것입니다. TDD의 주기적인 과정은 다음과 같습니다:
- 테스트 작성: 새로운 기능에 대한 테스트 코드를 작성합니다.
- 테스트 실패 확인: 작성한 테스트가 실패하는지 확인합니다. 이는 테스트가 올바르게 작성되었음을 의미합니다.
- 코드 구현: 테스트를 통과하기 위한 최소한의 코드를 작성합니다.
- 테스트 통과 확인: 작성한 코드가 테스트를 통과하는지 확인합니다.
- 리팩토링: 코드를 정리하고 최적화합니다. 이 과정에서 테스트는 계속 통과해야 합니다.
이 과정을 반복하여 소프트웨어를 개발합니다.
Jest와 Mocha 소개
Jest
Jest는 Facebook에서 개발한 JavaScript 테스팅 프레임워크로, 특히 React 애플리케이션을 테스트하는 데 많이 사용됩니다. Jest는 간편한 설정, 빠른 실행 속도, 강력한 모킹 기능을 제공합니다.
Mocha
Mocha는 유연하고 기능이 풍부한 JavaScript 테스팅 프레임워크로, Node.js 애플리케이션을 테스트하는 데 많이 사용됩니다. Mocha는 다양한 테스트 스타일을 지원하며, 강력한 비동기 테스트 기능을 제공합니다.
Jest로 테스트 작성하기
Jest 설치 및 설정
먼저, Jest를 프로젝트에 설치합니다.
npm install --save-dev jest
package.json
파일에 Jest를 테스트 스크립트로 추가합니다.
{
"scripts": {
"test": "jest"
}
}
예제 코드 작성
간단한 계산기 모듈을 작성해보겠습니다. calculator.js
파일을 만들고 다음 코드를 작성합니다.
class Calculator {
add(a, b) {
return a + b;
}
subtract(a, b) {
return a - b;
}
multiply(a, b) {
return a * b;
}
divide(a, b) {
if (b === 0) {
throw new Error("Cannot divide by zero");
}
return a / b;
}
}
module.exports = Calculator;
테스트 코드 작성
calculator.test.js
파일을 만들고 다음과 같이 테스트 코드를 작성합니다.
const Calculator = require('./calculator');
describe('Calculator', () => {
let calculator;
beforeEach(() => {
calculator = new Calculator();
});
test('should add two numbers correctly', () => {
expect(calculator.add(1, 2)).toBe(3);
});
test('should subtract two numbers correctly', () => {
expect(calculator.subtract(5, 3)).toBe(2);
});
test('should multiply two numbers correctly', () => {
expect(calculator.multiply(2, 3)).toBe(6);
});
test('should divide two numbers correctly', () => {
expect(calculator.divide(6, 3)).toBe(2);
});
test('should throw an error when dividing by zero', () => {
expect(() => calculator.divide(1, 0)).toThrow('Cannot divide by zero');
});
});
테스트 실행
터미널에서 다음 명령어를 실행하여 테스트를 실행합니다.
npm test
Mocha로 테스트 작성하기
Mocha 설치 및 설정
먼저, Mocha를 프로젝트에 설치합니다.
npm install --save-dev mocha
package.json
파일에 Mocha를 테스트 스크립트로 추가합니다.
{
"scripts": {
"test": "mocha"
}
}
예제 코드 작성
앞서 작성한 계산기 모듈을 사용합니다. calculator.js
파일은 동일합니다.
테스트 코드 작성
test
디렉토리를 만들고, calculator.test.js
파일을 생성합니다. 다음과 같이 테스트 코드를 작성합니다.
const assert = require('assert');
const Calculator = require('../calculator');
describe('Calculator', () => {
let calculator;
beforeEach(() => {
calculator = new Calculator();
});
it('should add two numbers correctly', () => {
assert.strictEqual(calculator.add(1, 2), 3);
});
it('should subtract two numbers correctly', () => {
assert.strictEqual(calculator.subtract(5, 3), 2);
});
it('should multiply two numbers correctly', () => {
assert.strictEqual(calculator.multiply(2, 3), 6);
});
it('should divide two numbers correctly', () => {
assert.strictEqual(calculator.divide(6, 3), 2);
});
it('should throw an error when dividing by zero', () => {
assert.throws(() => calculator.divide(1, 0), /Cannot divide by zero/);
});
});
테스트 실행
터미널에서 다음 명령어를 실행하여 테스트를 실행합니다.
npm test
TDD 실습 예제
이제 TDD를 사용하여 새로운 기능을 추가하는 과정을 실습해보겠습니다. 계산기 모듈에 제곱근(sqrt) 기능을 추가하는 예제를 살펴보겠습니다.
1. 테스트 작성
먼저, 제곱근 기능에 대한 테스트를 작성합니다. calculator.test.js
파일에 다음 테스트를 추가합니다.
Jest
test('should calculate the square root of a number', () => {
expect(calculator.sqrt(9)).toBe(3);
expect(calculator.sqrt(16)).toBe(4);
});
test('should throw an error when calculating the square root of a negative number', () => {
expect(() => calculator.sqrt(-1)).toThrow('Cannot calculate the square root of a negative number');
});
Mocha
it('should calculate the square root of a number', () => {
assert.strictEqual(calculator.sqrt(9), 3);
assert.strictEqual(calculator.sqrt(16), 4);
});
it('should throw an error when calculating the square root of a negative number', () => {
assert.throws(() => calculator.sqrt(-1), /Cannot calculate the square root of a negative number/);
});
2. 테스트 실패 확인
테스트를 실행하여 실패를 확인합니다. 제곱근 기능이 구현되지 않았기 때문에 테스트는 실패해야 합니다.
3. 코드 구현
calculator.js
파일에 제곱근 기능을 추가합니다.
class Calculator {
// 기존 코드 생략
sqrt(a) {
if (a < 0) {
throw new Error("Cannot calculate the square root of a negative number");
}
return Math.sqrt(a);
}
}
4. 테스트 통과 확인
테스트를 다시 실행하여 모든 테스트가 통과하는지 확인합니다.
npm test
5. 리팩토링
필요한 경우 코드를 정리하고 최적화합니다. 리팩토링 후에도 모든 테스트는 계속 통과해야 합니다.
결론
테스트 주도 개발(TDD)은 소프트웨어 개발에서 중요한 방법론으로, 코드를 작성하기 전에 테스트를 먼저 작성함으로써 코드의 신뢰성과 품질을 높일 수 있습니다. 이번 포스팅에서는 Jest와 Mocha를 사용하여 테스트를 작성하고, TDD를 실습해 보았습니다. TDD를 통해 더 안정적이고 유지보수하기 쉬운 코드를 작성할 수 있습니다.
이 포스팅이 TDD와 Jest, Mocha를 이해하는 데 도움이 되길 바랍니다. 질문이나 추가 정보가 필요하시면 언제든지 댓글로 남겨주세요.