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 계산에서 오래걸렸는지 알기는 어렵다.