如何基于标签或任务拆分Locust性能测试的图表曲线
问题说明
使用Locust对自研Java Web服务API开展压测时,已在压测脚本中通过@task注解拆分不同测试用例,同时添加@tag注解做维度标记,测试脚本示例如下:
from locust import HttpUser, task, tag import json class ProfileTest(HttpUser): @tag('base') @task def base(self): payload = {"msisdn": "6289000000"} headers = {'content-type': 'application/json'} self.client.post("/api/v1/profile/base", data=json.dumps(payload), headers=headers) @tag('generic') @task def generic(self): payload = {"msisdn": "6289000000"} headers = {'content-type': 'application/json'} self.client.post("/api/v1/profile/generic", data=json.dumps(payload), headers=headers)
启动Locust执行测试后,基础运行状态指标展示正常,但结果图表中未展示按标签、任务维度拆分的统计曲线,需要实现分维度的曲线展示。
实现方案
首先明确:Locust原生@tag注解的核心作用是筛选需要执行的任务集合,本身不会自动作为统计聚合维度,默认Web UI的聚合图表只会按请求URL做自动分组,要实现按标签/任务维度拆分曲线,可选择以下几种方案:
- 方案1:给请求添加
name参数指定分组名(优先推荐)
这是成本最低的实现方式,不需要额外依赖或自定义开发,只要在每个self.client请求调用中传入name参数,显式指定和任务/tag对应的分组名称,Locust就会自动按name值做指标聚合,在统计表格、结果图表中生成对应维度的拆分曲线。
修改后的请求代码示例:
修改后重新运行测试,即可在Charts页签看到对应分组的RPS、响应时间、失败率拆分曲线。# base任务对应的请求 self.client.post( "/api/v1/profile/base", data=json.dumps(payload), headers=headers, name="tag:base [用户基础信息查询]" ) # generic任务对应的请求 self.client.post( "/api/v1/profile/generic", data=json.dumps(payload), headers=headers, name="tag:generic [用户通用信息查询]" ) - 方案2:启动时通过标签参数筛选执行任务
如果需要单独观测某一类标签的测试结果,可以在启动Locust时通过--tags参数指定要执行的标签,例如执行locust -f your_locust_file.py --tags base时,Locust只会运行标记了base标签的任务,此时生成的所有统计结果、曲线都对应该标签维度。如果需要观测多个标签的拆分结果,还是需要配合方案1的name参数实现。 - 方案3:通过事件钩子自定义标签维度统计
如果脚本中任务量级大,不想逐个给请求加name参数,可以通过Locust提供的事件钩子实现自定义分组统计:监听请求完成事件,读取当前执行任务绑定的tag信息,手动按tag维度记录请求指标,即可将tag维度的统计数据接入Locust原生的统计模块,生成对应曲线。
注意:不要混淆标签筛选和统计分组的逻辑,原生标签能力不直接关联统计维度,所有自定义维度的统计都需要显式指定分组规则。
内容的提问来源于stack exchange,提问作者aswzen
相关产品推荐
相关产品推荐

