지난 포스팅에선 단위 테스트에 많이 쓰이는 jest의 간단한 사용법과 모킹 함수가 무엇인지 정리했다.
이번에는 통합 테스트에서 많이 사용하는 supertest를 알아보겠다.
supertest란
ExpressJS 통합 테스트용 라이브러리
내부적으로(가짜로) 익스프레스 서버를 구동시켜 가상의 요청을 보낸 뒤 결과를 검증한다.
기능을 검증하는 단위 테스트들의 상호 연결이 잘 되었는지 확인하는 통합 테스트에서 사용한다.
API 서버를 만들고 HTTP 검증 도구로 슈퍼 테스트를 사용한다
supertest 설치 및 설정
1. 설치
npm i supertest -D
2. 테스트 데이터 베이스 설정
jest는 데이터베이스에 접근하지 않기 위해 모킹 함수를 써서 했다 치고 하고 값을 지정해주어 넘어갔지만,
통합 테스트는 직접 DB에 접근해서 데이터를 잘 가져오는지 확인도 해야 한다.
하지만 실제 DB에 접근하면 큰 문제가 될 수 있기 때문에 test DB를 만들어서 접근한다.
3. test DB 생성
npx sequelize db:create --env test
터미널에 위 코드를 입력해서 test DB 설정한 것을 만들어 준다.
4. 테스트 파일을 만들고 테스트 코드를 짠다.
// 예시
const request = require("supertest")
const express = require("express")
// 라우터
const app = express()
app.get("/user", (req, res) => res.json({ name: "alice" }))
request(app)
.get("/user")
.expect(200, { name: "alice" })
파일 이름 뒤 .test / .spec 을 붙여 파일을 생성한다.
5. 테스트 실행
npm test
jest와 마찬가지로 테스트를 실행한다.
before / after
테스트를 작성하다 보면 모든 테스트 함수에서 공통적인 로직이 발생할 수 있다.
혹은 변수의 데이터가 초기화되지 않고 남아있을 수도 있다.
따라서 다음 테스트를 진행하기 전에 변수를 초기화하거나, DB에 연결을 해야 하는 공통적인 로직이 있다면
이때 before / after을 사용한다. 테스트하기 전, 후에 데이터 정리, 연결, 초기화 등 을 위해 사용한다.
예시
//* 테스트 하기전 앞서 실행. 준비작업
beforeAll(async () => {
await sequelize.sync(); // 가짜 ORM 생성
});
... // 테스트 코드
// 테스트 후 마무리 작업
// afterAll을 안했을때는 처음에는 성공했는데 두번째는 실패하는 황당한 현상이 일어날 수 있다.
afterAll(async () => {
// 테이블을 다시 만듬 -> 기존 유저를 초기화
// 왜냐하면 이미 가입된 테스트 계정이 있을경우, 가입테스트 할 경우 충돌나니까 항상 테이블 초기화
await sequelize.sync({ force: true });
});
필자의 개인적인 이해와 정리
supertest는 jest와 비슷해 보이나 단위 테스트인지, 통합 테스트인지에 따라 어떤 것을 사용할지 선택해야 하고,
통합 테스트는 직접 test DB에 접근해서 데이터를 만지고, 단위 테스트는 모킹 함수를 이용해서 했다 치고 간편하게 테스트를 진행한다.
결과 값을 비교하는 것도 조금 다르다. 두 가지 모두 expect()를 사용하지만,
jest에서는 matcher 함수로 값을 비교하거나 몇 번 실행되었는지 확인한다면,
supertest는 예상되는 똑같은 값을 넣어 비교한다.
아래 블로그에서 많은 도움을 받았습니다.
'coding > JS' 카테고리의 다른 글
.prettierrc 설정 (0) | 2022.09.01 |
---|---|
소수점 반올림 (0) | 2022.08.30 |
jest 테스트 코드 작성 방법 (0) | 2022.08.11 |
class의 호이스팅 (0) | 2022.08.09 |
객체지향 class (ES5/ES6) (0) | 2022.08.09 |