Tang's
탕로그
Tang's
전체 방문자
오늘
어제
  • 분류 전체보기 (35)
    • FRONTEND (26)
      • JavaScript (6)
      • Algorithm (2)
      • CSS (2)
      • React (5)
      • Next.js (1)
      • 기타 (4)
      • 임시 (1)
      • 백만가지 ERROR (4)
      • 면접준비 (0)
      • project (1)
    • BACKEND (2)
      • Node.js (1)
      • MongoDB (1)
    • TODAY (7)
      • 생각 (1)
      • 회고 (6)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 폴더 권한 확인
  • jest nextjs typescript
  • nginx-proxy-manager
  • Turbopack
  • 신입 프론트엔드 개발자
  • Next.js 14
  • 프론트엔드 면접질문
  • 개발자 회고
  • yarn create next-app
  • modal 제어
  • 프론트엔드 개발자 회고
  • partial prerendering
  • 폴더 권한 변경
  • linux 폴더 권한
  • 폴더 권한 설정
  • 회고
  • jest recoil
  • nextjs ci/cd
  • nextjs metadata
  • server action
  • jest react-query
  • jest 초기 세팅
  • docker-compose ci/cd
  • ec2 권한 설정
  • props와 state 차이점
  • jest
  • Nextjs docker
  • React
  • 신입 프론트엔드 개발자 회고
  • display:flex

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Tang's

탕로그

FRONTEND/React

[테스팅 초기 설정] Jest + yarn-berry + Nextjs + Recoil + TypeScript

2023. 6. 30. 19:36

[아코하] 프로젝트에서 Jest를 적용하기 위해 세팅이다.

 

프로젝트 환경

- yarn-berry 3.3.1

- Next.js 13.1.2

- Recoil 0.7.6

- TypeScript 4.9.4

- Jest 29.5.0

 

 

1. 프로젝트 시작 & 관련 모듈 설치

yarn create next-app --typescript

CNA를  TypeScript 로 설치해주고,

 

yarn add -D jest @types/jest jest-environment-jsdom ts-jest babel-jest

Jest 와 관련 라이브러리도 설치해준다.

- jest : 단위테스트에 적합한 테스팅 라이브러리

- jest-environment-jsdom : Jest 28 버전 이후부터는 테스팅환경을 jsdom이 아니라 이 패키지로 추가 설치하고 적용시켜줘야 한다.

- ts-jest : Jest는 내부적으로 babel-jest로 컴파일하기 때문에, 타입스크립트 적용을 위해 설치한다.

- babel-jest : Jest는 기본 es5를 기준으로 동작하기 때문에 es6 환경을 사용하기 위해서 필요하다

 

 

yarn add -D @testing-library/react @testing-library/react-hooks @testing-library/user-event @testing-library/dom @testing-library/jest-dom

본격적으로 testing을 위해 testing 라이브러리들도 설치해준다.

@testing-library/react : React 환경 테스팅을 위해 필요

@testing-library/react-hooks : useExample과 같은 커스텀 훅을 테스팅하기 위해 필요

@testing-library/user-event : click()과 같은 실제 사용자가 이용하는 것과 비슷한 테스팅을 위해 필요

@testing-library/dom : matcher. dom 엘리먼트를 찾아내는데 필요한 메서드를 포함한 라이브러리. ex) getByRole

@testing-library/jest-dom : custom matcher를 위해 필요. ex) expect(dom).toBeInTheDocument()

 

Jest 관련 라이브러리들을 설치했다면, 이제 추가적으로 주변 config 파일들도 셋팅해준다.

 

 

package.json 설정

    "test": "jest --watch --passWithNoTests",
    "test:ci": "jest --ci --passWithNoTests",
    "coverage": "jest --coverage",

 

script에 jest 실행을 추가한다.

--watch : 파일이 변경되면 해당 파일과 관련된 테스트를 다시 실행한다. 파일 변경시 모든 테스트를 다시 실행하려면 --watchAll

--passWithNoTests : 테스트 파일을 찾을 수 없을 때 테스팅 도구 모음을 통과시킨다.

https://jestjs.io/docs/cli#--passwithnotests

 

 

tsconfig.json 설정

"compilerOptions: {
	"baseUrl": "./src",
    "paths": {
    	"@/*": ["./*"],
        "@pages/*": ["pages/*"],
        "@components/*": ["components/*"],
        "@utils/*": ["utils/*"],
        "@hooks/*": ["hooks/*"],
        "@types/*": ["types/*"],
    }
}

보다 간결한 import를 위해 baseUrl과 paths 경로를 설정한다.

@pages/* : @는 root를 의미하며 root는 설정한 baseUrl이다. 따라서 ./src/pages/* 가 된다.

 

 

jest.setup.js 설정

import '@testing-library/js-dom/extend-expect';

jest.setup.js 파일을 생성한다. 이 파일은 Jest testing에서 공통적으로 사용할 환경을 적용한다.

@testing-library/js-dom의 custom matcher를 기본 사용하기 위해 import 한다.

 

* @testing-library/react/cleanup-after-each 는 @testing-library/react가 버전 업 되면서 자동으로 지원해줘서 더이상 필요하지 않다.

 

 

jest.config.js 설정

const nextJest = require('next/jest');

const createJestConfig = nextJest({
  dir: './',
});

const customJestConfig = {
  verbose: true,
  setupFilesAfterEnv: ['<rootDir>/jest.setup.js'],
  moduleNameMapper: {
    '^@/(.*)$': '<rootDir>/src/$1',
    '^@/images/(.*)$': '<rootDir>/public/images/*',
    '^nanoid(/(.*)|$)': 'nanoid$1',
  },
  transform: {
    '^.+\\.(ts|tsx)$': 'ts-jest',
    '^.+\\.(js|jsx)$': 'babel-jest',
  },
  transformIgnorePatterns: [`/node_modules/(?!nanoid)`],
  testEnvironment: 'jest-environment-jsdom',
};
module.exports = createJestConfig(customJestConfig);

Nextjs는 12버전부터 내부적으로 Jest를 지원한다. next.config.js의 설정을 적용시키기 위해 모듈을 불러오고 dir 경로 세팅을 해준다.

- verbose : 실행중에 Jest가 개별 테스트를 보고해야하는지 유무.

- setupFilesAfterEnv : jest.setup.js 설정파일을 적용시킬 경로. 여기서 사용하는 <rootDir> 디렉토리 root를 의미한다.

- moduleNameMapper : 이미지나 스타일같은 싱글 모듈을 Mocking 하지 않고 사용하기 위해 절대경로를 설정한다.

  아코하 프로젝트에서는 nanoid 라이브러리를 사용했기 때문에, 오류를 피하고 그대로 사용하기 위해 설정해줬다.

- transform : Jest가 매칭되는 해당 파일을 지정한 라이브러리로 컴파일한다. Jest의 기본 설정은 babel-jest

- transformIgnorePatterns : 여기에 적히는 라이브러리는 transform 되지 않는다. 마찬가지로 nanoid의 오류를 피하기위해 설정.

- testEnvironment : Jest 28버전 이후로는 jsdom이 아니라 jest-environmnet-jsdom 으로 환경 세팅 해줘야 한다.

 

 

추가로 eslint도 세팅해준다.

 

.eslintrc.json 설정

yarn add -D @typescript-eslint/parser
{
  "env": {
    "browser": true, //실행환경 설정
    "es6": true,
    "node": true
  },
  "extends": [ // 여기에 꼭 적어줘야 사용 가능
    "eslint:recommended",
    "plugin:react/recommended",
    "plugin:@typescript-eslint/recommended",
    "plugin:prettier/recommended"
  ],
  "overrides": [],
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "ecmaVersion": "latest",
    "sourceType": "module"
  },
  "plugins": ["react", "react-hooks", "@typescript-eslint", "prettier"],
  "rules": { // 설정 적용 유무 0: 적용x, 1: 적용
    "react/react-in-jsx-scope": 0,
    "react/prefer-stateless-function": 0,
    "react/jsx-filename-extension": 0,
    "react/jsx-one-expression-per-line": 0,
    "no-nested-ternary": 0
  }
}

 

끝!

테스팅을 처음 적용해서 그런지 환경 세팅부터가 만만하지않다. testing하는 라이브러리의 의존에 따라서 nanoid외에도 추가적으로jest.config.js를 계속 수정해야 할듯 하다..!

 

 

'FRONTEND > React' 카테고리의 다른 글

[React] 리액트 useState 개념  (0) 2022.12.02
[React] 리액트 Props / State의 개념과 차이점  (2) 2022.11.21
[React] 리액트 프로젝트 시작 세팅하기(CRA)  (0) 2022.11.20
[React] React.js 리액트 특징! 간단하게 알아보자  (0) 2022.11.16
    'FRONTEND/React' 카테고리의 다른 글
    • [React] 리액트 useState 개념
    • [React] 리액트 Props / State의 개념과 차이점
    • [React] 리액트 프로젝트 시작 세팅하기(CRA)
    • [React] React.js 리액트 특징! 간단하게 알아보자
    Tang's
    Tang's
    탕탕한 탕진의 기술 블로그!

    티스토리툴바