MeterSphere 中使用 Groovy 的常用脚本大全

MeterSphere 中使用 Groovy 的常用脚本大全

以下是在 MeterSphere 中使用 Groovy 脚本的常用代码片段总结,涵盖变量操作、请求处理、断言、数据提取等常见场景。

一、变量操作

1. 获取和设置变量

// 获取变量
def username = vars.get("username")
def password = vars.get("password")

// 设置变量
vars.put("new_var", "value")
vars.put("full_name", "${username} Smith")

// 获取JMeter属性(全局变量)
def globalVar = props.get("global_property")

2. 变量类型转换

// 字符串转数字
def intVar = "123".toInteger()
def doubleVar = "3.14".toDouble()

// 数字转字符串
vars.put("string_num", 123.toString())

// 布尔值处理
def boolValue = "true".toBoolean()

二、请求处理

1. 获取请求响应

// 获取响应数据
def response = prev.getResponseDataAsString()

// 获取响应码
def statusCode = prev.getResponseCode()

// 获取响应头
def headers = prev.getResponseHeaders()

// 获取请求时间
def elapsedTime = prev.getTime()

2. 处理JSON响应

import groovy.json.JsonSlurper

def response = prev.getResponseDataAsString()
def json = new JsonSlurper().parseText(response)

// 提取嵌套值
def userId = json.data.user.id
vars.put("extracted_user_id", userId.toString())

// 处理JSON数组
json.items.eachWithIndex { item, index ->
    vars.put("item_${index}", item.name)
}

3. 处理XML响应

import groovy.xml.XmlSlurper

def response = prev.getResponseDataAsString()
def xml = new XmlSlurper().parseText(response)

// 提取节点值
def title = xml.book.title.text()
vars.put("book_title", title)

三、断言检查

1. 基本断言

// 检查响应码
if (prev.getResponseCode() != "200") {
    AssertionResult.setFailure(true)
    AssertionResult.setFailureMessage("响应码非200")
}

// 检查响应内容
if (!prev.getResponseDataAsString().contains("success")) {
    throw new Exception("响应中未找到success关键字")
}

2. JSON断言

def json = new JsonSlurper().parseText(prev.getResponseDataAsString())

// 检查字段值
if (json.status != "OK") {
    AssertionResult.setFailureMessage("状态不是OK")
}

// 检查数组大小
if (json.items.size() < 5) {
    AssertionResult.setFailureMessage("项目数量不足5个")
}

四、数据处理

1. 字符串操作

// 字符串分割
def parts = "a,b,c".split(",")
vars.put("first_part", parts[0])

// 字符串替换
def newStr = "hello world".replace("world", "groovy")

// 正则匹配
def matcher = (prev.getResponseDataAsString() =~ /id="(\d+)"/)
if (matcher.find()) {
    vars.put("matched_id", matcher.group(1))
}

2. 日期处理

import java.text.SimpleDateFormat

// 获取当前时间
def now = new Date()
vars.put("current_time", now.format("yyyy-MM-dd HH:mm:ss"))

// 时间计算
use(groovy.time.TimeCategory) {
    def tomorrow = now + 1.day
    vars.put("tomorrow", tomorrow.format("yyyy-MM-dd"))
}

五、流程控制

1. 条件判断

def status = vars.get("status")

switch(status) {
    case "success":
        log.info("操作成功")
        break
    case "failure":
        log.error("操作失败")
        break
    default:
        log.warn("未知状态: ${status}")
}

2. 循环操作

// 遍历列表
def items = ["apple", "banana", "orange"]
items.each { item ->
    log.info("处理水果: ${item}")
}

// 带索引的遍历
items.eachWithIndex { item, index ->
    vars.put("fruit_${index}", item)
}

// 数字范围循环
(1..5).each { num ->
    log.info("当前数字: ${num}")
}

六、文件操作

1. 读取文件

def file = new File("data.txt")
def lines = file.readLines()
vars.put("first_line", lines[0])

// CSV文件处理
def csvData = []
file.splitEachLine(",") { fields ->
    csvData << fields
}

2. 写入文件

new File("output.log").withWriter { writer ->
    writer.writeLine("测试开始时间: ${new Date()}")
    writer.writeLine("响应数据: ${prev.getResponseDataAsString()}")
}

七、性能测试专用

1. 随机数据生成

import org.apache.commons.lang3.RandomStringUtils

// 生成随机字符串
def randomStr = RandomStringUtils.randomAlphanumeric(10)
vars.put("random_name", randomStr)

// 生成随机数
def randomNum = new Random().nextInt(100)
vars.put("random_age", randomNum.toString())

2. 吞吐量计算

def throughput = ctx.getThreadNum() / (prev.getTime() / 1000)
vars.put("current_throughput", throughput.toString())

八、异常处理

try {
    def riskyOperation = 1 / 0
} catch (ArithmeticException e) {
    log.error("除零错误: ${e.getMessage()}")
    vars.put("error_occurred", "true")
} finally {
    log.info("操作完成")
}

九、调试技巧

1. 日志输出

log.info("信息级别日志")
log.debug("调试信息")
log.warn("警告信息")
log.error("错误信息")

// 打印变量
log.info("用户名: ${vars.get('username')}")

2. 查看所有变量

vars.entrySet().each { entry ->
    log.info("变量 ${entry.key} = ${entry.value}")
}

十、JMeter上下文访问

// 获取线程信息
def threadNum = ctx.getThreadNum()
def threadName = ctx.getThread().getName()

// 获取测试计划信息
def testName = ctx.getCurrentSampler().getName()

// 设置样本结果
prev.setSuccessful(false)
prev.setResponseMessage("自定义失败信息")

以上脚本可以直接在 MeterSphere 的 JSR223 元件中使用,选择语言为 Groovy 即可。建议:

  1. 对于性能关键代码,使用 @CompileStatic 注解
  2. 勾选 “Cache compiled script” 选项提升性能
  3. 复杂逻辑建议先在 Groovy Console 中测试
MeterSphere 接口测试中,Groovy 脚本可以用于前置操作、后置操作以及断言等场景,为接口测试带来更高的灵活性和可编程性。通过 Groovy 脚本,测试人员可以实现复杂的逻辑控制、数据处理和变量操作,从而提升测试用例的覆盖率和执行效率。 ### Groovy 脚本在前置操作中的使用 前置操作通常用于在接口请求发送之前对测试环境进行设置或对请求参数进行动态处理。例如,可以通过 Groovy 脚本生成动态的请求头、请求参数或初始化测试数据。 **示例:使用 Groovy 设置请求头中的 Token** ```groovy import java.util.* // 生成随机字符串作为 Token def token = UUID.randomUUID().toString() // 将 Token 存入变量,供后续接口使用 vars.put("auth_token", token) ``` 此脚本生成一个随机的 Token 并将其存储在变量 `auth_token` 中,随后可在接口请求头中使用 `${auth_token}` 来引用该值。 ### Groovy 脚本在后置操作中的使用 后置操作用于在接口响应返回后对结果进行处理,例如提取响应中的关键字段、更新测试状态或记录日志等。 **示例:使用 Groovy 提取响应中的字段并存储为变量** ```groovy import groovy.json.JsonSlurper // 获取响应内容 def response = prev.getResponseDataAsString() // 解析 JSON 响应 def json = new JsonSlurper().parseText(response) // 提取 "userId" 字段并存入变量 vars.put("userId", json.userId.toString()) ``` 该脚本解析接口返回的 JSON 数据,并提取 `userId` 字段,将其存储为变量供后续测试步骤使用。 ### Groovy 脚本在断言中的使用 Groovy 也广泛用于脚本断言中,尤其适用于复杂的逻辑判断或非固定值的验证。 **示例:验证响应字段是否为指定集合中的值** ```groovy def value = vars.get("source") def validValues = ["APP", "WEB", "LOCAL"] if (!validValues.contains(value)) { AssertionResult.setFailure(true) AssertionResult.setFailureMessage("Invalid source value: " + value) } ``` 该脚本验证 `source` 字段是否为 `APP`、`WEB` 或 `LOCAL`,否则将断言设置为失败状态并返回错误信息。 ### 脚本语言选择与配置 MeterSphere 支持多种脚本语言,包括 GroovyPython、JavaScript 和 BeanShell。在接口测试中使用 Groovy 时,需确保脚本语法正确,并在脚本编辑器中选择 Groovy 作为脚本语言。 **注意事项:** - Groovy 脚本中变量操作需使用 `vars` 对象进行存储和读取。 - 可以通过 `prev` 对象获取当前接口的响应数据。 - 断言脚本中需使用 `AssertionResult` 对象设置断言状态和错误信息。 ### 脚本调试与执行 MeterSphere 提供了调试功能,可在接口测试中直接运行脚本并查看执行结果。对于复杂的 Groovy 脚本,建议在本地开发环境中进行初步测试后再集成到 MeterSphere 中,以提高调试效率。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值