이번 절에서는 하나의 라우터를 통째로 테스트해볼 것입니다.
"routes" 폴더에 "auth.test.js"를 작성합니다.
하나의 라우터에는 여러 개의 미들웨어가 붙어있고, 다양한 라이브러리가 사용됩니다.
이런 것들이 모두 유기적으로 잘 작동하는지 테스트하는 것이 통합 테스트 (integration test)입니다.
npm install -D supertest
Supertest 패키지를 사용해 auth 라우터들을 테스트할 것입니다.
Supertest를 사용하기 위해서는 app 객체를 모듈로 만들어 분리해야 합니다.
"app.js" 파일에서 app 객체를 모듈로 만든 후, "server.js"에서 불러와 Listen합니다.
"server.js"는 app의 포트 리스닝만 담당합니다.
npm start 명령어도 바뀐 파일에 맞게 변경합니다.
또한 테스트용 데이터베이스도 설정합니다.
통합 테스트에서는 데이터베이스 코드를 모킹하지 않으므로, 데이터베이스에 실제로 테스트용 데이터가 저장됩니다.
그러나 실제 서비스 중인 데이터베이스에 테스트용 데이터가 들어가면 안되므로,
테스트용 데이터베이스를 따로 만드는 것이 좋습니다. "config/config.json"에서 "test" 속성을 수정합니다.
테스트 환경에서는 "test" 속성의 정보를 사용해 데이터베이스에 연결하게 됩니다.
콘솔에 nodemocabird_test 데이터베이스를생성하는명령어를입력
npx sequelize db:create --env test
이제 테스트 코드를 작성하면 됩니다.
"routes/auth.test.js" 파일을 작성합니다. 로그인 라우터에 대한 테스트를 작성
beforeAll 함수가 추가되었습니다. 현재 테스트를 실행하기 전에 수행되는 코드입니다
여기에 sequelize.sync()를 넣어 데이터베이스에 테이블을 생성하고 있습니다.
비슷한 함수로 afterAll (모든 테스트가 끝난 후), beforeEach (각각의 테스트 수행 전), afterEach (각각의 테스트 수행 후)가 있습니다.
테스트를 위한 값을 설정하거나 외부 환경을 설정할 때 테스트 전후로 수행할 수 있는 함수입니다.
supertest 패키지로부터 request 함수를 불러와서 app 객체를 인수로 넣습니다.
여기에 get, post, put, patch, delete 등의 메서드로 원하는 라우터에 요청을 보낼 수 있습니다.
데이터는 send 메서드에 담아서 보냅니다.
그 후 예상되는 응답의 결과를 expect 메서드의 인수로 제공하면 그 값이 일치하는지 테스트합니다.
현재 테스트에서는 Location 헤더가 / 인지, 응답의 상태 코드가 302인지 테스트하고 있습니다.
done을 두 번째 인수로 넣어서 테스트가 마무리되었음을 알려야 합니다.
supertest를 사용하면 app.listen을 수행하지 않고도 서버 라우터를 실행할 수 있습니다.
통합 테스트를 할 때는 모킹을 최소한으로 하는 것이 좋지만, 직접적인 테스트 대상이 아닌 경우에는 모킹해도 됩니다.
테스트를 실행하면 실패합니다.
테스트용 데이터베이스에는 현재 회원 정보가 없습니다.
따라서 로그인할 때 LoginError가 발생하게 됩니다.
로그인 라우터를 테스트하기 전에 회원 가입 라우터부터 테스트해서 회원 정보를 넣어야 합니다
첫 번째 describe에서는 회원 가입을 테스트
두 번째 describe에서는 로그인한 상태에서 회원 가입을 시도하는 경우를 테스트합니다.
이때, 코드의 순서가 매우 중요합니다.
로그인한 상태여야 회원 가입을 테스트할 수 있으므로 로그인 요청과 회원 가입 요청이 순서대로 이루어져야 합니다.
이때 agent를 만들어서 하나의 상태에서 재사용할 수 있습니다.
@beforeEach는 각각의 테스트 실행에 앞서 먼저 실행되는 부분입니다.
회원 가입 테스트를 위해 아까 생성한 agent 객체로 로그인을 먼저 수행합니다.
end(done)으로 beforeEach 함수가 마무리되었음을 알려야 합니다.
로그인된 agent로 회원 가입 테스트를 진행합니다.
로그인한 상태이므로 '로그인한 상태입니다'라는 에러 메시지와 함께 거부됩니다.
테스트를 하면 성공을 합니다.
그런데 이전에 성공한 테스트를 다시 수행하면 이번에는 실패합니다.
테스트가 실패하는 이유는 이전 테스트에서 이미 "2erohcho@gmail.com"의 계정을 생성했기 때문입니다.
이처럼 테스트 후에 데이터베이스에 데이터가 남아있으면 다음 테스트에 영향을 미칠 수도 있습니다.
따라서 테스트 종료 시 데이터를 정리하는 코드를 추가해야 합니다. 보통 afterAll에 정리하는 코드를 추가합니다.
간단하게 sync 메서드에 force: true를 넣어 테이블을 다시 만들게 했습니다.
시퀄라이즈를 쓰지 않더라도 afterAll에 데이터를 정리하는 코드를 넣으면 됩니다.
테스트를 다시 수행하면 성공합니다.
이런 식으로 다른 라우터도 통합 테스트를 진행하면 됩니다.
다른 라우터 중에서도 로그인을 해야 접근할 수 있는 라우터가 있을 것입니다.
그럴 때는 마찬가지로 beforeEach 같은 함수에서 미리 로그인한 agent를 마련하면 됩니다.
'clone toy projects > node_express_sns' 카테고리의 다른 글
서비스 운영을 위한 패키지[morgan,express-session,시퀄라이즈,cross-env, sanitize-html, csurf] (0) | 2023.08.31 |
---|---|
부하 테스트 (0) | 2023.08.29 |
테스트 커버리지 (0) | 2023.08.27 |
유닛 테스트 (0) | 2023.08.25 |
테스트 준비하기 (0) | 2023.08.25 |