artillery 라이브러리를 이용한 node 서버 부하 테스트
1. 주요 설정
target
요청을 보낼 서버 주소를 지정
phases
부하 패턴을 정의
phases:
- duration: 20
arrivalRate: 5
name: 'Warm up'
- duration: 60
arrivalRate: 15
name: 'Sustained load'duration: 진행 시간 (초)arrivalRate: 초당 요청 횟수name: 단계 이름
첫 번째 단계는 서버 워밍업, 두 번째 단계에서 실제 성능을 측정한다.
ensure
성능 합격 기준을 설정
ensure:
p95: 800
p99: 1500
maxErrorRate: 1p95 ≤ 800ms: 95%의 요청이 800ms 이내에 완료되어야 함p99 ≤ 1500ms: 꼬리 지연(tail latency) 허용 범위maxErrorRate: 1: 에러율 1% 초과 시 테스트 실패
think
요청 사이에 대기 시간
- think: 1 # 1초 대기2. 성능 지표 해석
mean: 전체 평균 응답 시간median: 중간값 (가장 흔한 응답 시간)p95: 95번째 백분위수p99: 99번째 백분위수
실무 기준
- 평균 체감 →
response_time.mean - 안정성 →
p95/p99 - 병목 판단 →
p95·p99급증 여부
3. 실행 방법
package.json 스크립트 설정
"scripts": {
"perf": "artillery run",
"perf:report": "artillery report"
}실행 명령어
npm run perf -- tests/artillery/scenarios/login.yml
4. 예제
테스트 데이터 (tests/artillery/data/users.csv)
email,password
buyer1@test.com,test1234
buyer2@test.com,test1234
buyer3@test.com,test1234
seller1@test.com,test1234
seller2@test.com,test1234시나리오 파일 (tests/artillery/scenarios/login.yml)
config:
target: '{{ $processEnvironment.TARGET_URL }}'
phases:
- duration: 30
arrivalRate: 5
name: 'Warm up'
- duration: 60
arrivalRate: 15
name: 'Sustained load'
defaults:
headers:
Content-Type: 'application/json'
payload:
path: '../data/users.csv'
fields:
- 'email'
- 'password'
skipHeader: true
ensure:
p95: 800
p99: 1500
maxErrorRate: 1
scenarios:
- name: 'Login'
flow:
- post:
url: '/api/auth/login'
json:
email: '{{ email }}'
password: '{{ password }}'
expect:
- statusCode: 200
- hasProperty: 'accessToken'
- think: 15. 결과 확인

- Metrics for period: 구간별 실시간 변화 확인
- Summary report: 전체 테스트 평균 확인