08. 좋은 리액트 코드 작성을 위한 환경 구축하기
8.1 ESLint 를 활용한 정적 코드 분석
ESLint 살펴보기
ESLint 는 어떻게 코드를 분석할까?
- JS 코드를 문자열로 읽는다.
- JS 코드를 분석할 수 있는 파서(Parser)로 코드를 구조화 한다.
- 2번에서 구조화한 트리 AST(Abstract Syntax Tree)를 기준으로 각종 규칙을 대조한다.
- 규칙과 대조했을 때 이를 위반한 코드를 알리거나(Report) 수정한다(Fix).
eslint-plugin과 eslint-config
eslint-plugin
- eslint-plugin이라는 접두사로 시작하는 규칙을 모아놓은 패키지
eslint-config
- eslint-plugin을 묶어서 제공하는 패키지
나만의 ESLint 규칙 만들기
이미 존재하는 규칙을 커스터마이징해서 적용하기: import React를 제거하기 위한 ESLint 규칙 만들기
완전히 새로운 규칙 만들기: new Date 를 금지시키는 규칙
주의할 점
Prettier 와의 충돌
- Prettier란 코드의 포매팅을 도와주는 도구
규칙에 대한 예외 처리, 그리고 react-hooks/no-exhaustive-deps
- 일부 코드에서 특정 규칙을 임시로 제외시키고 싶다면, eslint-disable-주석 사용
// 특정 줄만 제외
console.log('hello world'); // eslint-disable-line no-console
// 다음 줄 제외
// eslint-disable-next-line no-console
console.log('hello world');
// 특정 여러 줄 제외
/* eslint-disable no-console */
console.log('JavaScript debug log');
console.log('eslint is disabled now');
/* eslint-enable no-console */
// 파일 전체에서 제외
/* eslint-disable no-console */
console.log('hello world');
ESLint의 버전 충돌
- 서로 다른 버전의 ESLint가 설치 되어 에러가 발생하면 ESLint를 peerDependencies로 설정하길 권장
8.2 리액트 팀이 권장하는 리액트 테스트 라이브러리
React Testing Library 란?
- DOM Testing Library를 기반으로 만들어진 테스팅 라이브러리
- jsdom 사용 시 DOM을 불러오고 조작 가능 ⇒ 브라우저를 직접 실행해 리액트 컴포넌트가 원하는 대로 렌더링 되고 있는지 확인 가능
자바스크립트 테스트의 기초
- 테스트할 함수나 모듈을 선정한다.
- 함수나 모듈이 반환하길 기대하는 값을 적는다.
- 함수나 모듈의 실제 반환 값을 적는다.
- 3번의 기대에 따라 2번의 결과가 일치하는지 확인한다.
- 기대하는 결과를 반환한다면 테스트는 성공이며, 만약 기대와 다른 결과를 반환하면 에러를 던진다.
- 어설션(assertion): 테스트 결과를 확인할 수 있도록 도와주는 라이브러리
리액트 컴포넌트 테스트 코드 작성하기
컴포넌트 테스트 순서
- 컴포넌트를 렌더링한다.
- 필요하다면 컴포넌트에서 특정 액션을 수행한다.
- 컴포넌트 렌더링과 2번의 액션을 통해 기대하는 결과와 실제 결과를 비교한다.
사용자 정의 훅 테스트하기
- 테스트 코드 작성 추가 및 모든 테스트 케이스 추가의 단점을 해결하기 위한 라이브러리 ⇒ react-hooks-testing-library
테스트를 작성하기에 앞서 고려해야 할 점
- 테스트 커버리지 맹신은 금물 ⇒ TDD(Test Driven Development: 테스트 주도 개발)은 테스트를 우선시 하여도 서버 코드와 다르게 사용자의 입력이 자유롭기에 모든 상황을 커버해 테스트하기란 불가능
- 때로는 TDD 대신 QA 를 믿고, 빠르게 개발할 수 밖에 없는 상황 존재
- 애플리케이션에서 가장 취약하거나 중요한 부분을 파악하는 것이 최우선
그 밖에 해볼 만한 여러 가지 테스트
-
유닛 테스트(Unit Test)
각각의 코드나 컴포넌트가 독립적으로 분리된 환경에서 의도된 대로 정확히 작동하는지 검증하는 테스트
-
통합 테스트(Integration Test)
유닛 테스트를 통과한 여러 컴포넌트가 묶여서 하나의 기능으로 정상적으로 작동하는지 확인하는 테스트
-
엔드 투 엔드(End to End Test)
흔히 E2E 테스트라 하며, 실제 사용자처럼 작동하는 로봇을 활용해 애플리케이션의 전체적인 기능을 확인하는 테스트