자바스크립트로 작성된 프로젝트에 테스트 자동화를 사용할 때 사용할 수 있는 도구는 다음과 같습니다.
Karma, Jasmine, Jest, Chai, Mocha
Jest는 페이스북 팀에서 Jasmine 기반으로 만든 테스팅 프레임워크입니다. CRA로 만든 프로젝트에는 자동으로 적용이 되어있습니다.
function sum(a, b) {
return a + b;
}
module.exports = sum;
const sum = require('./sum');
test('1 + 2 = 3', () => {
expect(sum(1, 2)).toBe(3);
});
여기서 사용한
test
라는 함수는새로운 테스트 케이스를 만드는 함수
입니다. 그리고expect
는특정 값이 '~일 것이다'라고 사전에 정의를 하고 통과를 하면 테스트를 성공시키고 통과를 하지 않으면 테스트를 실패
시킵니다.toBe
는matchers
라고 부르는 함수인데요, 특정 값이 어떤 조건을 만족하는지, 또는 어떤 함수가 실행됐는지, 에러가 났는지 등을 확인할 수 있게 해줍니다. 여기서 toBe는 특정 값이 우리가 정한 값과 일치하는지 확인을 해줍니다.
jest
셋팅하기1. 모듈을 추가해줍니다.
yarn add jest @type/jest --dev
2. package.json에 다음과 같이 추가해줍니다.
{ "scripts": { "test": "jest" } }
위에서 새로운 테스트 케이스를 만들 때, test라는 키워드를 사용했지만 이 키워드 말고 it이라는 키워드를 사용할 수도 있습니다. 작동방식은 완전히 똑같습니다. it
을 사용하게 되면 테스트 케이스 설명을 영어 또는 한국어로 작성할 수 있습니다.
const sum = require('./sum');
it('calculates 1 + 2', () => {
expect(sum(1, 2)).toBe(3);
});
describe
를 사용해서 여러 테스트 케이스를 묶기테스트 케이스를 작성할 때
describe
라는 키워드를 사용하면 여러 테스트 케이스를 묶을 수 있습니다. 먼저 sum.js에 배열의 총합을 구해주는 sumOf를 구현합니다.function sum(a, b) { return a + b; } function sumOf(numbers) { let result = 0; numbers.forEach(n => { result += n; }); return result; } exports.sum = sum; exports.sumOf = sumOf;
현재 여러 함수를 내보내고 있기 때문에 테스트 케이스가 망가졌을 것입니다. 다음과 같이 테스트 코드를 수정하세요.
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이라는 이름으로 분류됩니다.
테스트 코드를 작성 했을 때 얻을 수 있는 이점은 리팩토링 이후 코드가 제대로 작동하고 있는 것을 검증하기 매우 간편하다는 것입니다. 한번 sumOf 함수를 다음과 같이 리팩토링 해보세요.
function sum(a, b) {
return a + b;
}
function sumOf(numbers) {
return numbers.reduce((acc, current) => acc + current, 0);
}
exports.sum = sum;
exports.sumOf = sumOf;
배열 내장함수 reduce를 사용해서 배열의 총합을 구해주었습니다. 만약에 여기서 실수를 했었더라면 테스트 케이스가 실패하여 바로 알 수 있습니다.
예상한 값이 매개변수와 같은 값일 것인지 확인합니다.
매개변수(객체)와 같은 값일 것이라 예상합니다. 객체가 가진 값의 비교가 가능합니다.
뒤의 결과를 부정하는 값과 비교합니다.
예상한 값이 null인지 확인합니다.
예상한 값이 undefined인지 확인합니다.
예상한 값이 undefined가 아닌지 확인합니다.
예상한 값이 truthy한 값인지 확인합니다.
예상한 값이 falsy한 값인지 확인합니다.
number보다 큰 값인지 확인합니다.
number보다 크거나 같은 값인지 확인합니다.
number보다 작은 값인지 확인합니다.
number보다 작거나 같은 값인지 확인합니다.
float인 매개변수와 같은 값인지 확인합니다. 부동소수점 에러를 해결하기 위해 고안되었습니다.
string을 포함하는 문자열인지 확인합니다.
item을 포함하는 배열(iterator)인지 확인합니다.
예외를 발생시키는지 확인합니다.