본문 바로가기
프로그래밍

로커스트(Locust) @task vs tasks 비교해보자

by bantomak 2025. 4. 9.
반응형

@task 데코레이터(decorator)

  • 특정 메서드를 부하 테스트용 task로 지정
  • User 클래스 또는 HttpUser 클래스의 메서드 위에 붙인다. (C# Attribute와 같은 개념)
  • 기본적으로 @task는 가중치(weight) 1을 갖고, @task(3) 이런 식으로 가중치를 추가할 수 있다. (3이면 3배 더 자주 호출)
from locust import HttpUser, task

class MyUser(HttpUser):
    
    @task
    def visit_homepage(self):
        self.client.get("/")

    @task(3)
    def visit_dashboard(self):
        self.client.get("/dashboard")

tasks 속성(attribute)

  • 특정 메서드가 아닌 특정 클래스를 task로 명시하는 방식
  • 주로 TaskSet 또는 User 클래스에서 사용한다.
  • 함수 또는 다른 TaskSet 클래스들을 리스트로 명시할 수 있으며, 가중치를 부여할수도 있다.
from locust import User, TaskSet, task

class MyTasks(TaskSet):
    @task
    def task_one(self):
        print("Running task one")

    @task
    def task_two(self):
        print("Running task two")

class MyUser(User):
    tasks = [MyTasks]

또는,

class MyUser(User):
    def task1(self):
        print("task1")

    def task2(self):
        print("task2")

    tasks = {task1: 1, task2: 3}  # task2가 더 자주 호출됨

tasks에 여러 클래스를 등록했을 경우

class TaskA(TaskSet):
    @task
    def task_a1(self):
        print("Task A1")
        self.interrupt()

class TaskB(TaskSet):
    @task
    def task_b1(self):
        print("Task B1")
        self.interrupt()

class MyUser(User):
    tasks = [TaskA, TaskB]

tasks로 등록한 TaskA와 TaskB가 동등하게 1:1 비율로 무작위 호출된다. 그리고 내부에 @task로 여러 매더스가 등록되어있다면 해당 매서드들도 동등한 비율로 무작위 호출된다.

self.interrupt() 매서드가 추가되었는데, 이유는 TaskSet은 기본적으로 무한 루프 구조로 동작한다. self.interrupt() 메서드를 호출하지 않으면 절대로 상위로 돌아가지 않는다. 해당 매서드를 제거하고 실행해 보면 바로 결과를 확인할 수 있다. A1만 계속 나오거나 B1만 계속 호출될 것이다.

@task와 tasks 같이 사용하는 예제

from locust import TaskSet, User, task

class TaskA(TaskSet):
    @task
    def task_a1(self):
        print("Task A1")
        self.interrupt()
    
    @task
    def task_a2(self):
        print("Task A2")
        self.interrupt()

class TaskB(TaskSet):
    @task
    def task_b1(self):
        print("Task B1")
        self.interrupt()
    
    @task
    def task_b2(self):
        print("Task B2")
        self.interrupt()

class MainTaskSet(TaskSet):
    tasks = [TaskA, TaskB]

class MyUser(User):
    tasks = [MainTaskSet]

언제 어떤 걸 써야하나?

  • @task 데코레이더 : 간단하게 메서드에 바로 지정 가능
  • tasks 속성 : 여러 함수/TaskSet 조합 가능, 가중치 딕셔너리 지원

같이 읽으면 좋은 글

 

Python 코드로 테스트 가능한 로커스트(Locust)

로커스트(Locust)란?로커스트(Locust)는 웹 애플리케이션, API, 웹소켓 등의 부하 테스트(Load Testing) 및 성능 테스트(Performance Testing)를 위해 많이 사용되는 오픈소스 툴이다. Python으로 작성되어 있으며

jettstream.tistory.com

댓글