2

我有来自 locustio 文档的下一个代码:

from locust import HttpLocust, TaskSet, between

def login(l):
    l.client.post("/login", {"username":"ellen_key", "password":"education"})

def logout(l):
    l.client.post("/logout", {"username":"ellen_key", "password":"education"})

def index(l):
    l.client.get("/")

def profile(l):
    l.client.get("/profile")

class UserBehavior(TaskSet):
    tasks = {index: 2, profile: 1}

    def on_start(self):
        login(self)

    def on_stop(self):
        logout(self)

class WebsiteUser(HttpLocust):
    task_set = UserBehavior
    wait_time = between(5.0, 9.0)

在 locust 日志和 locust web (localhost:8089) 我看到了下一个任务

- /login
- /logout
- /
- /profile

但是,如果我需要在一项任务中获得很少的请求并从完整任务(不是 1 个请求)中获取度量,该怎么办。
我想看到的是:

- login
- logout
- index
- profile

我想查看任务名称而不是请求 url。在 Jmeter 中,我可以在一个操作中插入少量请求并获得操作时间(不是请求)。

4

2 回答 2

5

您可以name为每个请求按属性设置名称,请参见示例:

def index(l):
  l.client.get("/", name="index")

def profile(l):
  l.client.get("/profile", name="my-profile")
于 2020-04-20T14:48:52.107 回答
1

您可以通过实现execute_task()触发 request_success 事件的自定义方法来实现此目的。

像这样的东西应该工作:

import time

class TaskReportingTaskSet(TaskSet):
    def execute_task(self, task, *args, **kwargs):
        start = time.time()
        try:
            super().execute_task(task, *args, **kwargs)
        except:
            events.request_failure.fire(
                request_type="task",  
                name=task.__name__, 
                response_time=(time.time()-start)*1000, 
                response_length=0,
            )
            raise
        else:
            events.request_success.fire(
                request_type="task",  
                name=task.__name__, 
                response_time=(time.time()-start)*1000, 
                response_length=0,
            )

class UserBehavior(TaskReportingTaskSet):
    tasks = ...

使用上面的代码,如果 TaskSet 继承自 ,将报告所有任务的运行时间TaskReportingTaskSetrequest_success如果要包含on_start和 ,则必须单独触发事件on_stop

如果您不想报告 HTTP 请求,您可以简单地使用不是内置 Locust HTTP 客户端之一的 HTTP 客户端。例如,您可以直接使用 python 请求:

import requests

def index(l):
    requests.get("/")
于 2020-04-14T09:27:00.797 回答