• 15
  • 15
分享
  • 4种Jmeter进阶扩展用法,难道你全都会?——软件测试圈
  • 曼倩诙谐 2021-11-11 09:56:06 字数 4550 阅读 1619 收藏 15

  Jmeter是基于Java开发的性能测试工具,也可以用于接口测试,对比LR来说,Jmeter的操作简单并且是一款开源软件,主要用来做功能测试和性能测试(压力测试/负载测试)。

  而且用Jmeter来测试Restful API,非常好用,下面为大家带来一些Jmeter的一些进阶扩展用法。

  正则表达式提取器详解

  正则表达式提取器又称作关联,可以把Response的值提取到变量中,提供给别的Http Request使用,在对应的需要获取关联的请求处右键添加后置处理器-正则表达式提取器来添加。

10-1.png

  正则表达式的字段用法

10-2.png

  引用名称:可以在别的请求中引用的名称。

  正则表达式:用来匹配需要的内容的正则表达式写法"token":"(.+?)",左边界为"token":",右边界为",中间部分为需要获取的内容。

  其中:

  .代表匹配任意字符

  +号表示匹配1次或多次

  ?表示0次或1次匹配

  还有一些常见的写法比如“\d,\w,\s - 匹配数字、字符、空格、\D,\W,\S - 匹配非数字、非字符、非空格”,具体的自己找网站进行练习。

  模板:$1$表示解析到的第几个值,如:$1$表示解析到的第1个值。

  匹配数字:0代表随机取值,1代表全部取值,通常情况下填0。

  缺省值:如果参数没有取得到值,那默认给一个值让它取。

  引用:后续在其他请求中的使用方法:${token}。

  验证:如果不确定写的正则表达式能不能匹配到数据,可以在查看结果树中进行查找,在对应的响应信息中输入正则表达式,勾选正则表达式,点击find按钮即可验证正则表达式是否能匹配到。

10-3.png

  JSON提取器详解:JSON提取器用于提取json格式的内容,对于接口返回内容是JSON格式的提取起来比正则表达式要简单不少。

  JSON提取器用法:选择需要获取内容的请求右键添加--后置处理器--JSON提取器。

10-4.png

  字段详解

  name of created variables:创建变量的名称,该名称后面调用时使用${变量名}引用。

  JSONPath Expression:JSON表达式。

  Match Numbers:匹配数字(0代表随机,1代表第一个,-1代表所有),可为空即默认第一个。

  Default Value:未取到值的时候默认值。

  Compute concatenation var(suffix_ALL):是否统计所有,即将匹配到的所有值保存,名为“变量名_ALL”,使用场景需要获取的值有多个,后面需要对这一组数据进行操作。

  JSON表达式的语法

  获取第一层中的某个value值:$.data;

  获取第二层List中某个key的value值:$data.token[0], 此处注意列表编号从0开始;

  获取第三层的某个value值:$data.token[0].xxx[0]

  获取特定条件的某个值,如data列表下,name=123的id。

  name:如果是数值则不需要引号“”,如果是字符串则需要用引号把值引起来。

  数值:$.data[?(@.pid==123)].id或者$.data[?(@.pid==${pid})].id

  验证

  使用Jmeter的查看结构树中的json path expression可以测试自己所写的JSON Extractor是否正常,写完JSON提取器后,点击test即可测试。

  测试结果如下:

10-4.png

  Beanshell取样器详解

  在利用Jmeter进行接口测试或者性能测试的时候,我们可能需要处理一些复杂的请求,比如处理简单的加密函数,或者一些文件数据转换base64等等。

  此时就需要利用Beanshell脚本了,BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法,所以它和Java是可以无缝衔接的。

  变量

  Jmeter中为脚本定义了下列变量:

  SampleResult、ResponseCode、ResponseMessage、IsSuccess、Label、FileName、ctx、vars、props、log。

  常使用的变量用法

  log:打印日志,写入信息到jmeber.log文件。

  SampleResult:获取SampleResult对象,能通过这个对象获取想要的信息。

  ResponseCode:返回接口code。

  ResponseMessage:获取msg。

  vars.get(String key):从jmeter中获得变量值。

  vars.put(String key,String value):数据存到jmeter变量中。

  prev:获取前面的sample返回的信息。

  引入Java文件

  通过使用source("java文件路径")方法引入Java,然后调用方法和java一样,new一个class,再调用里面的add 方法。

  引入jar包

  需要把jar包放置在Jmeter安装目录中的\lib\ext下,然后重启Jmeter,或者在Test Plan的右侧面板最下方直接添加需要引用的jar包,如下图:

10-6.png

  Beanshell取样器实战

  由于工作日常中需要用到base64的转换,文件或者数据转换成base64格式之后再当作参数去发起请求,每次都是在网上在线base64转换,感觉很麻烦,于是用beanshell取样器写了一个脚本,这样就不用每次都在线转换了。

  文本内容转换base64

  代码示例:

import sun.misc.BASE64Decoder;
String data = new sun.misc.BASE64Encoder().encode("${textpath}".getBytes());
// ${textpath}:要加密的字符串参数,加密后的字符串保存在data参数中
vars.put("textbase64", data);
//将data数据存储到变量textbase64中


10-7.png

  后续直接在用户定义的变量中传入对应的需要转换的内容后,即可在其他请求中使用${textbase64}来引用了。

  文件转换base64

  代码示例:

import java.io.File;
import java.io.IOException;
import java.util.Base64;
import org.apache.commons.io.FileUtils;
String file_name = "${filepath}";
//可以在用户定义的变量中直接定义文件的路径
String base64Str = Base64.getEncoder().encodeToString(FileUtils.readFileToByteArray(new File(file_name)));
vars.put("filebase64", base64Str);
//将base64Str数据存储到变量filebase64中


10-8.png

  后续直接在用户定义的变量中传入对应的需要转换的内容后,即可在其他请求中使用${filebase64}来引用了。

  base64转换文件

  在需要转换为文件的请求中添加后置处理器-BeanShell后置处理程序,对需要转换base64为文件的请求中添加正则表达式提取器,变量名称为“signedpdf”,在下方参数栏中传入该参数。

10-9.png

  代码示例:

import java.io.File;
import java.io.IOException;
import java.util.Base64;
import org.apache.commons.io.FileUtils;
import java.io.FileWriter;
import java.io.IOException;
import org.json.*;
FileWriter file = new FileWriter("${base64file}",true);
//可以在用户定义的变量中定义的输出到文件的路径
BufferedWriter out = new BufferedWriter(file);
out.write(vars.get("signedPdf")+"\n");
//引号里的内容是响应里面需要转换为文件的base64内容
out.close();
file.close();
String file_name = "${base64file}";
FileUtils.writeByteArrayToFile(new File("D:/base64file/changedFile.pdf"), Base64.getDecoder().decode(FileUtils.readLines(new File(file_name)).get(0)));
//file文件格式按文件类型进行修改

  设置全局变量

  在日常工作中会遇到需要跨线程调用的情况,可以在beanshell中设置为全局变量,这样就可以跨线程调用了。

  在需要做关联的地方获取变量后,紧接着添加一个BeanShell 后置处理程序。

  输入${__setProperty(textbase64,${textbase64},)};

1-10.png

  在其他线程组中使用${__property(textbase64)}即可引用该参数。

  下载文件

  在下载或者导出文件的http请求处右键添加后置处理器-BeanShell后置处理程序,使用Beanshell脚本来处理下载的资源到本地,可以结合参数化生成不同的文件名。

  代码示例:

import java.io.*;
byte[] result = prev.getResponseData();
String file_name = "C:/Users/Administrator/Downloads/${__time(,)}.xls";
//结合参数化指定下载的文件名称和路径
File file = new File(file_name);
FileOutputStream out = new FileOutputStream(file);
out.write(result);
out.close();


1-11.png

  总结

  Jmeter中的Beanshell用法很强大,支持对象式的脚本语言特性,亦可嵌入到Java源代码中,能动态执行Java源代码并为其扩展了脚本语言的一些特性,所以用好Beanshell能为日常的测试工作提升很多实用性以及便利性,可以用来处理各种方便的操作,在这里只是冰山一角,更多的内容还需要我们坚持学习。

  其实用好工具不是关键,关键的是要时刻保持一颗主动学习的心。



作者:windfall   

来源:http://www.51testing.com/html/15/n-4479815.html


为了回馈广大用户对51Testing软件测试网的支持,我们特地准备了一份测试实战课程礼包给大家,点击下方链接填写行业调查问卷,三门课程任选其一,拿来吧你~


2021 问卷礼物图.png

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 1.人工智能与机器学习人工智能(AI, Artificial Intelligence)与机器学习(ML, Machine Learning)是时下最火热的技术方向之一。准确地讲,人工智能不等同于机器学习,机器学习只是人工智能的一个子集。由于媒体的误用,本文遵循媒体的叫法,文中提到的人工智能,一般泛指机器学习。人工智能,顾名思义,就是希望创造出拥有像人类那样智能的机器,这是人类的终极梦想之一。该词早在1956年就提出了,当时的科学家曾乐观地估计,二十年左右人类就可以将其实现。然而科学家也很快就发现其难度远大于预估。在此之后的很长一段时间里,人工智能的研究陷入低谷。通常我们将人工智能分为弱人工智...
            0 0 1952
            分享
          • 一、单元测试(模块测试)单元测试是对软件组成单元进行测试。其目的是检验软件组成单位的正确性。测试对象是:模块。对模块进行测试,单独的一个模块测试,属于静态测试的一类。测试阶段:编码后或者编码前(TDD);测试对象:最小模块;测试人员:白盒测试工程师或开发工程师(测源码);测试依据:代码和注释+详细设计文档;测试方法:白盒测试(因为要测源码);测试内容:模块接口测试(测试模块里面的参数传递是否正确)、局部数据结构测试(测试变量的作用域范围)、路径测试(if-else 判断必须覆盖所有分支)、错误处理测试、边界测试( for 循环)。二、集成测试集成测试也称联合测试,将程序模块采用适当的集成策略组...
            0 1 2730
            分享
          •   本文主要针对填写BUG时,bug分类共分为多少项,每一项内容都有哪些场景,并结合具体错误案例进行简单分析。  一 UI表示层  在软件测试和开发中,当提到“用户UI”类型的bug时,通常是指与用户界面(User Interface)相关的问题。用户界面是用户与软件交互的部分,它包括视觉元素、布局、导航以及用户可以与之交互的所有组件。  以下是一些常见的用户UI类型的bug:  1.布局问题:UI元素未正确对齐,或者在不同分辨率或屏幕尺寸下显示不正确。  2.样式问题:颜色、字体大小或样式不符合设计规范,或者在不同的操作系统或浏览器上显示不一致。  3.导航问题:用户无法通过预期的方式在应用...
            0 0 683
            分享
          • 随着银行主机应用的陆续下移,开放平台应用的数量和规模均呈上升趋势,应用系统性能的高低不仅影响着系统上线后的稳定运行,更关系着银行的声誉。性能测试作为应用系统上线前性能把控的最后一道关口,其重要性不言而喻。本文针对性能测试过程中的存在的问题,梳理并研究开放平台应用系统性能测试方法和技术,明确了性能测试过程重要环节的工作策略,目的在于指导性能测试工作开展,进而提升性能测试质量。1、现状分析近年来,各商业银行均组建了专业的测试团队承担性能测试工作,工作规范度日益加强,但由于银行开放平台应用系统具有规模大、交易量大、数据量大、技术架构和软件多样化、关联系统复杂等特点,性能测试工作仍存在一些问题。一是测...
            0 1 2497
            分享
      • 51testing软件测试圈微信