JMeter(7) 优化判断返回类型和返回值

本文介绍如何在JMeter中优化接口测试断言,通过封装Java方法为jar文件,实现接口返回字段的类型和值的高效验证。文章详细展示了如何创建和使用EqualsJsonValue及EqualsJsonType类来判断接口返回值的正确性和类型一致性,同时提供了通过CSV读取预期响应数据的便捷方法。

之前判断接口类型和返回值用beanshell,可见JMeter(5)-JMeter之BeanShell使用

优化点
  1. 接口测试里面对返回字段的类型验证值验证为基本需求,将方法导成jar文件,导入之后方便每个断言可以调用。
  2. 补充对null类型、Array类型的判断
步骤
  1. 将判断方法打包成jar文件
    java项目打包成jar
    我的jar下载
  2. 导入jmeter项目中


     
     
  3. 判断接口返回字段值正确性(EqualsJsonValue类)
    beanshell的调用代码如下
import com.susie.action.equals.EqualsJsonValue;
String standardData = "{'uid':123,'phone':1,'has_password':true,'location':{'province':true,'city':'123'},'cpma':1}";
EqualsJsonValue equalsValue = new EqualsJsonValue();
Failure = !equalsValue.respValueAssertion(standardData, prev.getResponseDataAsString()); //断言结果 FailureMessage = equalsValue.getMessage(); //断言错误信息 

运行结果


 
 
  1. 判断接口返回字段类型正确性(EqualsJsonType类)
    beanshell的调用代码如下
import com.susie.action.equals.EqualsJsonType;
String standardData = "{'uid':123,'phone':1,'has_password':true,'location':{'province':true,'city':'\u6c55\u5934\u5e02'},'cpma':null}";
EqualsJsonType equalsJson = new EqualsJsonType();
Failure = !equalsJson.respTypeAssertion(standardData, prev.getResponseDataAsString());
FailureMessage = equalsJson.getMessage();
  1. 格式化每个接口的字段断言
    将每个需要检查的字段(期望响应)直接用csv记录,每次比较直接读取进行比对无需一个个断言,非常方便~


     
     

    通过CSV Data Set Config读取,在beanshell中比较,调用方式与前面类似,获取标准响应

String standardDataShell = vars.get("standardData").toString();

注意: 读取csv中的json的时要注意json的逗号&双引号
在这里坑了许久,因为csv是以逗号区分不同列的数据,所以,要把json里面的逗号改称分号,双引号改称单引号;

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

赞赏支持
 
接口自动化Jmeter
Gupao
登录 后发表评论
 
3条评论 只看作者 关闭评论
按时间倒序 按时间正序
 
失语失芯不失梦
2楼 · 2018.11.24 18:44

不是很明白:joy: 如果我想判断返回数据里面字段A的值类型对不对该怎么写呢?比如说定义的是字段A应该返回int型的值,但实际上返回的是string类型的值,这种断言我怎么写呢

赞 回复

 

@失语失芯不失梦
在benshell里面写java脚本就可以验证。
思路是提取返回数据里字段A,得到A的类型,跟期望的类型比较。类型一致则断言成功;类型不一致则断言失败。
我这篇里面只是把比较的方法封装在jar包里面,方便每次都直接调用来判断而已。

 

2018.12.04 14:43 回复

 

封装后,每次只要输入一段期望值(json格式),脚本会从接口响应(json格式)里提取对应的字段,逐一判断

 

2018.12.04 14:45 回复


作者:susie酱
链接:https://www.jianshu.com/p/78df350d78e5
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

转载于:https://www.cnblogs.com/a00ium/p/10296120.html

<think> 我们正在处理一个关于JMeter中Beanshell断言的问题。用户希望使用Beanshell断言来判断接口返回值与CSV文件中的值是否一致。 根据引用,我们可以知道: 1. 引用[4]提到:使用CSV数据文件实现业务流程接口自动化测试时,通过BeanShell后置处理程序按needdata字段提取接口返回值,并将值传递给后面的接口。这提示我们可以使用BeanShell来处理CSV文件接口返回值。 2. 引用[3]提到了使用BeanShell断言将响应数据中的JSON与数据库中的记录对比。虽然这里是对比数据库,但我们可以借鉴其思路,改为对比CSV文件。 因此,我们可以设计如下步骤: 步骤1:准备一个CSV文件,其中包含预期的值(可能有多列,每一行代表一组测试数据)。 步骤2:在JMeter中,使用CSV Data Set Config元件来读取CSV文件,将每一列的值存储到JMeter变量中。 步骤3:发送请求,获取接口返回值(通常是JSON格式)。 步骤4:使用BeanShell断言,在该断言中编写脚本,将接口返回的字段值与从CSV读取的变量进行比较。 注意:由于CSV Data Set Config每次读取一行,所以每一组测试数据都会对应的接口返回值进行比较。 但是,这里有一个问题:在BeanShell断言中如何访问CSV文件读取的变量?答案是直接通过JMeter变量名访问。 另外,引用[5]提到BeanShell后置处理器,我们可以从中获取接口返回值并导出CSV,但这里我们需要的是比较,而不是导出。 具体BeanShell断言的脚本编写思路: 1. 获取接口响应数据(通常使用prev.getResponseDataAsString())。 2. 解析响应数据(如果是JSON,可以使用JSONObject等)。 3. 从JMeter变量中获取CSV文件读取的预期值(这些变量在CSV Data Set Config中设置)。 4. 将解析得到的实际值与预期值进行比较。 5. 如果比较失败,使用Failure变量标记为失败,并输出失败信息。 然而,引用[2]提到在BeanShell中访问数据库时出现了错误,这提醒我们注意环境配置,比如在BeanShell中可能需要额外的jar包(比如JSON解析包)?但JMeter自带的JSON插件(如JSON Extractor)已经支持JSONPath,我们可以考虑用JMeter内置的JSON提取器来提取值存储到变量,然后在BeanShell断言中直接比较变量。这样就不需要在BeanShell中解析JSON了。 因此,另一种更简单的做法: 1. 使用JSON Extractor(或JSR223 Extractor)从响应中提取需要的值,存储到JMeter变量中(比如actualValue)。 2. 在CSV Data Set Config中,将CSV的某一列读取到变量(比如expectedValue)。 3. 在BeanShell断言中,直接比较两个变量:vars.get("actualValue")vars.get("expectedValue")。 这样,BeanShell断言的代码就非常简单: ```java // 获取实际值预期值 String actualValue = vars.get("actualValue"); String expectedValue = vars.get("expectedValue"); // 比较 if (actualValue == null || expectedValue == null) { Failure = true; FailureMessage = "变量actualValue或expectedValue为空"; } else if (!actualValue.equals(expectedValue)) { Failure = true; FailureMessage = "断言失败:实际值 [" + actualValue + "] 不等于预期值 [" + expectedValue + "]"; } ``` 但是,用户明确要求使用Beanshell断言,并且要判断接口返回值(可能是整个响应体,也可能是某个字段)与CSV文件中的值是否一致。如果用户需要比较的是整个响应体,那么我们可以直接将响应体与CSV中的一行(可能是一个字符串)进行比较。 考虑到CSV文件可能有多列,我们需要明确哪一列是用于比较的。例如,CSV文件可能有多个字段,而我们需要比较的是某个特定字段。 因此,我们假设CSV文件有一列名为“expectedResponse”的列,我们在CSV Data Set Config中设置变量名为expectedResponse。然后,在BeanShell断言中,我们比较整个响应体: ```java String response = prev.getResponseDataAsString(); String expected = vars.get("expectedResponse"); if (response == null || expected == null) { Failure = true; FailureMessage = "响应或预期值为空"; } else if (!response.equals(expected)) { Failure = true; FailureMessage = "响应内容与预期不一致"; } ``` 但是,这种方法比较整个响应体,可能不够灵活(比如响应体可能有时间戳等动态值)。通常我们只比较关键字段。 所以,推荐使用第一种方法:先提取关键字段,再与CSV中对应的列进行比较。 综合以上,我们给出一个完整的步骤: ### 步骤 1. **准备CSV文件**:例如testdata.csv,包含两列:idexpectedName。每一行代表一个测试用例。 2. **添加CSV Data Set Config**:在JMeter测试计划中,添加一个CSV Data Set Config元件,配置如下: - Filename: testdata.csv的路径 - Variable Names: id,expectedName (对应CSV的两列) - 其他参数默认 3. **添加HTTP请求**:发送请求,该请求可能需要使用CSV中的id(比如在路径或参数中)。 4. **添加JSON Extractor**:在HTTP请求下添加JSON Extractor,提取响应中的某个字段(例如实际名称actualName),并存储到变量actualName中。 5. **添加BeanShell断言**:在HTTP请求下添加BeanShell断言,编写脚本比较变量actualNameexpectedName。 ### BeanShell断言脚本示例 ```java // 获取变量 String actualName = vars.get("actualName"); String expectedName = vars.get("expectedName"); // 检查变量是否为空 if (actualName == null) { Failure = true; FailureMessage = "实际值为空,请检查JSON Extractor是否正确提取"; } else if (expectedName == null) { Failure = true; FailureMessage = "预期值为空,请检查CSV文件或CSV Data Set Config"; } else if (!actualName.equals(expectedName)) { Failure = true; FailureMessage = "实际值: " + actualName + " 与预期值: " + expectedName + " 不一致"; } ``` ### 注意事项 - 确保CSV文件编码正确(建议UTF-8)。 - 确保CSV Data Set Config的变量名与BeanShell中使用的变量名一致。 - 如果比较数字,注意类型(BeanShell中获取的是字符串,所以数字也要用字符串比较)。 - 如果响应是XML,可以使用XPath Extractor来提取值。 引用[1]提到Beanshell可以读写请求、响应相关的信息,因此我们这里使用prev(代表前一个取样器)来获取响应是可行的。 另外,引用[2]中提到在BeanShell中连接数据库报错,我们在使用文件操作时也要注意文件路径权限问题。但这里我们只是读取JMeter变量,所以不会出现文件操作错误。 如果用户需要比较多个字段,可以在BeanShell断言中逐一比较。 如果CSV文件中的预期值不是简单的字符串,而是JSON结构,那么可能需要解析JSON进行比较。这时可以使用额外的JSON库,或者使用JMeter内置的JSON功能(如JSON Path)提取后再比较。 由于用户要求比较接口返回值CSV文件中的值,我们假设CSV文件中的每一行对应一个请求的预期结果。因此,这种方法适用于数据驱动的测试。 最后,我们按照要求生成相关问题: </think> ### JMeter使用Beanshell断言判断接口返回值与CSV文件值是否一致的方法 在JMeter中,通过**Beanshell断言**结合**CSV数据文件**实现接口返回值与预期值的比对,主要步骤如下: --- #### 1. **准备CSV测试数据文件** - 创建CSV文件(如`testdata.csv`),包含预期结果字段: ```csv id,expectedValue 101,"success" 102,"pending" ``` #### 2. **配置CSV数据源** - 添加 **CSV Data Set Config** 元件: - `Filename`: CSV文件路径 - `Variable Names`: `id,expectedValue`(对应CSV列名) - `Recycle on EOF?`: `False` - `Stop thread on EOF?`: `True` ![CSV配置示例](https://jmeter.apache.org/images/screenshots/csv-data-set-config.png) #### 3. **发送HTTP请求并提取返回值** - 在HTTP请求中使用 `${id}` 引用CSV变量(如 `/api/status?id=${id}`) - 添加 **JSON Extractor** 提取实际返回值(变量名如 `actualValue`) #### 4. **添加Beanshell断言脚本** ```java // 从CSV获取预期值 String expected = vars.get("expectedValue"); // 从接口响应获取实际值 String actual = vars.get("actualValue"); // 比较值是否一致 if (actual == null) { Failure = true; FailureMessage = "错误:未获取到实际返回值"; } else if (!actual.equals(expected)) { Failure = true; FailureMessage = "断言失败!预期: " + expected + ",实际: " + actual; } ``` #### 5. **关键配置说明** | 组件 | 作用 | |------------------|----------------------------------------------------------------------| | `vars.get()` | 获取JMeter变量(CSV变量提取的响应值)[^1] | | `Failure` | 内置变量,设置为`true`时标记测试失败 | | `FailureMessage` | 自定义失败信息(显示在结果树中) | --- #### 注意事项 1. **路径问题**:CSV文件建议使用绝对路径,或放在JMeter的`bin`目录下 2. **数据类型**:CSV中的数字需用引号包裹避免解析错误(如 `"100"`) 3. **调试技巧**: - 添加 **Debug Sampler** 查看变量值 - 使用`log.info("值: " + actual)` 输出日志到控制台 4. **扩展场景**: - 多字段比较:循环比较多个CSV列与响应字段 - 动态值处理:用**正则表达式**过滤响应中的变量部分(如时间戳) > 通过此方案,可实现数据驱动测试,同一脚本验证多组CSV数据[^4][^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值