본문 바로가기

카테고리 없음

Inflearn 6주차 - TDD(테스트주도개발)

TDD(Test Driven Development)란?

테스트 주도개발이란, 실제 코드 작성하기 전 테스트코드를 작성하는 단계이다.

테스트 코드 작성 후 해당 테스트 코드를 Pass할 수 있는 실제 코드를 작성한다.

즉, 정리하면

테스트하고자하는 기능의 테스트 코드 작성 -> 테스트실행 Fail ->
테스트 코드에 맞는 실제 코드 작성-> 테스트 실행 Pass

의 순서로 진행된다.

 

이걸 왜 할까?

TDD를 하므로 많은 기능을 테스트하기에 소스 코드에 안정감 부여

디버깅 시간 감소 및 실제 개발 시간 감소

더욱 클린한 코드 작성

 

React Testing Library란?

구성 요소 작업을 위한 API를 추가해 DOM Testing Library 위에 구축된다.

*DOM Testing Library: DOM 노드를 테스트하기 위한 매우 가벼운 솔루션이다.

 

npx create-react-app ./으로 현재 작업 폴더에 리액트 앱 생성하고 테스팅할 때 React Testing Library를 사용하는데,

create react app으로 생성된 프로젝트의 경우 별도 설치 없이 사용 가능하다.

설치하려면 위와 같이 설치 명령어 입력한다.

 

테스팅 라이브러리에는 Enzyme과 React Testing Library가 있다.

Enzyme: 구현 주도 테스트

React Testing Library: 행위 주도 테스트

*구현 주도 테스트->UI 테스트시 p태그가 쓰였고 어떤 문자가 들어갔고 등등 구현 요소들에 대해 테스트한다.

만약 p태그를 h2태그로 바꾸게 되면 구현에 사용한 태그가 달라 에러가 날 것이다.

*행위 주도 테스트: 사용자의 입장에서 테스트. 어떤 이벤트가 발생시켰을 때 화면이 어떻게 변화하는지 등 사용자 관점에서의 event 발생시의 변화에 대한 테스트가 더욱 주를 이룸.

 

Jest란?

FaceBook이 개발한 테스팅 프레임 워크이다.

Test Case를 만들어 어플리케이션 코드가 잘 돌아가는지 확인해준다.

보통 Unit 테스트를 위해 사용한다.

 

Jest 사용을 위한 환경 세팅

1. 모듈 설치

npm install jest --save-dev

2. Test 스크립트 변경

"test" : "jest" or "jest --watchAll"

3. 테스팅 작성할 폴더 및 파일 기본구조 생성

 

Jest는 파일에 아래와같은 키워드(test, spec, tests)를 보고 Test파일을 찾는다.

 

Jest 파일 구조

describe 안에 test(it) 블록들이 나열된 구조이다. 위 코드에서 it은 test를 의미한다.

*describe(name,fn)는 여러 관련 테스트를 그룹화 하는 블록을 만든다.

*it은 개별 테스트를 수행하는 곳으로, 각 테스트를 작은 문장처럼 설명한다. 

 

각 테스트블록은 expect와 matcher를 쌍으로 가진다.

*expect 함수: 값을 테스트할 때마다 사용되며 matcher함수와 쌍으로 붙어다닌다.

*matcher: 다른 방법으로 값을 테스트하도록 matcher함수를 이용한다.

toBe => matcher 함수

테스트블록 실행시 올바른 테스트이므로 passed가 출력된다.

 

React Testing Library 주요 API

-> 테스팅 라이브러리들 설치

*render함수: DOM에 컴포넌트를 렌더링 하는 함수로, 인자로 렌더링할 컴포넌트를 넣어 사용한다.

 

expect-match 코드에서는 screen객체를 이용해 learn react라는 요소를 가져오는데 성공한다면 text는 성공할 것이다.

리액트 앱 설치 후 App.js파일에 들어가보면 learn react라는 문구가 실제 생성되어있다.

 

Query 함수에 대해서

https://testing-library.com/docs/queries/about/

 

About Queries | Testing Library

Overview

testing-library.com

쿼리 함수는 페이지에서 요소를 찾기 위해 테스트 라이브러리가 제공하는 방법이다.

 

쿼리유형은

-> 요소가 발견되지 않은 경우 쿼리에서 오류가 발생하는지 또는 Promise를 반환하고 다시 시도하는지 여부를 기준으로 나눠짐.

[쿼리 유형]

-getBy: 쿼리에 대해 일치 노드가 없다면 오류 발생시킴

-findBy: 쿼리에 대해 일치 노드가 없다면 null을 반환

-queryBy: 주어진 쿼리와 일치하는 요소 발견시 Promise반환 + 기본 제한 시간 지난 후(waitFor 사용)에는

요소가 발견되어도 악속 거부됩니다. -> findBy=getBy + waitBy를 합쳐놓은 성질이다.

 

코딩시 편리성을 더해주는 모듈들

[Prettier]

주로 코드 형식을 맞추는데 사용한다. 

VSCode Extension 가면 설치할 수 있다.

npm으로도 설치할 수 있는데, 이렇게 하면 여러 개발자와 같은 포맷을 유지하기에 좋다.

설치 후 Settings를 보면 Tab 간격, double or single quote 사용 등을 설정할 수 있다.

 

[ESLint]

개발자들이 특정 규칙을 가지고 코드를 일관성있고 깔끔하게 짤 수 있게 도와주는 라이브러리다.

자바스크립트 쓸 때 가이드라인, 문법 오류 메시지 보충(?)등의 역할을 한다.

주요 기능은 문법 오류 잡는것이다.

예를 들면 아래와 같은 코드를 작성했을 때 ESLint를 설치하지 않았다면 해당 코드에 대한 자세한 에러메시지 설명이 뜨지 않는다. 하지만 ESLint를 설치하면 에러 메시지에 대해 더 자세히 설명해준다.

ESLint를 설치하면 eslintrc.json 설정파일을 생성하고, package.json에서 eslintConfig 부분 지우고 생성한 eslint 설정파일에 붙여넣는다. -> PROBLEMS 탭에서 ESLint가 제공하는 경고들을 확인할 수 있게 함.

그리고 ESLint Testing Plugins를 설치한다. -> eslint에서 기본으로 제공하지 않는 다양한 규칙을 플러그인을 통해 사용할 수 있다. 아래 두 모듈을 설치해주면 -> react관련 린트설정 + react hooks에 관련된 규칙 적용 가능케 함.

 

->json파일에 플러그인에 대한 코드도 추가해준다.

\

아래 코드로 lint가 잘 작동하는지 확인한다.