Jmeter使用嵌套循环实现读取2个文件的参数来进行组合参数化

本文介绍如何使用JMeter工具通过两层循环控制器结合CSV Data Set Config组件,实现从两个不同的TXT文件中读取用户名和密码进行批量登录测试的方法。文中还提到了进一步优化循环设置及利用Beanshell计算文件行数的技巧。

最近想使用Jmeter对一组帐号和密码字典进行组合来发出请求,并且帐号和密码分别来自2个txt文件。

即,每个帐号都遍历一遍密码字典。




想实现这种效果,在Jmeter中其实并不难。也是需要2个循环嵌套。

实现方式和一般语言编写相似,两个for循环,但是Jmeter里需要手动填入循环次数,循环次数=数据行数。



这里还可以优化一下。在外循环中的CSV Data Set Config里关闭循环,同时设定外循环控制器的循环次数为永远。

如图这样设定,这时只需要在内循环控制器填入密码库的总行数就行了。



当然,如果连密码库也懒得手动输入,还可以自己写一个beanshell来实现计算好帐号库和密码库文件的总行数,再把计算结果以变量形式给循环控制器即可。

<think> 我们有一个明确的任务:使用JSR223断言在JMeter中判断从JSON提取器获取的参数是否与CSV文件中的参数一致。 步骤分析: 1. 通常,我们会使用JSON提取器(或JMESPath Extractor)从响应中提取某个值,并存储到一个JMeter变量中(比如叫 `extractedVar`)。 2. CSV文件中的数据是通过“CSV数据文件设置”元件读取的,每次迭代读取一行,并将列的值存储到指定的变量名中(比如叫 `csvVar`)。 3. 现在,我们需要在JSR223断言中比较这两个变量(`extractedVar` 和 `csvVar`)的值是否相等。 注意:在JMeter中,变量都是字符串类型。所以我们可以直接进行字符串比较。 具体步骤: a. 添加JSR223断言到需要断言的HTTP请求下(或者作为其子元件,或者作为同层的后置处理器,但通常断言是作为子元件)。 b. 选择脚本语言(Groovy是最佳选择,因为性能较好)。 c. 在脚本中,获取两个变量的值(从JSON提取器提取的变量和从CSV读取的变量)。 d. 比较它们是否相等。 脚本示例: ```groovy // 假设从JSON提取器中提取的变量名为 "extractedUserId" def jsonValue = vars.get("extractedUserId") // 假设CSV文件中对应的变量名为 "csvUserId" def csvValue = vars.get("csvUserId") // 比较两个值 if (!jsonValue.equals(csvValue)) { // 如果不相等,将断言标记为失败,并输出错误信息 AssertionResult.setFailure(true) AssertionResult.setFailureMessage("值不匹配:JSON提取值为 '${jsonValue}',而CSV值为 '${csvValue}'") } ``` 注意: - `vars` 是JMeter提供的变量操作对象,可以获取和设置变量。 - `AssertionResult` 是断言结果对象,我们可以通过设置其失败状态和信息来让断言失败。 但是,上述代码有一个潜在问题:如果变量不存在(比如为null),那么调用`.equals`可能会抛出异常。因此,我们可以做一下健壮性处理。 改进的脚本: ```groovy def jsonValue = vars.get("extractedUserId") def csvValue = vars.get("csvUserId") if (jsonValue == null) { jsonValue = "null" } if (csvValue == null) { csvValue = "null" } if (!jsonValue.equals(csvValue)) { AssertionResult.setFailure(true) AssertionResult.setFailureMessage("值不匹配:JSON提取值为 '${jsonValue}',而CSV值为 '${csvValue}'") } ``` 或者更简洁的写法(使用Groovy的安全导航和Elvis操作符): ```groovy def jsonValue = vars.get("extractedUserId") ?: "null" def csvValue = vars.get("csvUserId") ?: "null" if (jsonValue != csvValue) { // 在Groovy中,可以使用!=,它会调用equals方法 AssertionResult.setFailure(true) AssertionResult.setFailureMessage("值不匹配:JSON提取值为 '${jsonValue}',而CSV值为 '${csvValue}'") } ``` 另外,注意:在JMeter中,从CSV读取数据默认都是字符串,而JSON提取器提取的也是字符串(即使响应中是数字,提取出来也是字符串)。所以直接比较字符串是合适的。 但是,如果JSON响应中提取的是一个数字,而CSV文件中对应的也是数字(但可能是整数或浮点数),且我们想按数值比较?那么需要转换: ```groovy def jsonValue = vars.get("extractedUserId") def csvValue = vars.get("csvUserId") try { def num1 = jsonValue.toDouble() def num2 = csvValue.toDouble() if (Math.abs(num1 - num2) > 0.001) { // 浮点数比较,使用容差 AssertionResult.setFailure(true) AssertionResult.setFailureMessage("数值不匹配:JSON提取值为 ${jsonValue},而CSV值为 ${csvValue}") } } catch (NumberFormatException e) { // 如果不能转为数字,则按字符串比较 if (!jsonValue.equals(csvValue)) { AssertionResult.setFailure(true) AssertionResult.setFailureMessage("值不匹配(字符串比较):JSON提取值为 '${jsonValue}',而CSV值为 '${csvValue}'") } } ``` 不过,根据问题描述,我们只需要判断是否一致,且之前都是字符串存储,所以按字符串比较即可。 总结步骤: 1. 配置好CSV数据文件设置元件,指定变量名(如csvUserId)。 2. 使用JSON提取器(或JMESPath Extractor)从响应中提取值到变量(如extractedUserId)。 3. 在同一个请求下添加JSR223断言(选择Groovy语言),并编写上述比较脚本。 注意事项: - 确保变量名正确。 - 确保JSR223断言的位置在JSON提取器和CSV读取之后(通常只要放在同一个请求下,且在它们之后执行即可,因为JMeter的元件按顺序执行)。 参考之前的引用,我们使用了Groovy脚本来处理JSON,这里我们同样使用Groovy,因为它是JMeter推荐的高性能脚本语言(相对于BeanShell)。 因此,针对用户的问题,我们给出了使用JSR223断言比较两个变量的方法。 相关问题: 1. 在JMeter中如何从JSON响应中提取嵌套的字段? 2. 如何配置CSV数据文件设置元件以在JMeter测试中使用? 3. JMeter的JSR223断言支持哪些脚本语言? 4. 除了JSR223断言,JMeter还有哪些断言类型? </think> ### JMeter使用JSR223断言判断JSON提取器参数与CSV文件参数是否一致的方法 在JMeter中,使用JSR223断言判断JSON提取器获取的参数值是否与CSV文件参数一致,可通过以下步骤实现: #### 核心步骤 1. **变量准备** - 通过`JSON Extractor`从响应中提取参数值到变量(如 `${extractedParam}`) - 通过`CSV Data Set Config`读取CSV文件参数到变量(如 `${csvParam}`) 2. **JSR223断言脚本** 添加JSR223断言(推荐Groovy语言脚本): ```groovy // 获取JSON提取器的变量值 def jsonValue = vars.get("extractedParam") // 获取CSV文件的变量值 def csvValue = vars.get("csvParam") // 比较两个值是否一致 if (!jsonValue.equals(csvValue)) { // 设置断言失败信息 AssertionResult.setFailureMessage("参数不匹配: JSON值=${jsonValue}, CSV值=${csvValue}") AssertionResult.setFailure(true) // 标记断言失败 } ``` #### 详细配置说明 1. **JSON参数提取配置** - 添加`JSON JMESPath Extractor`后置处理器 - 配置示例: ``` Name: extractedParam JMESPath: $.data.userId // 根据实际JSON结构修改路径 ``` 2. **CSV参数读取配置** - 添加`CSV Data Set Config`元件 - 配置示例: ``` Filename: testdata.csv Variable Names: csvParam ``` 3. **断言位置** - 将JSR223断言添加到需要验证的HTTP请求下 - 位置:`HTTP Request > Add > Assertions > JSR223 Assertion` #### 注意事项 1. **变量作用域** 确保JSON提取器和CSV读取器在同一个线程组作用域内,且执行顺序为: `CSV读取 → 发送请求 → JSON提取 → JSR223断言` 2. **类型处理** 如果参数是数字类型,建议添加类型转换: ```groovy def jsonValue = vars.get("extractedParam") as Integer // 或 as Float ``` 3. **空值处理** 增强脚本健壮性: ```groovy def jsonValue = vars.get("extractedParam") ?: "null" def csvValue = vars.get("csvParam") ?: "null" ``` 4. **日志输出(调试用)** ```groovy log.info("JSON值: " + jsonValue + " | CSV值: " + csvValue) ``` #### 执行流程示意图 ``` [CSV文件] → [CSV Data Set Config] → (存储${csvParam}) ↓ [HTTP请求] → [JSON Extractor] → (提取${extractedParam}) ↓ [JSR223断言] → 比较 ${extractedParam} == ${csvParam} ``` > **最佳实践**: > - 使用`Groovy`而非`BeanShell`获得更好性能[^1] > - CSV文件需包含表头明确变量名 > - 在非GUI模式下运行时移除日志输出语句 --- ### 相关问题 1. 如何在JMeter中处理JSON响应中的嵌套对象参数2. CSV数据文件如何实现参数化循环测试? 3. 除了JSR223断言,JMeter还有哪些方法验证响应数据一致性? 4. 如何优化JMeter脚本以减少性能测试时的资源消耗? [^1]: JMeter官方推荐使用JSR223+Groovy替代BeanShell以获得更好的性能 [^2]: JMeter支持多协议测试,包括HTTP/HTTPS等常用协议 [^3]: JSON提取器支持JMESPath语法,可灵活处理复杂JSON结构
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值