51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

【最佳实践】MeterSphere 接口测试 Beanshell 脚本使用:设置/获取接口信息、变量

在使用 MeterSphere 过程中,或多或少都会接触些BeanShell,它会使工具的使用,变得更灵活。文章记录了一些常用的方法,还有很多场景需要获取/设置当前测试用例的信息,找到具体的内置对象,打开官网文章,在method一栏即可查阅。

BeanShell是什么?

  • BeanShell是一种松散类型的脚本语言;
  • BeanShell可以执行标准Java语句和表达式,以及另外自身的一些脚本命令和语法。
  • BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;
  • BeanShell是用Java写成的,一个小型的、免费的、可以下载、嵌入式的Java源代码解释器,具有对象脚本的特性;

1 BeanShellSampler 常用内置对象 {#1-beanshellsampler-%E5%B8%B8%E7%94%A8%E5%86%85%E7%BD%AE%E5%AF%B9%E8%B1%A1}

| 内置对象 | 说明 | 官方文档 | |---------|--------------------------------------------|------------------------------------------------------------------------------------------------------------------------------| | vars | 针对变量进行取值和赋值,而且这个取值和赋值行为只对当前线程的变量生效,而非全部线程。 | vars 文档 | | prev | prev 提供对当前取样器结果的访问能力 | prev 文档 | | sampler | 取样器 | sampler 文档 |

2 Beanshell 变量赋值和取值 {#2-beanshell-%E5%8F%98%E9%87%8F%E8%B5%8B%E5%80%BC%E5%92%8C%E5%8F%96%E5%80%BC}

2.1 存放变量 {#2.1-%E5%AD%98%E6%94%BE%E5%8F%98%E9%87%8F}

2.1.1 var.put() {#2.1.1-var.put()}

方法声明: public void put(String key, String value)

Parameters
key - the variable name
value - the variable value

功能: 创建或更新字符串变量

vars.put("name","温一壶清酒 博客园");
String varsName = vars.get("name");
log.info("varsName:"+ varsName);

2.1.2 var.putObject() {#2.1.2-var.putobject()}

方法声明:public void putObject(String key,Object value)

Parameters
key - the variable name
value - the variable value

功能:创建或更新一个非字符串变量。

vars.putObject("number",8);
vars.putObject("list",[2,4,6,8,10]);
vars.putObject("array",[1,3,5,7,9,11] as int[]);
vars.putObject("map",["name":"温一壶清酒","source":"博客园"]);
log.info("number:"+ vars.getObject("number").toString());
log.info("list:"+ vars.getObject("list").size());
log.info("array:"+ vars.getObject("array").length);
log.info("map:"+ vars.getObject("map").get("name"));

2.2 获取变量 {#2.2-%E8%8E%B7%E5%8F%96%E5%8F%98%E9%87%8F}

2.2.1 var.get() {#2.2.1-var.get()}

方法声明:public String get(String key)

功能:获取变量的值并将其转换为字符串,若变量存在则将值转换为字符串,否则返回 null

String varsSex = vars.get("sex");
log.info("varsSex:"+ varsSex);

2.2.2 var.getObject() {#2.2.2-var.getobject()}

方法声明:public Object getObject(String key);

功能:获取变量的值(不转换为字符串)。若变量不存在则返回null

String path = var.getObject("path");
log.info("path:"+ path);

2.3 移除变量 {#2.3-%E7%A7%BB%E9%99%A4%E5%8F%98%E9%87%8F}

方法声明:public Object remove(String key)

功能:删除一个变量,并返回变量的值,若变量不存在则返回 null

vars.put("name","温一壶清酒");
vName = vars.remove("name");
log.info("vName:"+ vName);
`vSex = vars.remove("sex");
log.info("vSex:"+ vSex);
`

2.4 批量赋值变量 {#2.4-%E6%89%B9%E9%87%8F%E8%B5%8B%E5%80%BC%E5%8F%98%E9%87%8F}

方法声明:public void putAll(Map<String,?> vars)

Parameters
Map<String,?> 以下map的子类均可使用:AbstractMap, Attributes, AuthProvider, ConcurrentHashMap, ConcurrentSkipListMap, EnumMap, HashMap, Hashtable, IdentityHashMap, LinkedHashMap, PrinterStateReasons, Properties, Provider, RenderingHints, SimpleBindings, TabularDataSupport, TreeMap, UIDefaults, WeakHashMap

功能:批量增加/更新变量的值

Map map = new HashMap();
map.put("name","测试");
map.put("age",88);
map.put("hobby","游戏");
vars.putAll(map);
`String name = vars.get("name");
log.info("打印名称"+name);
`

3 Beanshell 获取响应体、响应状态码、请求头 {#3-beanshell-%E8%8E%B7%E5%8F%96%E5%93%8D%E5%BA%94%E4%BD%93%E3%80%81%E5%93%8D%E5%BA%94%E7%8A%B6%E6%80%81%E7%A0%81%E3%80%81%E8%AF%B7%E6%B1%82%E5%A4%B4}

3.1 获取响应状态码 {#3.1-%E8%8E%B7%E5%8F%96%E5%93%8D%E5%BA%94%E7%8A%B6%E6%80%81%E7%A0%81}

方法声明:public String getResponseCode()

功能:获取响应状态码

responseCode = prev.getResponseCode() ;
log.info("responseCode:" + responseCode);

3.2 获取是否为OK对应的状态码 {#3.2-%E8%8E%B7%E5%8F%96%E6%98%AF%E5%90%A6%E4%B8%BAok%E5%AF%B9%E5%BA%94%E7%9A%84%E7%8A%B6%E6%80%81%E7%A0%81}

方法声明:public boolean isResponseCodeOK()

功能:判断响应状态码是否为OK对应的状态码(200),结果只有true和false

responseCodeBoolean = prev.isResponseCodeOK();
log.info("responseCodeBoolean:" + responseCodeBoolean);

3.3 获取String类型的响应结果 {#3.3-%E8%8E%B7%E5%8F%96string%E7%B1%BB%E5%9E%8B%E7%9A%84%E5%93%8D%E5%BA%94%E7%BB%93%E6%9E%9C}

方法声明:public String getResponseDataAsString()

prevResponse = prev.getResponseDataAsString();
log.info("prevResponse:" + prevResponse);

3.4 获取取样器结果的响应头 {#3.4-%E8%8E%B7%E5%8F%96%E5%8F%96%E6%A0%B7%E5%99%A8%E7%BB%93%E6%9E%9C%E7%9A%84%E5%93%8D%E5%BA%94%E5%A4%B4}

方法声明:publicStringgetResponseHeaders()

// 获取响应头
String ResponseHeaders = prev.getResponseHeaders();
log.info("ResponseHeaders:" + ResponseHeaders);

3.5 获取取样器请求头 {#3.5-%E8%8E%B7%E5%8F%96%E5%8F%96%E6%A0%B7%E5%99%A8%E8%AF%B7%E6%B1%82%E5%A4%B4}

方法声明:public String getRequestHeaders()

String RequestHeaders = prev.getRequestHeaders();

3.6 获取URL以字符串返回 {#3.6-%E8%8E%B7%E5%8F%96url%E4%BB%A5%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%BF%94%E5%9B%9E}

方法声明:public String getUrlAsString()

String UrlAsString = prev.getUrlAsString();

3.7 设置响应体 {#3.7-%E8%AE%BE%E7%BD%AE%E5%93%8D%E5%BA%94%E4%BD%93}

方法声明:public void setResponseData(String response)

prev.setResponseData("aaaaaaaaaaaaaaa");

1-1673510581806

4 Beanshell 获取请求参数 {#4-beanshell-%E8%8E%B7%E5%8F%96%E8%AF%B7%E6%B1%82%E5%8F%82%E6%95%B0}

4.1 获取请求请求体内容 {#4.1-%E8%8E%B7%E5%8F%96%E8%AF%B7%E6%B1%82%E8%AF%B7%E6%B1%82%E4%BD%93%E5%86%85%E5%AE%B9}

方法声明:public CollectionProperty getArguments()

import org.apache.jmeter.config.Arguments;

//获取请求的body参数 Arguments args = sampler.getArguments();

//将获取到的参数转换成字符串格式 String json = args.getArgument(0).getValue(); //注意:getArgument(0)中的0,一般获取到的请求参数中只有第0个数据。 //在获取返回值时,才会有多个数据列

log.info(&quot;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;{}&quot;, json); //输出值为:&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;{&quot;userId&quot;:&quot;123456&quot;,&quot;userType&quot;:&quot;123&quot;,&quot;type&quot;:&quot;1&quot;}


4.2 获取请求query参数部分 {#4.2-%E8%8E%B7%E5%8F%96%E8%AF%B7%E6%B1%82query%E5%8F%82%E6%95%B0%E9%83%A8%E5%88%86}

方法声明:public String getQuery()

String requestQuery = sampler.getUrl().getQuery();
log.info(">>>>>>>>>>>{}", requestQuery);
`//打印的值为: >>>>>>>>>>>name=1&age=1
`

4.3 获取协议 {#4.3-%E8%8E%B7%E5%8F%96%E5%8D%8F%E8%AE%AE}

方法声明:public String getProtocol()

String protocol = sampler.getUrl().getProtocol();
log.info(">>>>>>>>>>>{}", protocol);
`//打印的值为: >>>>>>>>>>>https
`

4.4 获取请求方式 {#4.4-%E8%8E%B7%E5%8F%96%E8%AF%B7%E6%B1%82%E6%96%B9%E5%BC%8F}

方法声明:public String getMethod()

String method = sampler.getMethod();
//返回值为大写GET

5 Beanshell 使用过程的坑 {#5-beanshell-%E4%BD%BF%E7%94%A8%E8%BF%87%E7%A8%8B%E7%9A%84%E5%9D%91}

5.1 泛型问题 {#5.1-%E6%B3%9B%E5%9E%8B%E9%97%AE%E9%A2%98}

beanshell里面使用map时不能指定类似于java的Map<String,String> map = new HashMap<String,String>(),这样写会报错,只能用Map params = new HashMap();

5.2 获取问题 {#5.2-%E8%8E%B7%E5%8F%96%E9%97%AE%E9%A2%98}

HeaderManager headerManager = sampler.getHeaderManager(); 这个方法不能获取默认的header,只能获取自己添加的header信息,比如自己再header里面加的token信息,默认的header信息,例如User-Agent是获取不到的,在获取headers之前一定要先判断一下header列表是否为空,如果不为空直接获取会报错

赞(1)
未经允许不得转载:工具盒子 » 【最佳实践】MeterSphere 接口测试 Beanshell 脚本使用:设置/获取接口信息、变量