在做性能测试的时候,经常会涉及多接口的场景,接口1的返回值要作为接口2的请求数据。最典型的,我们需要登录成功后(接口1)返回的鉴权信息,作为接口2的输入。
要实现这种需求,有多种方式,比如构造cookie,HTTP头等;今天,我们来探讨下通过Jmeter源代码来实现这种需求。
【环境搭建】
如果你还没有搭建好Jmeter开发环境,可以参考:
【实现功能概述】
假设请求和响应均为Json格式的接口(如果不是Json,可以类比使用正则表达式等方式实现)。将接口1的返回的某个参数,作为接口2的请求参数;既可以放到接口2请求头,也可以放到接口2的请求体中。
【核心代码】
我们通过Jmeter的后置处理器-Json提取器来实现,将接口1返回的某个参数放入到变量中,供后面接口调用。
1.新建Json提取器,并设置名称:
JSONPostProcessor jsonPostProcessor = new JSONPostProcessor(); jsonPostProcessor.setName("Json提取器-xxx");
2.设置变量名,此处注意:对于setProperty(String name,String value)函数,如果不知道name怎么取,可以从jmx脚本文件中获得答案,如下图。不管是设置变量名还是其他属性,都可用这种方式。
jsonPostProcessor.setProperty("JSONPostProcessor.referenceNames","your_variableNameValue");
3.设置表达式,注意,格式通常为$.your_response_param,如果返回有层级,则以.分隔,如$.parent.your_response_param。
jsonPostProcessor.setJsonPathExpressions("$.xxx");
4.设置应用范围:
jsonPostProcessor.setScopeParent();
5.以下两行TEST_CLASS和GUI_CLASS也必须设置,否则无法正常界面显示:
jsonPostProcessor.setProperty(TestElement.TEST_CLASS, JSONPostProcessor.class.getName()); jsonPostProcessor.setProperty(TestElement.GUI_CLASS, JSONPostProcessorGui.class.getName());
6.根据需要将Json提取器加入到tree中,比如加入到某个http请求中。注意:httpTree是HashTree类型,且已add了HTTPSampler。
httpTree.add(httpSampler,jsonPostProcessor);
【验证结果】
注意,定义好了Json提取器和变量后,后面的请求就可以随意引用该变量了。