연관 내용
[cypress : E2E 테스트]
코드에 변화가 있을 때마다 직접 브라우저에 들어가서 모든 기능을 전부 체크해보는 것은 효율적이지 않고, 빈틈이 있을 수 있다.
그래서 테스트 코드가 필요하다!
테스트 주도 개발을 의미한다.
테스트 코드를 먼저 작성하고 그 후에 테스트를 통과하기 위한 최소한의 실제 코드를 작성한다.
Why?
그래서 아예 테스트 문화를 만들기 위해서 테스트 코드를 먼저 작성하는 것이다.
장기적으로 전체적인 퀄리티를 높일 수 있는 방법이다. ⭐️
상황에 따라 나눠진다.
프로젝트 규모가 클 경우, 처음 만들 때부터 테스트 코드를 같이 만든다.
규모가 작으면 처음에는 기능만 만들어서 배포를 하고, 배포한 이후에 추가 기능을 준비하면서 1차 기능에 대한 테스트 코드를 작성한다.
Unit Test 단위 테스트
버튼 클릭과 같은 개별 기능 별 테스트
Integration Test 통합 테스트
여러 기능을 연쇄적으로 한꺼번에 테스트
(cypress를 이용한다.)
E2E 테스트(End to End)
실제 유저 플로우를 따라 접속해서 로그인하고 구매하는 등의 특정 루트나 시나리오가 있는 테스트
(cypress를 이용한다.)
Jest라는 테스트 전용 프레임워크를 이용할 수 있다.
Jest는 페북이 만들었다 ㅎ_ㅎ
[Jest]
위에 체크된 것이 가장 많이 사용하는 것 두가지이다.
Unit Test를 위해서 Jest와 Testing Libarary를 설치해보자!
❌ 이 명령어는 처음에 앱을 만들 때부터 jest가 있는 상태로 만드는 것이다.
(우리가 할 것은 이미 앱이 있는 상태에서 jest를 추가하는 거라서 이거 아님)
yarn add --save-dev jest @testing-library/react @testing-library/jest-dom
jest.config.js
파일 생성하고 아래 공식 문서 내용 붙여넣기
// jest.config.js
const nextJest = require('next/jest')
const createJestConfig = nextJest({
// Provide the path to your Next.js app to load next.config.js and .env files in your test environment
dir: './',
})
// Add any custom config to be passed to Jest
const customJestConfig = {
// Add more setup options before each test is run
// setupFilesAfterEnv: ['<rootDir>/jest.setup.js'],
// if using TypeScript with a baseUrl set to the root directory then you need the below for alias' to work
moduleDirectories: ['node_modules', '<rootDir>/'],
testEnvironment: 'jest-environment-jsdom',
}
// createJestConfig is exported this way to ensure that next/jest can load the Next.js config which is async
module.exports = createJestConfig(customJestConfig)
package.json
에 테스트 명령어를 추가한다."scripts": {
... ,
"test": "jest --watch"
}
yarn test
명령어를 입력하면 test를 진행할 수 있다.
watch
가 있으면 테스트 진행 후 자동 종료되지 않고, 변경사항이 생길 때마다 테스트가 계속 다시 이루어진다.
__test__
폴더를 만든다.__test__
폴더를 따로 만들었다.yarn add -D eslint-plugin-jest
안하면 eslint 에러남ㅎㅎ
eslint.rc
의 plugins 배열 안에 "jest/globals"
를 추가한다.yarn add -D jest-environment-jsdom
🚨 Error
Command failed with exit code 127
에러가 떠서
yarn add --dev jest
를 다시 했더니 해결됐다. 굿
yarn test
class/__test__/34-01-jest/index.test.ts
import { add } from "../../pages/34-01-jest/index";
it("더하기 잘 되는지 테스트해보기", () => {
const result = add(3, 5);
expect(result).toBe(8);
});
검사할 파일
export const add = (a: number, b: number) => {
return a + b;
};
요기서 에러가 발생해서 버전을 낮춰줬다.
yarn add -D @testing-library/react@12.1.2
import { render, screen } from "@testing-library/react";
import "@testing-library/jest-dom/extend-expect";
import JestUnitTestPage from "../../pages/34-02-jest-unit-test";
it("내가 원하는대로 그려지는지 테스트하기", () => {
render(<JestUnitTestPage />);
const myText1 = screen.getByText("철수는 13살입니다.");
// 렌더링된 화면에서 텍스트를 가져온다.
expect(myText1).toBeInTheDocument();
// document에 텍스트가 있는지 확인해준다.
const myText2 = screen.getByText("철수의 취미 입력하기:");
expect(myText2).toBeInTheDocument();
const myText3 = screen.getByText("철수랑 놀러가기");
expect(myText3).toBeInTheDocument();
});
테스트할 파일
export default function JestUnitTestPage() {
return (
<div>
<div>철수는 13살입니다.</div>
철수의 취미 입력하기: <input type="text" />
<button>철수랑 놀러가기</button>
</div>
);
}
class/__test__/34-03-jest-unit-test-snapshot/index.test.tsx
import { render } from "@testing-library/react";
import JestUnitTestSnapshotPage from "../../pages/34-03-jest-unit-test-snapshot";
it("컴포넌트가 기존이랑 바뀐 게 없는지 비교해보자 - 스냅샷 테스트", () => {
const result = render(<JestUnitTestSnapshotPage />);
expect(result.container).toMatchSnapshot();
});
snapshots 폴더가 생긴다.
describe
describe를 이용하면 여러개의 테스트를 한 파일에 만들 수도 있다.
describe("나만의 테스트 그룹 만들기", () => { it("내가 하고싶은 테스트-1", () => {}); it("내가 하고싶은 테스트-1", () => {}); it("내가 하고싶은 테스트-1", () => {}); it("내가 하고싶은 테스트-1", () => {}); });