在作接口测试时,对响应数据的校验是很是重要的部分;在使用Jmeter进行接口测试时,有多种respone校验方式,好比响应断言、BeanShell断言等等,BeanShell断言能够自定义断言,自由灵活的用脚本实现断言。java
小型嵌入式Java源代码解释器,具备对象脚本语言特性,可以动态地执行标准JAVA语法
运行其内部的脚本处理Java应用程序,还能够在运行过程当中动态执行你java应用程序执行java代码,由于BeanShell是用java写的,运行在同一个虚拟机的应用程序,所以能够自由地引用对象脚本并返回结果。shell
JMeter在它的BeanShell中内置了变量,用户能够经过这些变量与JMeter进行交互,其中主要的变量及其使用方法以下:apache
log:写入信息到jmeber.log文件,使用方法:log.info(“This is log info!”);json
ctx:该变量引用了当前线程的上下文,使用方法可参考:org.apache.jmeter.threads.JMeterContext。数组
vars - (JMeterVariables):操做jmeter变量,这个变量实际引用了JMeter线程中的局部变量容器(本质上是Map),它是测试用例与BeanShell交互的桥梁,经常使用方法:测试
a) vars.get(String key):从jmeter中得到变量值spa
b) vars.put(String key,String value):数据存到jmeter变量中线程
更多方法可参考:org.apache.jmeter.threads.JMeterVariablescode
props - (JMeterProperties - class java.util.Properties):操做jmeter属性,该变量引用了JMeter的配置信息,能够获取Jmeter的属性,它的使用方法与vars相似,可是只能put进去String类型的值,而不能是一个对象。对应于java.util.Properties。对象
a) props.get("START.HMS"); 注:START.HMS为属性名,在文件jmeter.properties中定义
b) props.put("PROP1","1234");
prev - (SampleResult):获取前面的sample返回的信息,经常使用方法:
a) getResponseDataAsString():获取响应信息
b) getResponseCode() :获取响应code
更多方法可参考:org.apache.jmeter.samplers.SampleResult
sampler - (Sampler):gives access to the current sampler
假如咱们有以下的response数据:
{ "message": "不能发送小于当前时间点的定时任务", "statusCode": 200 }
(1)咱们使用JSONObject对象来获取json数据,首先须要下载org.json的jar包,而后在测试计划中导入该jar包,并在jmeter的lib目录下放入该jar包,下面验证statusCode的值是否等于200:
import org.json.*; //获取上一个请求的返回 String jsonString = prev.getResponseDataAsString(); JSONObject responseJson = new JSONObject(jsonString); //判断返回值是否和预期一致 if (responseJson.getInt("statusCode") != 200) { //把断言失败置为真,即用例失败,并在结果树中显示FailureMessage Failure = true; FailureMessage = "statusCode的返回值有误"; }
(2)若是要验证 respone 中 message 的值是否与预期一致,须要怎么作呢?
import org.json.*; //获取上一个请求的返回 String jsonString = prev.getResponseDataAsString(); JSONObject responseJson = new JSONObject(jsonString); String fbpcontent = responseJson.getString("message"); if (!fbpcontent.equals("不能发送小于当前时间点的定时任务")) { //把断言失败置为真,即用例失败,并在结果树中显示FailureMessage Failure = true; FailureMessage = "message与实际值不一致"; }
假如咱们有以下的response响应数据:
{ "statusCode": 200, "data": [ { "i": "50356", "n": "项目一", "v": "2.0", "iconUrl": "", }, { "i": "45280", "n": "项目二", "v": "3.0", "iconUrl": "", }, { "i": "14656", "n": "项目三", "v": "2.6", "iconUrl": "", }, { "i": "66213", "n": "项目四", "v": "5.0", "iconUrl": "", } ] }
(3)咱们须要解析数组data的值,如何去解析呢?
import org.json.*; import java.util.Arrays; //获取上一个请求的返回 String jsonContent = prev.getResponseDataAsString(); JSONObject response = new JSONObject(jsonContent); JSONArray groups = response.getJSONArray("data"); String strData= groups.toString(); log.info(strData)
如今有更加复杂格式的respone数据:
{ "priorityGroups": { "proId": 1234, "name": "项目一", "groups": [ { "id": "50356", "items": [ { "proId": 1360, "n": "PC端", "index": 1 }, { "proId": 1361, "n": "iOS端", "index": 2 }, { "proId": 1362, "n": "安卓端", "index": 4 } ] } ] }, "promotion": { "proId": 1364, "cusId": 84, "name": "项目二", "from": 1470821215, "to": 1470907615, "status": 1, "objectId": 1069, "createBy": 394, "eff": 1470821215000, "createTime": 1470821155000 } }
(4)咱们须要解析groups中的数据,须要怎么实现呢?
import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; String jsonContent = prev.getResponseDataAsString(); JSONObject response = new JSONObject(jsonContent); JSONArray groups = response.getJSONObject("priorityGroups").getJSONArray("groups"); String strGroups = groups.toString();