11. 노드 서비스 테스트하기

11.1. 테스트 준비 하기

jest 패키지 통해 자바스크립트 테스트 가능하고 파일명은 중간에 test나 spec을 넣으면 된다.
 
package.json에 test로 jest를 넣으면 npm test로 테스트 코드 실행 가능.
 
테스트 코드 실행하면 총 몇개 중에 몇개가 PASS인지 FAIL인지 알려준다.
 
간단한 함수는 expect().toEqual을 통해 1+1이 2인지 체크 해볼 수 있다.
test('one plus one is two', () => { expect(1 + 1).toEqual(2); });
 

11.2. 유닛 테스트

간단한것은 expect toEqual로 가능하지만 express를 사용하는 경우 req, res를 쓰는데 이건 간단하게 할 수가 없다. 실제 express를 가져와서 테스트하기에는 무리가 있으니 mocking을 해서 테스트함.
 
describe('isLoggedIn', () => [ const res = { status: jest.fn(() => res), send: jest.fn(), }; const next = jest.fn(); test('if logged in', () => { const req = { isAuthenticated: jest.fn(() => true), }; isLoggedIn(req, res, next); expect(next).toBeCalledTimes(1); }); test('if not logged in', () => { const req = { isAuthenticated: jest.fn(() => false), }; isLoggedIn(req, res, next); expect(res.status).toBeCalledWith(403); expect(res.next).toBeCalledWith('login required'); }); });
 
DB 연결해서 회원가입 등 정보를 추가하는 것을 테스트 돌리면 실패하는데 이 경우에는 모듈을 mocking 해야함.
jest.mock('../models/user'); const User = require('../models/user'); const { follow } = require('./user'); describe('follow', () => { const req = { user: { id: 1 }, params: { id: 2 }, }; const res = { }; const next = jest.fn(); test('find user, add to following, return success', async () => { User.findOne.mockReturnValue({ addFollowing(id) { return Promise.resolve(true); } }); await follow(req, res, next); expect(res.send).toBeCalledWith('success'); }); test('find user, add to following, return success', async () => { User.findOne.mockReturnValue(null); await follow(req, res, next); expect(res.status).toBeCalledWith(404); expect(res.send).toBeCalledWith('no user'); }); test('find user, add to following, return success', async () => { const message = 'DB error'; User.findOne.mockReturnValue(Promise.reject(message)); await follow(req, res, next); expect(res.send).toBeCalledWith('success'); }); });
 

11.3. test coverage

jest —coverage를 실행하면 커버리지를 확인 할 수 있음.
 
고치고 커버리지 확인해서 85%이상이나 일정 수준이 나오도록 점검.
 

11.4. 통합 테스트

유기적으로 잘 작동하는지 테스트하는 것이 integration test
 
npm i -D supertest
 
router에서 테스트

테스트 데이터베이스

config.json에 테스트용 db 설정
npx sequelize db:create --env test
 
beforeAll()에서 수행하기전에 해야하는 것을 하고 sequelize sync(); afterAll에서 sequelize.sync({ force: true });으로 초기화를 해준다.
예) abc라는 유저를 추가했으면 그 다음 테스트 수행에는 이미 존재해서 에러가 발생.
 
 

11.5. 부하 테스트

 
artillery를 통해 테스트
 
간단하게 총 요청수를 설정해서 한 주소로 보낼 수도 있고
 
설정파일을 작성해서 주소별로 요청하고 시나리오 flow 설정도 가능해보임.
전체적으로 걸린 시간의 총합만 알 수 있고 디비에서 시간이 오래걸렸는지 API 계산에서 오래걸렸는지 알기는 어렵다.