0


Jmeter5.x性能测试之自定义BeanShell脚本实战(一)

前言

    本章节适合具备一定开发基础或有javase基础人员学习,否则理解起来会相对吃力。

    互联网企业中,作为一名测试工程师,能具备一门开发语言是一种优势,如java,python等;现互联网行业中界面测试,功能测试是企业中常用且基础的测试方式,较少部分的人能编写和接触性能方面的测试,其中使用postman,浏览器作为日常的测试工具较普遍。每天也只能跟着已编写完成的测试用例一个一个手动验证,反复的操作没有一点技术含量。

    懂得编程的测试人员,可以使用测试工具编写代码让预期值和结果值的比较,并输出测试报告;当项目还需要二次验证时,只需要简单的命令,就可以得到测试报告。即便项目有做逻辑上调整或是业务的新增,也是在原有脚本上稍微做调整就可,大大提高了测试效率。性能测试上,部分项目的接口需要进行加密处理,或是进行模拟多种数据的批量压测,懂编程的测试人员可以使用工具进行二次开发来达到预期值效果。

BeanShell简介

  • 用Java写成的小型、免费的Java源代码解释器
  • 可以执行标准Java语句和表达式,完全符合java语法的java脚本语言(需要会javase语言基础)
  • 包括一些脚本命令,有自己的一些语法和方法,是一种松散类型的脚本语言
  • 用于一些复杂的个性化需求,使用更灵活,功能更强大
  • 官网地址:http://www.beanshell.org
  • 由于只是单纯的源代码解析器,在编写代码时无自动提示功能,非常不方便;推荐使用idea工具编码后再去Jmeter引入执行

使用场景

  • 需要在jmeter里面对数据的二次处理,定制自己的业务逻辑,属于Jmeter的二次开发。如:对参数进行加密、base64编码、时间格式化、文件操作、自定义断言等。

业务场景

    在互联网行业中,数据安全性是尤为重要,防止数据被窃取,篡改,以及非法数据攻击等行为,程序员在设计项目接口,需要对部分对外暴露的接口做安全策略,如数据的加密,接口的白名单限制等等操作。 普通测试人员遇到此类接口也只能做做功能测试和界面测试,性能方面却无从下手。懂编程的测试人员,他们可以使用工具进行二次开发,和开发获取加密所需的条件,如jar包,或是算法等,然后进行数据的模拟对接口进行压力测试,形成测试报告。如微信,支付宝的支付都才有了数据加密传输。

BeanShell基础入门实战

需要更换Jmeter的皮肤外观且开启日志控制台,方便查看输出日志。

BeanShell常用分类

  • 采样器BeanShell
  • 前置处理器 BeanShell PreProcessor:提前对参数处理,如:加密编码
  • 后置处理器 BeanShell PostProcessor :对返回结果做处理,如:根据业务代码判断是否请求成功
  • 断言 BeanShell Assert :验证请求接口是否满足要求

** BeanShell采样器**

线程组上右击:线程组->采样器->BeanShell采样器

BeanShell内置对象,可以直接使用,这里只介绍部分:
内置对象作用SampleResult样例结果ResponseCode返回的状态码ResponseMessage返回信息IsSuccess是否成功Label样例FileName文件名ctxJMeter的上下文vars变量操作propsJMeter属性log日志信息输出;只能是字符串,存入对象会报错prev样例的

前置

结果

读取

BeanShell第一个实战案例

BeanShell核心知识点开发实战

  • vars

使用Bean shell内置对象vars对【变量】进行存取操作,作用在当前线程组,类似java里面的map

vars.put("name","Tom");// 数据存到jmeter变量中
String name = vars.get("name");// 从jmeter中获得变量值
log.info(name); // 输出结果Tom
  • props

使用Bean shell内置对象props 对【属性】进行存取操作,作用在跨线程组使用

props.get("language"); //jmeter.properties配置文件里面定义的属性
String lang = props.put("language","zh_CN");
log.info(lang); //输出 zh_CN

实战案例一:

要求:使用BeanShell采样器或是前置采样器(BeanShell PreProcessor)实现“课程详情”接口动态传参;

新建HTTP采样器和BeanShell采样器,并输入代码;

// 使用BeanShell 动态传参
vars.put("id","2222");    // 编号
vars.put("title","Jmeter之BeanShell动态传参"); //课程名称

请求数据成功,测试结果:

高级进阶-BeanShell基于响应结果自定义断言

需求:在项目中,响应状态码200并不能表示接口业务逻辑已处理完成;如登录接口;登录时,账号没有输入,响应状态码也会返回200,但是业务返回结果是“{'code':-1,'msg':'登录账号不能必填'}”,我们不希望这种是被识别为成功的响应;那么判断这种场景的业务状态码,需要我们自定义断言来拦截判断。

BeanShell提供以下内置属性供我们进行自定义响应断言

​​​String data = prev.getResponseDataAsString() //获取响应信息
prev.getResponseCode() //获取响应code,返回一个int数据
Failure = false //表示断言成功
Failure = true //表示断言失败

prev.getResponseDataAsString():获取服务器响应结果,返回为字符;如果要解析内容获取业务状态码,我们需要使用第三方json工具进行解析;

Jmeter目录下引入JSON解析工具包,方便后期编写代码导入。

说明:Jmeter依赖JDK环境进运行,可以理解为jdk中的jar都可以给Jmeter进行导入使用,但是某些业务场景需要引入第三方包支持;引入时,通常都放在Jmeter目录下的\lib\ext文件中即可;关于测试人员没有的jar包,做项目开发人员的本地都会有保存;

实战案例二:

以测试环境的“用户登录接口”做示例演示:

新增HTTP请求采样器,并录入“用户登录”接口参数信息;

线程组右键:添加->断言->BeanShell断言,并录入代码

import org.json.*; //导入第三方json工具包,通常放在jmeter目录下的lib\ext内

String data = prev.getResponseDataAsString();  //获取响应信息
String responseCode = prev.getResponseCode(); //获取http响应码
log.info("responseCode="+responseCode);

JSONObject jsonobj = new JSONObject(data);  //转json对象
log.info(jsonobj.toString());

int code = jsonobj.getInt("code");//业务状态码
log.info("业务状态码code="+code);

if(code==1){
    log.info("成功");
  Failure=false;
}else{
    log.info("失败");
  Failure=true;
  FailureMessage=jsonobj.getString("msg");//打印后台状态码
}

察看结果树,向服务器发起请求后,响应结果如下:

即便状态码为200的情况下,我们自定义的断言也根据响应的业务代码将结果判断为不符合标准。

实战案例二:

需求:有些项目接口中需要对参数进行加密,比如MD5,对称加密和非对称加密等,则可以使用JDK内置的jar包进行操作;

import org.apache.commons.codec.digest.DigestUtils;
String str = "holle world!";
log.info("加密前明文:"+str );

String signs = DigestUtils.md5Hex(str );
log.info("加密后md5:"+signs);

vars.put("title",(signs.toString()).toUpperCase());

如果本文对你有帮助,留个赞被!在此谢过!


本文转载自: https://blog.csdn.net/u011673769/article/details/127482947
版权归原作者 ♂老码♂ 所有, 如有侵权,请联系我们删除。

“Jmeter5.x性能测试之自定义BeanShell脚本实战(一)”的评论:

还没有评论