Gatling:如何将随机选取的属性保存为另一属性?
当然可以实现!
这绝对是个很实用的需求——毕竟没人想每次用到这个ID时都随机跳一个值,对吧?核心思路就是把随机选取的结果一次性固化到一个新属性里,而不是每次都调用随机方法。
具体实现步骤(通用逻辑)
不管你用的是UI自动化框架、接口测试工具还是其他支持属性/变量的环境,逻辑都是一致的:
- 第一步:用
findAll捕获所有符合条件的ID,把它们存到一个临时集合/列表属性中,比如叫allMatchingIds - 第二步:从这个列表里随机挑一个元素,直接赋值给一个新的属性(比如
persistedRandomId),而不是依赖动态的random()方法调用
示例代码(以Groovy/通用脚本风格为例)
// 1. 捕获所有目标ID并存储到临时属性 def allMatchingIds = findAll("your_locator_or_regex_for_ids") // 2. 生成随机索引,选取一个ID并保存为新属性 def randomIdx = new Random().nextInt(allMatchingIds.size()) def persistedRandomId = allMatchingIds[randomIdx] // 这里把值存入全局/可复用的属性存储(不同工具的API会有差异) saveAttribute("persistedRandomId", persistedRandomId)
为什么不能直接用${AttributeName.random()}?
因为每次调用这个方法时,它都会重新执行一次随机选择逻辑——这就导致你第一次用和第二次用拿到的可能是不同的ID。而把结果提前存到新属性里后,后续任何地方引用${persistedRandomId}都会拿到同一个固定值。
工具专属示例(比如JMeter)
如果你是在JMeter里做接口/UI测试,可以用JSR223 Sampler来实现:
// 从响应中捕获所有ID(假设用正则匹配) def allIds = ctx.getPreviousResult().getResponseDataAsString().findAll(/id=\d+/).collect { it.replace("id=", "") } // 随机选一个并存入JMeter变量 def selectedId = allIds[new Random().nextInt(allIds.size())] vars.put("persistedRandomId", selectedId)
之后在其他Sampler、断言或者请求参数里直接用${persistedRandomId}就可以了,这个值不会再变化。
内容的提问来源于stack exchange,提问作者jknutt1568
相关产品推荐
相关产品推荐

