需求背景:由于公司大多是集成非常多的项目,有算法组,c开发组,平台开发组,智能应用开发组等,每个组开发的功能,集成为最终的项目,本人项目组主要负责小程序的接口开发,在实际操作中经常出现接口挂掉,由此想到做个监控接口的东西。
作为一个java开发,本能想用java自己搭建一个平台,将接口录入到表中,同时将每次请求的参数和返回结果也保存到数据库表中,做一个纯java版的监控平台,有利于扩展,因为涉及到java,我就有的放矢了。但由于时间关系,决定先用jmeter开发一版。第一次看到jmeter是见测试人员压力测试用,经过搜集资料,发现它的功能蛮多的,能满足项目需求。在学习过程中,发现了非常好用的事务控制器,beanshell而且它很好的支持了java语言,让我喜出望外,自定义变量等好用的功能组件。
接下来,看一个我写好的例子,
开发步骤是这样的:新建测试计划->新建线程组->新建一个全局的beanshell取样器"环境与变量设置",放置全局变量,注意要放到最上面,因为jmeter是自上往下运行的->设置两个事务控制器“大脑”,“面舌诊”,这样每个事务控制器的请求是一个事务内的。->HTTP Request Defaults,这样就不需要每次http请求都写域名和端口号了,同时注意,http默认是80端口,而https默认是443端口->http请求->beanshell 后置处理器->beanshell断言->查看结果树(可以没有,但是运行后不能直观的看到结果,可以单独每个http请求加结果树,也可以在所有的请求外面加一个)。
要勾选对post请求使用multipart/form-data选项,同时在文件选项卡里配置文件的路径和类型
- import java.util.UUID;
- //uuid生成
- UUID uuid = UUID.randomUUID();
- vars.put("faceCheckId",(uuid.toString()).toUpperCase().replaceAll("-",""));
- UUID uuid2 = UUID.randomUUID();
- vars.put("tongueCheckId",(uuid2.toString()).toUpperCase().replaceAll("-",""));
- //设置环境 qa 测试环境 pro 生产环境
- String version = "qa";
- if(version.equals("qa")){
- vars.put("OHHttp","https");
- vars.put("FTDWHttp","http");
- vars.put("OHServerName","xxx.com.cn");
- //小程序userid变量
- vars.put("userId","123");
- }else if(version.equals("pro")){
- vars.put("OHHttp","https");
- vars.put("FTDWHttp","https");
- vars.put("OHServerName","xxx.com.cn");
- //userid变量
- vars.put("userId","890");
- }
- //email收件人邮箱
- String[] emailArray={"zhonghuahuizi@126.com","1214348669@qq.com"};
- vars.putObject("email",emailArray);
复制代码
其中高亮的vars是jmeter内部的全局存储,类似于java的request的作用域。因为beanshell支持java,所以,脚本里可以引入UUID。最下面的email收件人邮箱是,我用于接口报错触发发送邮件给相关负责人的收件人数组,可给多人发送邮件 在测试计划引入jar,为什么要引入jar包呢,因为项目接口返回的内容是json格式的,我就想用fastjson来处理json值来断言,虽然接口正常调用但是返回的内容不对,我就要用json得到的值,在断言里判断。还有一个用途是我想接口报错触发发送邮件,我将发送邮件的代码写在java项目里,将java项目打包为jar,jmeter引入,在断言里直接import我的类,调用即可。 - BeanShell PostProcessor后置处理器
- import com.alibaba.fastjson.JSONObject;
- String response_data = prev.getResponseDataAsString();
- JSONObject jsonObject = JSONObject.parseObject(response_data);
- String errCode_3 = jsonObject.get("errCode").toString();
- String fileId_3 = jsonObject.get("fileId").toString();
- String downloadUrl_3 = jsonObject.get("downloadUrl").toString();
- vars.put("errCode_3",errCode_3);
- vars.put("fileId_3",fileId_3);
- vars.put("downloadUrl_3",downloadUrl_3);
复制代码
prev.getResponseDataAsString()是jmeter内置的,取得返回的数据,然后用fastjson解析得到里面的值。 - import com.example.heimaobookshop.common.JavaMail;
- //使用vars.get()方法获取变量的值
- String code_5= vars.get("code_5");
- String message_5= vars.get("message_5");
- if("10000".equals(code_5) && "success".equals(message_5)) {
- FailureMessage = "规则解析成功";
- }else{
- Failure = true;
- FailureMessage = "[问诊列表]调用接口失败";
- new JavaMail().sendMail(vars.getObject("email"), FailureMessage,FailureMessage);
- }
复制代码
其中vars.get(string name)是jmeter取得字符串变量的用法,vars.getObject(String name)是jmeter取得对象变量的用法 vars.put(String name, String value)是jmeter添加字符串变量的用法,vars.putObject(String name, Object value)是jmeter添加对象变量的用法。 FailureMessage和Failure 是jmeter内置的,来决定请求是否按照自己的规则请求成功。 后续可以自己设置定时器运行脚本
|