Next.js로 앱을 처음 개발하고, 실제 서비스로 출시하기전 부하테스트를 해보려고 Artillery를 찾아보게되었는데, 너무 간단하고 쉬워서 공유를 해보려고 한다.
# Install
npm을 이용해 컴퓨터에 artillery를 설치해준다.
딴얘기긴한데, 공식 홈페이지 너무 잘만들어 놓은거같다. 디자인이 완전 취향....
npm install -g artillery
artillery -v로 잘 깔렸는지 확인하면 된다. 공룡 보고싶으신 분들은 artillery dino라고 치시길
# Quick Start
quick은 하나의 HTTP endpoint를 테스트 할때 사용한다. 예로들자면 다음과 같다.
count는 50명의 가상유저들, num은 각각의 유저들이 100번의 GET 요청을 보낸다는 옵션이다.
atrillery quick --count 50 --num 100 http://localhost:3000
- --output, -o <file>: 결과를 json으로 저장
- --insecure, -k: 안전하지 않은 TLS 연결을 허용
- --quiet, -q: 로그를 띄우지 않고 조용하게
- --content-type, -t <content type>: Request의 content-type을 설정, 기본값은 application/json
# Test Script로 더 자세한 테스트하기
Artillery는 yaml 형식의 Test script를 지원하고있다. Test script는 크게 테스트 자체를 설정하는 config 부분과, 가상유저들의 행동, 테스트 케이스를 설정하는 scenarios 부분이있다. 아래는 그 설정파일의 예시다.
주석을 통해 어떤의미인지 적어두었는데, 공식문서를 통해 차근차근 보려면 여기를!
config:
# 테스트 타겟. hostname, IP, URI가 될 수 있다.
target: "http://localhost:3000"
# timeout 시간은 7초
http:
timeout: 7
# 가상유저를 생성하는 방법
phases:
# 50명의 가상유저들을 5분동안 매 초 생성하되,
# 100명 이상의 동시 유저들은 없게 만드는 케이스.
- duration: 300
arrivalRate: 50
maxVusers: 100
# 사용할 변수들
variables:
# 변수의 이름은 typeNumbers이고, 1~17까지의 숫자를 가졌음
typeNumbers:
- [1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,16,17]
scenarios:
- flow:
# 루프를 돌면서 수행하려고함
- loop:
# GET http://localhost:3000/api/statistics?typeNumber=1
- get:
url: "/api/statistics"
# query parameter는 qs로 적어주어도되고, url에 바로 적어도된다.
qs:
typeNumber: "{{ $loopElement }}"
# POST http://localhost:3000/api/statistics
# Body에는 json으로 { typeNumber: 1 } 이런식으로 들어가게 됨
- post:
url: "/api/statistics"
json:
typeNumber: "{{ $loopElement }}"
# 변수 typeNumbers 요소들을 루프
# 1, 2, ... 17이 차례로 $loopElement에 할당됨
over: typeNumbers
Test script를 실행하기 위해서는 다음과 같이 명령어를 적어준다.
# Test script 이름이 config.yaml이고,
# 결과물을 report_h.json으로 저장할 것이다.
artillery run config.yaml -o report_h.json
# Report 분석
로그에서는 이렇게 출력이 될 것이고, json 파일에서는 aggregate부분을 보면 똑같은 값들이 보일것이다.
All VUs finished. Total time: 12 seconds
--------------------------------
Summary report @ 12:11:42(+0900)
--------------------------------
http.codes.200: ................................................................ 5000
http.request_rate: ............................................................. 298/sec
http.requests: ................................................................. 5000
http.response_time:
min: ......................................................................... 14
max: ......................................................................... 372
median: ...................................................................... 159.2
p95: ......................................................................... 223.7
p99: ......................................................................... 347.3
http.responses: ................................................................ 5000
vusers.completed: .............................................................. 100
vusers.created: ................................................................ 100
vusers.created_by_name.0: ...................................................... 100
vusers.failed: ................................................................. 0
vusers.session_length:
min: ......................................................................... 7663.6
max: ......................................................................... 8288.3
median: ...................................................................... 8186.6
p95: ......................................................................... 8352
p99: ......................................................................... 8352
- http.requests: HTTP 요청 수
- http.codes.200: 성공한 요청 수 (Status code = 200)
- http.response_time: 응답 시간(ms)
- -min: 최소값
- -max: 최대값
- -median: 중위값
- -p95: 95% 분포값
- -p99: 99% 분포값
'프로그래밍 > General' 카테고리의 다른 글
국기 이모지 동적으로 생성하기 (ISO 국가코드 사용) (0) | 2022.07.20 |
---|---|
버전 관리 - 버전 번호를 올리는 전략 (0) | 2022.07.11 |
SCP로 두 컴퓨터간 파일 옮기기 (Windows open ssh 설정) (0) | 2022.07.10 |
Cloudflare를 이용한 무료 HTTPS 설정 (with NGINX) (0) | 2022.07.02 |
[해결] Could not open a connection to your authentication agent (0) | 2022.06.17 |