Artillety - stress test

nn·2023년 3월 16일

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에러등 다른 에러코드로 응답을 보내는게 맞는 듯.. (수정할 것)

profile
내가 될 거라고 했잖아

0개의 댓글