前言
本章节适合具备一定开发基础或有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());
如果本文对你有帮助,留个赞被!在此谢过!
版权归原作者 ♂老码♂ 所有, 如有侵权,请联系我们删除。