💡 Testing을 하는 이유
Component의 개수가 몇개 되지 않을 때는 전체의 흐름을 파악한다거나
상황에 따라 코드를 수정하는것이 어려운 일이 아니다.
하지만, Applcation이 점점 커지면서 Component가 많아지게 되면
작성자 본인 뿐만아니라, 협업을 해야하는 동료들 또한
전체적인 흐름의 파악이 어려워지기도 한다.
파악이 어려워질수록 의도된 동작을 하지 않을 수 있고,
문제를 해결하기 위해 Debugging에 시간을 많이 써야할 수 있다.
Test 코드를 작성하게 되면
더 많은 이점들이 있겠지만 결국 얻고자하는 것은
안정적인 소프트웨어를 만들 수 있다는 것이라 생각한다.
알아볼 라이브러리는 jest와 react-testing-library다.
mocha, jasmine과 같은 다른 testing 라이브러리도 있지만
이번 시리즈에서는 CRA로 프로젝트르 만들면 장착되어있는
라이브러리/프레임워크들에 대해서 알아보려고 한다.
Enzyme은 예전에 많이 썼지만, 최근에는 RTL을 더 많이 사용한다고 한다.
아래와 같은 차이점이 있다.
describe
⇒ Test들을 묶어서 Block화it
⇒ 개별 테스트expect
⇒ 값을 테스트할 때 사용 ( matcher와 함께 사용 )matcher
⇒ 다른 방법으로 값을 테스트하기 위해 사용아래 코드의 두번째 it에서 .toBe("applebanana")가 matcher이다.
expect에서 연산된 값과 다른 형태로 값을 넣어 확인할 수 있다.
describe("fruits test", () => {
it("apple test", async () => {
expect().matcher()
})
it("apple + banana", async() => {
expect("apple" + "banana").toBe("applebanana")
})
...
});
아래 설명들은 CRA로 만든 프로젝트의 App.js를기반으로 한다.
import logo from './logo.svg';
import './App.css';
function App() {
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
</div>
);
}
export default App;
render
screen
- render함수의 return을 대체하여 사용하기 위해 사용
- render함수는 destructuring 하여 값을 가져와야하는데
screen은 query들을 다 가지고 있음
import { render, screen } from '@testing-library/react';
import App from './App';
test('renders learn react link', () => {
render(<App />);
// const { getByText } = render(<App />);
const linkElement = screen.getByText(/learn react/i);
expect(linkElement).toBeInTheDocument();
});
screen.getByText(/hi react/i); // Error
screen.queryBy(/hi react/i); // Error
screen.queryBy(/hi/i); // null
waitFor
⇒ 일정 기간동안 기다려야할 때 사용screen.findByText(/Learn React/i);
await waitFor(() => { screen.getByText(/Learn React/i) })
yarn add eslint-plugin-testing-library eslint-plugin-jest-dom --dev
App.test.js 에서 잘못된 부분들을 잡아주는것을 확인할 수 있다.
{
"extends": [
"react-app",
"react-app/jest",
"pulgin:testing-library/react",
"plugin:jest-dom/recommended"
],
"plugins": [
"testing-library",
"jest-dom"
]
}