stress test(부하테스트)는 서버에 부하를 인위적으로 부여함으로서 서버의 성능을 테스트하는 것이다.
실제로 사용자들이 서비스를 이용할때 서버에 얼마나 많은 부하가 갈지 예측할 수 없으므로 가상의 사용자들을 만들어 예측할 수 있다.
npm i -D artillery
npm start
새로운 터미널을 띄운 후 아래와 같은 명령어를 입력하면 서버가 받은 요청을 확인 할 수 있다.
npx artillery quick --count 100 -n 50 http://localhost:3001
위 명령어는 100명의 가상사용자를 만들고 각각 50번 요청을 보내 총 5000번의 요청을 서버로 전달하는 명령어이다.

요청이 끝나면 다음과 같은 보고서를 확인 할 수 있다.
vusers.completed 로 5000번의 요청이 성공했음을 알 수 있고, http.codes.200으로 200응답을 5000보낸것을 알 수 있다.
response_time의 차이가 적을 수록 요청이 일관된 속도로 처리되었다는 것을 뜻한다. 즉 성능이 좋다는 의미로 해석할 수 있다.

사용자의 행동을 예상한 시나리오를 작성하여 여러 요청을 보낼 수 있다.
다음과 같이 사용자 login -> 사건 조회 -> 조회한 사건을 북마크한다는 시나리오를 작성했다.
config:
target: "http://localhost:3001"
phases:
- duration: 60
arrivalRate: 5
payload:
- path : "./test.csv"
fields :
- "uid"
- "password"
- path : "./case.csv"
fields :
- "caseId"
scenarios:
- flow:
- log: "login 시도"
- post:
url : "/guest/login"
json :
uid : "1234"
password : "1234"
capture:
json : "$.refreshToken"
as : "token"
- get:
url: "/case"
qs :
caseId : "{{caseId}}"
- log: "{{caseId}} 사건 조회 시도"
- log: "{{caseId}} 북마크 시도"
- post:
url: "/bookmark"
headers:
authorization: "refresh {{token}}"
json :
uid : "{{uid}}"
key : "{{caseId}}"
payLoad 테스트에 사용될 mock 데이터를 지정해 줄 수 있다.
나는 유저가 로그인을 하기위해 필요한 아이디, 패스워드와 함께, 조회할 사건 id를 csv 파일로 만들어 저장해주었다.

60초동안 30명의 사용자가 시나리오를 수행했을때 보고서이다.
이 중 500에러가 난 것을 볼 수 있는데, 같은 사용자가 이미 북마크한 사건을 북마크시도한 경우 나타나는 에러임을 확인했다
이 경우 500에러가 아닌 400에러등 다른 에러코드로 응답을 보내는게 맞는 듯.. (수정할 것)