테스트

Locust 부하 테스트, REST API에 부하 주기 (2)

pepega 2023. 11. 18. 18:49

메뚜기

이전 글에서는

로컬 환경에 Locust를 설치하고 버전 확인까지 진행했습니다.

 

이번 글에서는

Locust를 실행하고 REST API에 부하를 준 뒤

결과를 확인해볼 예정입니다.

 

전체 코드

https://github.com/GHGHGHKO/sample-locust

 

 

테스트 코드 작성

 

우선 부하를 주기 위한 첫 테스트 코드를 작성합니다.

 

코드를 하나씩 분해해보겠습니다.

 

import time
from locust import HttpUser, task, between

 

locust package는 python 모듈로 다른 파일이나 패키지에서 사용 할 수 있습니다.

 

class QuickstartUser(HttpUser):

 

이 클래스는 HttpUser를 상속받습니다.

HttpUser는 각 User에게 HttpSession의 인스턴스인 client 속성을 제공하는데,

이를 사용하여 load testing 하려는 대상에 HTTP 요청을 보낼 수 있습니다.

테스트가 시작될 때 Locust는 각 User에 대해 이 클래스의 인스턴스를 생성합니다.

각 User는 자체 gevent 쓰레드에서 실행됩니다.

 

locustfile이 되려면 최소 하나의 User를 상속받은 클래스가 있어야 합니다. (위 코드에서는 HttpUser)

 

wait_time = between(1, 5)

 

이 클래스는 각 작업이 실행된 후

시뮬레이션된 User들이 1부터 5초 사이에 기다리도록 하는 wait_time을 정의합니다. (실제 상황 가정)

 

@task
def view_items(self):
...

 

@task로 decorated 된 메서드는 locustfile의 핵심입니다.

각각 실행 중안 User에 대해 Locust는 해당 메서드를 호출 할 때마다

greenlet(micro-thread)를 생성합니다.

 

self.client.get(url="/v1/gooseAuth/items")

 

self.client attribute를 사용하면

Locust에서 로깅될 HTTP 호출을 수행할 수 있습니다.

다른 종류의 요청이나 응답을 확인하는 방법은 client attribute / HttpSession 글을 참고하면 좋습니다.

 

@task
def view_items(self):
    self.client.headers = {
        "Content-Type": "application/json",
        "X-AUTH-TOKEN": self.x_auth_token
    }
    self.client.get(url="/v1/gooseAuth/items")
    time.sleep(1)

 

본격적으로 API를 호출합니다.

 

def on_start(self):
...

 

이 이름의 메서드는 각 시뮬레이션된 User가 시작 될 때 호출됩니다.

자세한 내용은 on_start, on_stop 메서드를 참고하면 좋습니다.

 

 

 

부하 주기

파일이 세팅되면

locustfile.py이 있는 곳에서 아래 명령어를 수행합니다.

$ locust --modern-ui

 

그냥 locust 명령어로 수행 할 수도 있지만

--modern-ui flag를 추가하면 새로운 버전의 Web UI를 사용 할 수 있습니다.

 

 

실행이 완료되면

http://localhost:8089 에 접속합니다.

 

 

parameter를 세팅합니다.

1초 간격으로 1명씩 사용자가 증가하며 10명까지 도달

 

Host에는 테스트 하고 싶은 URL을 지정합니다.

많은 부하를 주진 않았습니다.

세팅이 완료되면 START SWARM 을 클릭합니다.

 

 

결과를 확인하며 어디까지 부하를 줄 수 있는지 확인합니다.

 

 

아주 기초적인 내용으로 부하를 줘보았습니다.

조금 더 고급진 내용을 확인하고 싶으면

공식 문서를 확인해도 좋을 것 같습니다. :) 

https://docs.locust.io/en/stable/index.html

 

 

참고자료

https://docs.locust.io/en/stable/writing-a-locustfile.html

https://pypi.org/project/greenlet/

https://docs.locust.io/en/stable/writing-a-locustfile.html?#on-start-on-stop

https://docs.locust.io/en/stable/writing-a-locustfile.html#client-attribute-httpsession