[JAVA SCRIPT] TDD - 테스트 주도 개발
TDD (Test Driven Development) : 테스트 주도 개발
- 기술이 아니라 습관
- 모든 개발 과정을 테스트 중심으로 진행해나가는 습관
순서
1. 테스트 작성
- 만들려는 대상이 무엇인지 선언하고, 그 대상이 테스트에서 어떻게 작동해야 할지 기술
2. 테스트를 실행하되, 실패한다
3. 테스트를 통과하기 위해 필요한 최소한의 코드를 작성하여 성공한다
- 테스트 범위를 벗어나는 코드는 추가하지 않을것
4. 코드와 테스트를 함께 리팩토링 작업을 한다
- 리팩토링 작업 : 예외처리, 중복제거, 기능 추가 등
JavaScript에서 실행
Jest : 페이스북에서 사용되는 리액트 애플리케이션을 포함한 모든 자바스크립트 테스트 도구
- npm init 후 사용
npm install jest --save
- sum.js
function sum(a, b) {
return a - b; // 실패 코드
return a + b; // 성공 코드
}
module.exports = sum;
- sum.test.js
const sum = require('./sum');
test('1 + 2 = 3', () => {
expect(sum(1, 2)).toBe(3);
})
it('calculates 1 + 2', () => {
expect(sum(1, 2)).toBe(3);
})
- test( ) : 새로운 테스트 케이스를 만드는 함수
- it( ) : test( )와 똑같지만, 케이스 설명을 영어로 작성하게 되는 경우, "말이 되게" 작성 할 수 있음
- expect( ) : 특정 값을 예상하여 사전에 정의하고, 통과하면 성공시키고 통과하지 않으면 테스트를 실패시킴
- toBe(정한 값) : 특정 값이 내가 정한 값과 일치하는지 확인 해줌
- package.json : "scripts"를 다음과 같이 추가
{
"name": "0902",
"version": "1.0.0",
"description": "",
"main": "sum.js",
"scripts": {
"test": "jest --watchAll --verbose"
},
"author": "",
"license": "ISC",
"dependencies": {
"jest": "^24.9.0"
}
}
- 실행
npm test
-> 실패 했을 경우
-> 성공했을 경우
기능 추가
- sum.js
function sum(a, b) {
return a + b;
}
function sumOf(numbers){
let result = 0;
numbers.forEach(n => {
result += n;
});
return result;
}
// 내보내기
// module.exports = sum;
// 각각 내보내기
exports.sum = sum;
exports.sumOf = sumOf;
- sum.test.js
const { sum, sumOf } = require('./sum');
describe('sum', () => {
it('calculates 1 + 2', () => {
expect(sum(1, 2)).toBe(3);
});
it('calculates all numbers', () => {
const array = [1, 2, 3, 4, 5];
expect(sumOf(array)).toBe(15);
})
})
- describe( ) : 여러 테스트 케이스를 묶어서 사용 가능
리팩토링
- 리팩토링 이후 코드가 제대로 작동하고 있는 것을 검증하기 매우 간편함
- sum.js
function sum(a, b) {
return a + b;
}
function sumOf(numbers){
// let result = 0;
// numbers.forEach(n => {
// result += n;
// });
// return result;
// 리팩토링
return numbers.reduce((acc, cur) => acc + cur, 0);
}
// 내보내기
// module.exports = sum;
// 각각 내보내기
exports.sum = sum;
exports.sumOf = sumOf;