리액트의 컴포넌트를 테스트할 수 있다. 테스트 할 수 있는 컴포넌트는 다음과 같다.
각 팀의 컨벤션과 서비스에 따라 다른 선택을 할 수도 있다!
Jest는 JavaScript 테스트 러너입니다. DOM에 접근하게 하는 jsdom을 통해서 jsdom은 단지 어떻게 브라우저가 작동하는지에 대한 대략적 개요입니다. 하지만 이는 종종 React 컴포넌트를 테스팅 하기에 충분합니다. Jest는 mocking modules과 timers 같은 파워풀한 특징과 결합되어 훌륭한 반복속도를 제공합니다. 그래서 더 많은 코드 제어를 가집니다.
React Testing Library는 실행 디테일을 가지지 않는 React 컴포넌트를 테스트하게 하는 도구 모음입니다. 이러한 접근은 리팩 토링을 수월하게 하며 접근성에 대한 가장 좋은 연습을 가능하게 합니다. 자식 컴포넌트를 가지지 않는 컴포넌트에 대한 얕은 렌더링 방법을 제공하지 않더라도 Jest와 같은 테스트 러너는 mocking에 의해 위를 가능하게 합니다.
Jest는 페이스북이 만든 테스트 라이브러리이다. 제로설정, 스냅샷(오브젝트 저장), 테스트 코드의 분리, 단순한 API를 지원한다.
// package.json
{
"scripts": "jest --watch"
}
describe 함수는 테스트할 코드를 callback으로 받고 descrition부분에 주석을 달 수 있다. test 코드를 블록으로 묶는 역할을 하여 스코프를 공유하기도 한다.
describe('test asd.js file', callback)
it은 test의 alias이다. 둘 다 테스트 케이스를 만드는 함수이다. 과정과 결과를 첫 번째 인자에 남기고 callback 함수에 있는 코드를 테스트한다.
it('process and result', callback)
expect는 예상 객체를 반환한다. matcher를 사용하지 않으면 아무것도 할 수 없다.
matcher는 예상 객체를 확인한다. toBe와같은 matcher를 쓰면 원시값을 테스트할 수 있다.
it('two plus two is four', () => {
expect(2+2).toBe(4);
})
CRA를 하여 React 프로젝트를 다음과 같이 App.test.js파일이 만들어져 있다.
// src/app.test.js
import { render, screen } from '@testing-library/react';
import App from './App';
test('renders learn react link', () => {
render(<App />);
const linkElement = screen.getByText(/learn react/i);
expect(linkElement).toBeInTheDocument();
});
test함수의 callback 함수에 @testing-library/react의 render와 screen 함수가 사용되고 있다. render함수는 Dom에 컴포넌트를 렌더링한다. 따라서 컴포넌트를 인자로 받는다. 그리고 React-Test-Library에서 제공하는 쿼리 함수와 유틸리티 함수를 담고 있는 객체를 리턴한다. screen이라는 객체를 통해 쿼리 함수를 사용할 수도 있다.
쿼리 함수는 get, find, query 3종류로 나눠집니다. 테스트에 따라 적합한 쿼리 함수를 사용하는 것을 공식 홈페이지에서 권장합니다.
getBy... 함수의 인자로 들어온 값에 일치하는 노드를 반환합니다. 일치하는 요소가 없거나 둘 이상의 일치가 발생하면 오류를 발생시킵니다. getAllBy를 통해 둘 이상의 노드를 검색할 수 있습니다.
findBy... 함수의 인자로 들어온 값을 노드에서 찾으면 해결되는 promise를 반환합니다. 1000ms의 시간이 걸리거나 둘 이상의 요소가 발견되면 promise를 반환하지 않습니다. 마찬가지로 findAllBy로 둘 이상의 노드를 검색할 수 있습니다.
queryBy... 함수의 인자로 들어온 값을 노드에서 찾으면 반환해주고 없으면 null을 반환합니다. queryBy는 존재하지 않는 요소를 찾을 때 유용합니다. 둘 이상의 일치가 발생되면 오류를 발생하고 마찬가지로 queryAllBy를 사용할 수 있습니다.
jest와 testing-library는 eslint 지원이 됩니다.
yarn add -D eslint-plugin-testing-library eslint-plugin-jest-dom
{
"plugins": [
"testing-library",
"jest-dom"
],
"extends": [
"react-app",
"react-app/jest",
"plugin:testing-library/react",
"plugin:jest-dom/recommended"
]
}
TDD는 실제 코드를 작성하기 전에 Test코드를 먼저 작성하고 Test를 통과할 수 있는 실제 코드를 나중에 작성하는 것을 말한다.
디버깅 시간도 줄어들고, 안정적인 개발이 가능하다.