이번에 Vanilla JS로 아이폰 계산기를 따라 만들어 보면서 테스트 코드의 필요성을 절실히 느꼈다. 스터디원들과 상의 후에 State of JS 2020을 참고하여 관심도, 사용량, 인지도 면에서 1위인 Jest를 한번 사용해 보기로 했다. 본격적으로 테스트 코드를 작성하기 전에 Jest가 뭔지 공식 문서부터 차근차근 살펴봐야겠다.
페이스북에서 개발한 자바스크립트 테스팅 프레임워크
Bebel, TypeScript, Node, React, Angular, Vue 등과 호환된다.
테스트 케이스가 얼마나 충족되었는지 나타내는 지표 중 하나
--coverage
플래그를 추가하여 간단히 확인할 수 있다.mocking: 테스트를 독립시키기 위해 의존성을 개발자가 컨트롤하고 검사할 수 있는 오브젝트로 변환하는 기술. 일반적으로 import하는 모듈을 의존성이라고 함 (참고)
toBe
, toEqual
등)yarn add --dev jest
scripts
추가"scripts": {
"test": "jest"
}
[테스트할 파일명].test.js
형식으로 테스트 파일 생성sum.js
function sum(a, b) {
return a + b;
}
module.exports = sum;
sum.test.js
const sum = require('./sum');
describe('add test', () => {
test('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});
test('adds 2 + 3 to equal 4', () => {
expect(sum(2, 3)).toBe(4);
});
});
describe(name, fn)
연관된 테스트 여러 개를 모아서 테스트 그룹을 생성하는 함수
describe
내부에 describe
를 둬서 계층 관계를 형성할 수도 있다.test(name, fn, [timeout])
테스트를 수행하는 함수 (필수!)
it()
로도 사용 가능
expect(value)
값을 테스트할 때 사용하는 함수
yarn test
.toBe(value)
정확한 값 비교
.toEqual(value)
객체의 모든 속성을 재귀적으로 비교 (깊은 비교)
.toBeTruthy()
/ .toBeFalsy()
true / false 검사
false
, 0
, ''
, null
, undefined
, NaN
.toHaveLength(number)
객체의 길이 비교
expect([1, 2, 3]).toHaveLength(3);
expect('abc').toHaveLength(3);
.toContain(item)
주어진 요소가 배열에 포함되어 있는지 검사 (===
비교)
.toMatch(regexp | string)
정규표현식이 주어진 경우 문자열이 정규표현식에 부합하는지 검사
문자열이 주어진 경우 해당 문자열을 포함하는지 비교
describe('an essay on the best flavor', () => {
test('mentions grapefruit', () => {
expect('grapefruits').toMatch(/grapefruit/);
expect('grapefruits').toMatch(new RegExp('grapefruit'));
expect('grapefruits').toMatch('fruit');
});
});
.toThrow(error?)
예외가 발생하는지 검사
.toThrowError(error?)
와 같다.
test('throws on octopus', () => {
expect(() => {
drinkFlavor('octopus');
}).toThrow();
});