Jest는 페이스북에서 만든 테스팅 라이브러리이다.
React와 Javascript를 테스팅하는데 많이 사용되고 있다.
Jest는 Test Runner와 Test Matcher 그리고 Test Mock 프레임워크까지 제공해 많이 사용된다.
- Test Runner
- 테스트를 실행하고 각 테스트 케이스의 성공 혹은 실패 여부를 보고하는 도구
- Test Matcher
- 테스트 케이스에서 예상되는 결과와 실제 결과를 비교하는 도구
- Test Mock
- 특정 객체 또는 기능을 흉내내어 가짜로 구현된 대체 객체
Jest 설치
npm i -D jest
CRA를 사용해 React를 사용하면 따로 Jest를 설치하지 않아도 Jest를 사용할 수 있다.
설치가 완료되면 package.json 파일에 test 스크립트를 jest로 추가하자
test 파일 지정의 경우는 다음과 같다
- 파일명.tests.js(ts) 의 형태로 확장자 왼쪽에 .test를 추가
- 폴더명을 __tests__ 로 지정하면 하위 파일들을 전부 실행
Jest Matcher 문법
matcher는 다른 방법으로 값을 테스트할 수 있게 해준다.
이번 글에서는 자주 사용되는 matcher 함수만 확인할 예정이니 추가적인 정보는 api 상세서를 참고하자
toEqual()
toBe()와 비슷한 api이며, toBe()는 하지 못하는 객체나 배열의 비교를 할 수 있다.
객체나 배열은 재귀적으로 돌며 값을 확인하기에 toEqual()을 사용해야 한다.
const { userObj } = require('user'); // 테스트할 함수를 가져온다.
test("userObj와 같은지 확인", () => {
// userObj와 객체 값이 같은 경우 true
expect(userObj).toEqual({
id: 1,
email: `email@email.com`,
});
});
toStrictEqual()라는 함수도 있는데, 그냥 toEqual은 객체에 빠진 요소가 있어도 true가 나올 수 있지만, toStrictEqual()은 엄격하게 검사하기에 False가 나올 수 있다.
toBe()
단순 값 비교로 정수와 문자열을 비교
객체나 배열은 재귀적으로 돌며 값을 확인하기에 toEqual()을 사용해야 한다.
test("1은 1이다.", () => {
// expect에 검증할 값, toBe에 기대되는 값
expect(1).toBe(1);
})
toBeNull() / toBeUndefined() / toBeDefined()
각자 null, undefined, defined(정의됨) 이면 통과되는 함수
toBeTruthy() / toBeFalsy()
각자 truthy와 falsy를 테스트하는 함수
test('Truthy test', () => {
expect(1 + 1).toBeTruthy(); // 통과
})
test('Falsy test', () => {
expect(1 - 1).toBeFalsy(); // 통과
})
toBeGreaterThan / toBeGreaterThanOrEqual / toBeLessThan / toBeLessThanOrEqual
숫자를 받아 검증할 값이 크다, 크거나 같다, 작다, 작거나 같다를 판별한다.
test('greater than test', () => {
const id = 'the_man' // 길이 7
expect(id.length).toBeGreaterThan(5); // 통과
})
test('greater than or equal test', () => {
const id = 'the_man'
expect(id.length).toBeGreaterThanOrEqual(7); // 통과
})
test('less than test', () => {
const id = 'the_man'
expect(id.length).toBeLessThan(10); // 통과
})
test('less than or equal test', () => {
const id = 'the_man'
expect(id.length).toBeLessThanOrEqual(7); // 통과
})
JS에서는 숫자를 다룰 때 주의해야한다.
0.1 + 0.2 = 0.3 이 아니다.
이유는 컴퓨터는 10진법을 2진법으로 변환 뒤 계산하기에 이를 다시 10진법으로 변환시 무한소수의 오차가 발생하게 되기 때문이다.
이는 toBeClose라는 matcher 함수를 이용해 근사치를 계산해도 되고, Math의 floor등 다양한 메서드를 이용하면 된다.
toMatch()
정규 표현식을 이용한 문자열 테스트
test('match test', () => {
expect("Hello World").toMatch(/H/); // 통과
})
toContain()
배열에 요소가 있는지 확인 여부 테스트
test('contain test', () => {
const user = 'Mike';
const userList = ['Tom', 'Mike', 'Kai'];
expect(userList).toContain(user); // 통과
})
toThrow()
예외 작업에서 throw 에러가 발생한지 여부를 확인하는 테스트 함수
test('throw test1', () => {
expect(() => 임시함수.test()).toThrow(); // test함수에서 throw 에러가 발생하면 통과
})
// toThrow에서는 특정 에러를 확인할 수 있다.
test('throw test2', () => {
expect(() => 임시함수.test()).toThrow('xx'); // test함수에서 throw 에러가 'xx'로 발생하면 통과
})
추가적인 matcher의 종류는 아래의 링크에서 확인하자
이후에는 React의 컴포넌트를 테스트해주는 testing-library/react에 대해 알아보자.
testing-library/react 는 Jest 베이스를 하기에 사전 지식으로 Jest에 대해 조사해보았다.