테스트 코드가 생기고, 부하 테스트까지 준비하는 과정에서 많고 다양한 mock 데이터가 필요했습니다.
특히, 부하 테스트 과정에서 가짜 유저들이 API를 날리는 상황을 만들어야 하는데, 저희는 검증된 토큰이 없는 경우 바로 401 Unauthorization
을 던져주기 때문에 이를 위한 방안이 필요했습니다.
부하 테스트는 단위 테스트와 다르게 DB도 연동하고, 서버도 띄운 상태에서 실제로 API를 날려 보는 과정이기 때문에 DB에 테스트를 위한 유저 데이터를 추가하고, 이 가짜 유저들을 활용해서 부하 테스트에 사용하고자 했습니다.
저희가 유저 데이터를 만들 때 필요한 데이터는 이메일 뿐입니다. 실제론 클라이언트에서 Google OAuth
로 로그인해서 받은 Access token
을 이용해 Google API
로 Resource Owner
의 이메일을 받아와서 회원 가입을 시켜줍니다. OAuth를 이용한 로그인 과정은 생략하고, 이메일을 이용해서 DB에 넣어주기로 했습니다.
import fs from 'fs';
import { faker } from '@faker-js/faker';
faker.seed(123);
const data = []
for (let i = 0; i < 500; i++) {
data.push({email: faker.internet.email()});
}
fs.writeFileSync('mock-user.json', JSON.stringify(data, null, 2));
테스트를 진행하면서 해당 유저의 데이터가 많이 쌓일 텐데, 이를 활용하고 싶었습니다. 그래서 생성되는 이메일이 항상 같도록 seed
를 설정해주었습니다. 그 외에 가짜 이메일을 생성하고 저장하는 로직은 간단하기 때문에 설명을 생략합니다.
[
{
"email": "[email protected]"
},
{
"email": "[email protected]"
},
{
"email": "[email protected]"
}
]
데이터 생성이 완료되면 위와 같은 이메일 데이터가 생성이 됩니다. 저희는 이 데이터를 받아서 회원가입을 해주는 Admin용 API를 만들어서 DB에 유저들을 저장했습니다. 기존에 작성되어 있던 서비스 코드를 그대로 활용하기 때문에 비교적 간단한 작업이었습니다.
faker의 장점은 간단하게 가짜 데이터를 생성할 수 있다는 것입니다. 테스트를 하며 학습 기록을 저장할 때 아래와 같은 데이터를 이용해서 저장하고 있었습니다.
{
date: '2023-11-23',
created_at: '2023-11-23T23:01:02+09:00',
type: 'finish',
learning_time: 3000,
}
위 데이터는 저장이 잘 되긴 하지만 항상 같은 데이터를 저장한다는 단점이 있습니다. 그래서 테스트의 결과가 단조로워지고, 성능 비교도 어렵습니다.
const finish_body = JSON.stringify({
date: moment(
faker.date.between({ from: '2023-11-23', to: '2023-11-30' }),
).format('YYYY-MM-DD'),
created_at: faker.date.between({ from: '2023-11-23', to: '2023-11-30' }),
type: 'finish',
learning_time: faker.number.int({ min: 60 * 30, max: 60 * 60 * 5 }),
});
위와 같이 faker를 활용한다면 다양한 테스트 데이터를 넣어 볼 수 있습니다.
그런데 위와 같은 코드를 k6 실행 스크립트에 넣으면 에러가 발생합니다. k6는 모듈을 자체적으로 로드하기 때문입니다. 그래서 외부 모듈을 사용할 수 없기 때문에, 라이브러리의 cdn을 import 해주어야 합니다 .
import moment from '<https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.4/moment.min.js>';
import faker from '<https://cdnjs.cloudflare.com/ajax/libs/Faker/3.1.0/faker.min.js>';