admin管理员组

文章数量:1437318

MeterSphere 随手记

MeterSphere随手记

实践环境

版本: MeterSphere v2.10.12-lts

实现全局前置准备方法

需求场景1:执行所有场景用例前,先执行全局前置准备操作

实现方法

1、将所有前置准备操作以场景用例的形式创建

2、建立一个名为 前置准备套件 的场景,引用上述所有前置操作场景用例--将前置准备操作场景用例引用为步骤。同时勾选 失败继续 场景设置复选框,避免某个步骤失败,后续前置准备操作都不执行的情况。

3、调整上述步骤的顺序,解决部分前置准备操作场景之间的顺序依赖问题

4、登录MeterSphere数据库,默认登录账号/密码:root/Password123@mysql,添加一下定时任务

代码语言:javascript代码运行次数:0运行复制
SET GLOBAL event_scheduler = 1;

DROP EVENT IF EXISTS e_update_preparation_suite_order;
-- 默认每5分钟执行一次更新操作。
CREATE EVENT IF NOT EXISTS e_update_preparation_suite_order
ON SCHEDULE EVERY 300 second
DO UPDATE metersphere.test_plan_api_scenario tpas JOIN (
SELECT test_plan_id, MAX(`order`) AS max_order FROM metersphere.test_plan_api_scenario 
WHERE api_scenario_id NOT IN (SELECT id FROM metersphere.api_scenario WHERE `name` = '前置准备套件')
GROUP BY test_plan_id) t ON tpas.test_plan_id = t.test_plan_id
SET tpas.`order` = t.max_order + 1
WHERE tpas.api_scenario_id in (SELECT id FROM metersphere.api_scenario WHERE `name` = '前置准备套件')

说明:

  1. metersphere中测试计划最新关联的场景,最先被执行。
  2. metersphere中,执行测试计划时,不同场景之间的执行顺序管控是通过metersphere.test_plan_api_scenario.order字段控制的,字段值越大,越优先被执行。所以,可以通过上述定时任务,以适当频率将 前置准备套件order更新为最大值(每个计划对应一个最大值)。

全局环境变量设置

代码语言:javascript代码运行次数:0运行复制
vars.put(${__metersphere_env_id}+'GLOBAL_VAR_NAME', 'var_value')
vars.put('GLOBAL_VAR_NAME', 'var_value') # 让环境变量立即生效

说明:执行上述语句后,将会在 项目设置-项目环境-新建环境/编辑-通用配置 生成名为GLOBAL_VAR_NAME,值为var_value的常量全局环境变量。

获取前一个请求的响应体

代码语言:javascript代码运行次数:0运行复制
prev.getResponseData()  # 适合非文本类数据读取
prev.getResponseDataAsString()

注意:实践发现,不能在 自定义脚本 步骤组件的 断言规则 脚本中使用,获取不到值

脚本断言

代码语言:javascript代码运行次数:0运行复制
场景设置 优先使用原场景变量,没有则使用当前场景变量 优先使用当前场景变量,没有则使用原场景变量

后置操作-提取参数-JSONPath提取-匹配多条

采用JSONPath提取参数,如果JSONPath匹配到多个结果时,默认只会取一个结果,存储到指定变量(假设变量名为 varName),如果勾选了 匹配多条,则会存储所有匹配结果:每个结果值存储到变量,变量名格式形如:varName_1,varName_2,...,varName_N,其中N从1开始,最大值为匹配结果数,此时,如果希望用ForEach循环控制器来遍历结果,变量前缀填写varName。此外,也可以直接通过vars.get(varName_N)的方式获取变量

ForEach循环控制器变量前缀参数化

问题:希望通过用ForEach循环控制器来遍历自定义脚本生成的一组支持ForEach遍历的变量值,但是变量数量不定,如何处理?

答案:

将变量前缀参数化,形如以下

代码语言:javascript代码运行次数:0运行复制
import time
var_name = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
vars.put('prefix', var_name)
var_num = 10
for i in range(var_num):
    vars.put(var_name + '_%s' % str(i + 1), 'value%d' % i)

ForEach组件中填写变量前缀时填写参数化后的变量${prefix},而非常量变量前缀字符串

备注:如果不参数化,将变量前缀写死,那遍历时,可能遍历之前设置的变量,如果上一轮的变量值比较多的话。

注意事项

  • MeterSphere中,脚本默认开启JMeter的代码缓存功能
  • MeterSphere中,项目设置-项目环境-新建环境/编辑-HTTP配置 全局cookie和场景cookie和单个请求中cookie使用是互补的,不会替换
  • 等待控制器用于全局--对每个采样器生效 metershpere中,等待控制器 估计用的JMeter的固定定时器,没法放在其它采样器下(步骤组件),所以会作用于全局--针对每个采样器执行固定等待
  • 一般情况下,用例场景不要够取失败继续--即步骤执行失败则停止继续运行。
  • 场景变量 会被用例步骤中的同名变量覆盖
  • 场景变量Cookie请求头的值不能通过vars.put('Cookie')的方式修改,但是可以通过修改Cookie请求头引用的变量值修改(假设已在场景变量中将Cookie请求头的值设置为某个变量)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-04-27,如有侵权请联系 cloudcommunity@tencent 删除变量登录脚本存储遍历

本文标签: MeterSphere 随手记