TDD : test driven development의 약자로 테스트 주도 개발을 뜻한다.
테스트 코드를 “먼저” 작성하고, 테스트 코드를 PASS 할 수 있는 실제 코드를 작성 후 리팩토링을 거치는 과정으로 개발한다.
Jest
: 페이스북에서 만들어서 React와 더불어 많은 자바스크립트 개발자들로 부터 좋은 반응을 얻고 있는 테스팅 라이브러리다.
Jest
설치는 패키지 매니저를 통해 손쉽게 할 수 있으며 CRA를 통해 프로젝트 생성시 자동으로 설치가 되어있다.
yarn add jest
설치 후 package.json
에서 script를 추가해준뒤 yarn test 커맨드를 통하여 테스트를 진행할 수 있다.
"scripts": {
"test": "jest",
},
Jest
가 test 파일로 인식하는 경우는 다음과 같다.
기본적인 test.js 파일의 구조는 다음과 같다.
describe("테스트들의 집합 이름", () => {
test("1번 test 설명", () => {
/**
* 컴포넌트 가져오는 부분은 생략 ..
*/
// toXXX -> 아래 설명의 matcher !
expect("test 대상").toXXX("test 결과");
});
it("2번 test 설명", () => {
expect("test 대상").toXXX("test 결과");
});
});
쿼리함수 : 페이지에서 요소를 찾기 위해 테스트 라이브러리가 제공하는 여러가지 유형의 방법. (차이점은 요소 미발견 시 오류 발생 여부 혹은 Promise 반환 및 재시도 여부이다.)
getBy...
queryBy...
findBy...
(비동기 처리 요소 사용)
msw
: Mock Service Workerd의 약자로 네트워크 호출을 가로채는 API 모킹(mocking) 라이브러리이다.
백엔드에서 데이터를 가져오는 부분을 테스트할때 실제 백엔드에 요청을 날리지 않고,msw
를 사용하면 가자 api response 를 생성하여 테스트 할 수 있다.
먼저 handler.js
를 만들어준다.
import { rest } from 'msw';
export const handlers = [
// http://localhost:3000/test 요청시 반환함
rest.get('http://localhost:3000/test', (req, res, ctx) => {
return res(
ctx.json([
{
name: 'hoon'
}
])
)
})
];
server.js
파일을 생성해 mocking server를 생성해준다.
import { setupServer } from "msw/node";
import { handlers } from "./handlers";
export const server = setupServer(...handlers)
테스트 관련 설정을 해주는 setupTest.js
파일에서 서버와 관련된 셋팅을 해준다.
import '@testing-library/jest-dom';
import { server } from './mocks/server';
// 테스트 시작전 서버 listen
beforeAll(() => server.listen());
// 각 테스트 끝난 후 핸들러 초기화
afterEach(() => server.resetHandlers());
// 테스트 끝난 후 서버 close
afterAll(() => server.close());
이제 테스트 수행시 BE에 api 요청이 필요한 부분들은 자동으로 msw에 설정해준 response로 대체하여 테스트를 수행하게 된다 !
아래는 CRA로 프로젝트 생성시 기본으로 작성된 App.test.js
파일의 테스트 코드이다.
import { render, screen } from '@testing-library/react';
import App from './App';
test('renders learn react link', () => {
// App 컴포넌트 렌더링
render(<App />);
// learn react 라는 text 부분을 가져온다. ( /~/i 는 대소문자 구분용 )
const linkElement = screen.getByText(/learn react/i);
// 엘리먼트가 존재하는지 테스트 -> true
expect(linkElement).toBeInTheDocument();
});
yarn test
입력시 테스트가 진행되며 아래는 테스트 통과 부분이다.
여기까지가 기본적인 Jest
의 구조 및 테스트코드의 설명이다. 다음에는 matcher에 대해서 정리해보고 실제 테스트 코드를 정리해볼려한다.