본문 바로가기
성능과 튜닝/부하 테스트 도구 - 애플리케이션 (Locust)

locustfile 작성

by 안드레날린 2024. 9. 23.

locustfile 샘플 살펴보기

import time
from locust import HttpUser, task, between

class QuickstartUser(HttpUser):
    wait_time = between(1, 5)

    @task
    def hello_world(self):
        self.client.get("/hello")
        self.client.get("/world")

    @task(3)
    def view_items(self):
        for item_id in range(10):
            self.client.get(f"/item?id={item_id}", name="/item")
            time.sleep(1)

    def on_start(self):
        self.client.post("/login", json={"username":"foo", "password":"bar"})

 

class QuickstartUser(HttpUser):

사용자 클래스를 정의한다.

HttpUser를 상속하여 각 사용자에게 client 속성을 제공한다. 이는 HttpSession의 인스턴스로, 부하 테스트를 하려는 대상 시스템에 HTTP 요청을 하는데 사용할 수 있다.

테스트가 시작되면 시뮬레이션되는 모든 사용자에게 이 클래스의 인스턴스를 만들고 클래스에 정의된 내용을 수행한다.

유효한 locustfile이 되려면 User로부터 상속하는 클래스를 최소한 하나를 포함해야 한다.

 

wait_time = between(1, 5)

이 클래스의 각 작업(아래 참조)이 실행된 후 시뮬레이션된 사용자가 1 ~ 5초 동안 기다리게 하는 wait_time을 정의 한다.

 

@task
def hello_world(self):
    self.client.get("/hello")
    self.client.get("/world")

@task (Method decorated)는 locust 파일의 핵심이다.

실행 중인 모든 User에 대해 Locust는 해당 Method를 호출하는 greenlet (코루틴 또는 마이크로 스레드)을 만들고, 작업 내의 코드는 순차적으로 실행된다.

/hello에서 응답을 받기 전까지 /world는 호출되지 않는다.

 

@task
def hello_world(self):
    ...

@task(3)
def view_items(self):
    ...

@task로 선언된 두 개의 Method중 하나에 @task(3)과 같이 더 높은 가중치를 줄 수 있다.

QuickstartUser가 실행되면 hello_world 또는 view_items를 선택하여 실행된다. 작업은 무작위로 선택되지만 hello_world보다 view_items를 선택할 가능성이 3배 더 높아진다.

@task가 선언된 Method만 선택 된다.

 

self.client.get("/hello")

self.client 속성은 Locust에서 로깅되는 HTTP 호출을 할 수 있다.

HttpUser는 실제 브라우저가 아니므로 리소스를 로드하거나 페이지를 렌더링하기 위해 HTML 응답을 구문 분석하지 않지만 그래도 쿠키는 추적된다.

 

@task(3)
def view_items(self):
    for item_id in range(10):
        self.client.get(f"/item?id={item_id}", name="/item")
        time.sleep(1)

view_items 작업은 가변 쿼리 매개변수를 사용하여 10개의 다른 URL을 로드한다. Locust의 통계에서 10개의 별도 항목을 가져오지 않기 위해(통계가 URL에 그룹화되어 있기 때문) name 매개변수를 사용하여 모든 요청을 "/item"이라는 이름 항목 으로 그룹화 할 수 있다.

 

def on_start(self):
    self.client.post("/login", json={"username":"foo", "password":"bar"})

on_start Method는 사용자 시뮬레이션을 수행하기 전에 호출된다. 사용자 시뮬레이션을 중지 할 때는 on_stop Method를 호출 할 수 있다.