제스트는 테스트 코드를 찾고, 테스트를 실행하고, 실패인지 성공인지를 판단하는 테스트 러너. facebook 에서 개발하고 관리(https://jestjs.io/)
제스트만의 특징은
Html 요소를 탐색하는데 접근성 마커 즉, aria를 이용해 TDD를 작성함으로서 자연스럽게 접근성을 향상시키는 장점이 있음. 제스트가 요소를 aria를 통해 찾을 수 있다 == 스크린 리더들도 찾을 수 있다
npx create-react-app jest
yarn create react-app
jest가 기본적으로 함께 설치됨.
test실행을 위해
npm test
yarn test
제스트가 watch mode로 실행되는것을 확인.
watch mode
: 파일에 수정 사항이 감지될 경우 자동으로 테스트를 실행해주는 상태
💡 만약 제스트 실행 시 노드 버전 이슈로
이런 에러가 발생한다면 제스트와 관련된 패키지를 설치.npm i -D --exact jest-watch-typeahead@0.6.5
a
- 모든 테스트를 실행
f
- 실패한 테스트들만 실행
p
- 정규표현식에 해당하는 파일이름만 필터링
t
- 정규표현식에 해당하는 테스트만 필터링
enter
- 모든 테스트를 실행.
q
- 테스트 종료
시작부터 모든 테스트를 실행하도록 하고 싶다면 명령어 뒤에 --watchAll
을 붙여서 실행
실행 코드는 파일이름.test.js 형식을 가진다.
import { render, screen, fireEvent } from '@testing-library/react';
import App from './App';
// test(테스트에 대한 설명)
test('renders learn react link', () => {
render(<App />);
const linkElement = screen.getByText(/learn react/i);
expect(linkElement).toBeInTheDocument();
});
테스트의 설명
(자스민에서는 describe)테스트 함수
render(<App />
);에 접근)/learn react/i
뒤에 붙은 i는 대소문자를 구분하지 않겠다는 의미)matcher
함수 제스민의 ( ==.toBe()
함수)test('버튼이 제대로 잘 작동하고 있습니까?', () => {
render(<App />);
const button = screen.getByRole('button', { name: 'change to blue!' });
expect(button).toHaveStyle({ backgroundColor: 'red' });
});
getByRole( role, 찾아야할 요소 안의 텍스트 )
screen.getByRole('button', { name: 'change to blue!' })
-> change to blue라는 값을 가진 버튼이 있어야한다.
role
: aria에서 사용하는 요소의 역할을 의미하는 속성
<div role = "wrapper"/>
toHaveStyle 함수
: 요소가 특정한 CSS 스타일을 가지고 있는지 체크import { render, screen, fireEvent } from "@testing-library/react"
import App from "./App"
test("버튼이 제대로 동작하고 있나요", () => {
render(<App />)
const button = screen.getByRole("button", { name: "change to blue!" })
fireEvent.click(button)
// 버튼 요소를 클릭했을 때, 아래의 결과를 기대함
expect(button).toHaveStyle({ backgroundColor: "blue" })
expect(button.textContent).toBe("change to red!")
})
import "./App.css"
import { useState } from "react"
function App() {
const [buttonColor, setButtonColor] = useState("red")
function handleClick(e) {
setButtonColor(buttonColor === "red" ? "blue" : "red")
}
return (
<div className="App">
<button
style={{ backgroundColor: buttonColor }}
onClick={() => handleClick()}
>
change to {buttonColor === "red" ? "blue" : "red"}!
</button>
</div>
)
}
export default App
너무 멋져요♡