Locust로 테스트 시나리오를 작성하다보면 복잡한 코드를 구조적으로 구성해야하는 순간이 온다.

TaskSet은 테스트 코드를 계층적으로 구조화 할 때 유용하게 사용할 수 있다.

 

 


 

1. TaskSet

 

 

TaskSet은 User 클래스와 유사하게 사용할 수 있다.

단, User 클래스가 아니기 때문에 User 클래스 대신 사용하면 안된다.

 

 

from locust import HttpUser, task, TaskSet

class TaskSetTest(TaskSet):
    @task
    def test1(self):
    	self.client.get("/hello")
       
    @task(2)
    def test2(self):
    	self.client.get("/world")

 

 

위 코드를 보면 부모클래스로 HttpUser 대신 TaskSet을 상속받고 있다.

그 외에 나머지는 HttpUser를 사용하는 것과 동일하게 작성되어 있는걸 볼 수 있다.

 

이렇게 작성한 taskSet 클래스는 직접적으로 locust에서 사용할 수는 없다.

이 taskSet은 아래 User 클래스를 상속받은 클래스에서 사용할 것이다.

 

 

class UserClassTest(HttpUser):
    host = "https://localhost:8000"
    tasks = [TaskSetTest]

 

 

locust에서는 HttpUser를 상속받은 UserClassTest를 사용할 것이다.

 

미리 작성해둔 taskSet은 이 클래스에서 tasks = [] 형식으로 주입해 사용한다.

리스트 내부에 taskSet 클래스를 넣으면 클래스 내에 선언한 여러개의 task들이 리스트 안으로 들어간다.

그리고 locust를 실행하면 이 task들을 weight에 맞게 무작위로 선택하여 수행한다.

 

tasks 리스트 안에는 여러개의 TaskSet을 넣을 수 있다.

그리고 task를 추가하는 개념이기 때문에 아래에 UserClassTest만의 task를 만들 수 있다.

 

 

 

 

2. SequentialTaskSet

 

 

그렇다면 SequentialTaskSet은 무엇일까?

 

 SequentialTaskSet은 TaskSet에서 특징이 하나 추가되었다.

SequentialTaskSet을 부모클래스로 상속받고 task를 여러개 만들었다면, 위에서부터 순서대로 수행한다.

 

 

class SequentialTest(SequentialTaskSet):
    @task
    def test1(self):
    	self.client.get("/num1")
    
    @task
    def test2(self):
    	self.client.get("/num2")

    @task
    def test3(self):
    	self.client.get("/num3")

 

 

위와 같은 클래스가 있다고 했을 때, 이 클래스를 User 클래스에 넣어 수행하면

/num1 -> /num2 -> /num3 -> /num1 -> /num2 ...

이렇게 순서대로 수행하게 될 것이다. 

반응형

+ Recent posts