Metersphere实现对外加密接口自动化测试
目录
一、加密规则
1.1请求参数加密规则
1、按照请求参数名称的ASCII码顺序组装成字符串,用&符号链接,如appId=mcpbasic&code=&noStr=1594196501668,其中appId、code、noStr分别为参数名,按ASCII码顺序组装成字符串;
2、将secret密钥作为参数拼接到字符串后,如appId=mcpbasic&code=&noStr=1594196501668
&secret=qx9iv415d7f81as213as3q4c23hv45;
3、对组装好的字符串进行MD5加密转大写,如573792BE79621279A712D6860DA6B60C;
4、组装json字符串,json对象内容没有加密前字符串除secret外其他的键值对以及MD5加密后数据作为键值sign的value值一并组装成json字符串,如{"noStr":"1594196501668","code":"","appId":"mcpbasic","sign":"573792BE79621279A712D6860DA6B60C"};
5、将组装好的json字符串进行Base64 GBK方式加密形成加密后的密文,如eyJub1N0ciI6IjE1OTQxOTY1MDE2NjgiLCJjb2RlIjoiIiwiYXBwSWQiOiJtY3BiYXNpYyIsInNpZ24iOiI1NzM3OTJCRTc5NjIxMjc5QTcxMkQ2ODYwREE2QjYwQyJ9;
6、将加密好的Base64密文作为接口入参,并调用接口获取接口返回数据;
1.2 jar包准备工作和思路
metersphere无法对参数的加密规则进行处理,所以要在java开发工具IDEA中写java代码来实现参数的加密规则处理,最终返回一个加密后的密文,在http请求中作为入参调用。
- 首先打开IDEA,创建java项目,新建一个class文件,按照开发提供的加密规则编写java代码。
- 除了按加密规则写了一个方法外,还要再写一个添加方法,可以将参数添加到jason格式的字符串参数中。
- 使用IDEA测试一下写好的代码,通过后使用IDEA进行打包。
- 登录meterspere将jar包上传(见2.3.4)。
- 使用metersphere中的前置脚本调用该jar包。(见3.3.1)
- 在前置脚本中使用jar包中的添加方法将处理好的参数添加到json字符串中。(见3.3.1)
- 在前置脚本中使用jar包中的加密方法,将整个json字符串参数进行加密处理。(见3.3.1)。
二、实现接口自动化测试
在metersphere场景变量中写测试用例,然后执行测试用例,但场景变量中的用例写起来数量很多且执行次数有限(比如id不能重复,编码不能重复),每次执行都要先去改一下参数的值。
(1)可以先在SQL请求中从数据库查询出来正确的参数(见3.2)
(2)再在前置脚本中获取查询的参数做修改即可(见3.3)
比如单据号是否正确,想要写一个测试用例为,单据号错误,只需要查询出正确的单据号,再做修改后自动放场景变量reg里面即可。
(3)Sql查询的参数就不用手动写在场景变量中了,因为步骤(2)中通过jar包中的方法添加到场景变量中了
三、登录metersphere
四、创建项目
2.1创建项目
2.2环境配置
2.2.1通用配置
2.2.2 http配置
2.2.3数据库配置
2.3.4上传jar包文件
包括自定义的jar包以及一些内部jar包(内部jar有需要就补充主要是IDEA中添加的jar包)
自定义jar包在IDEA中如下:在main\java文件夹下新建一个class文件,写好之后打包即可。
五、编写场景中的测试用例
3.1场景变量
填写变量名和值,接口所需要的参数都写在值里面
3.2自定义请求---SQL查询
Sql查询自定义请求的目的就是为了自动获取参数。
每次执行不需要在场景变量中手动修改测试用例,只需要运行sql查询,获取自己需要的参数即可。获取之后可以在前置脚本中对参数进行修改,再通过jar包中的方法,放在场景变量中。
1、添加运行环境、数据源名称(在环境配置中配置)
2、按列存储:将sql运行结果填到这里,用英文逗号隔开。
bill_no,sponsor_org_id,receive_pharmacy_id
3、SQL脚本:获取自己所需要的参数,返回一条数据(一行一列)即可。
SELECT b.bill_no,b.sponsor_org_id,d.receive_pharmacy_id from rdc_material_bill b,rdc_distribution d where b.distribution_id= d.id and b.delete_status='N' and d.delete_status='N' and d.send_status='0' and b.bill_type='5' limit 1
3.3自定义请求---HTTP请求
3.3.1前置脚本
在前置脚本中,主要是对参数的一些处理
变量可以直接全部写在场景变量中(非自动化接口测试),也可以将SQL自定义请求的参数再通过jar包中的方法,放在场景变量中,实现接口自动化测试。
//1、引用jar包
import main.java.*;
//2、获取场景变量中的参数reg
String reg=vars.get("MAT001_1.正确参数");
//3、获取sql查询的参数, bill_no_1表示这一列的第一行参数
String billNo = vars.get("bill_no_1");
String orgId = vars.get("sponsor_org_id_1");
String roomId = vars.get("receive_pharmacy_id_1");
//4、引用jar包中的方法addvalue()将处理好的值传入到场景变量中的参数reg中
GetParmsJson p =new GetParmsJson();
String reg = p.addValue(reg,"billNo",billNo);
String reg = p.addValue(reg,"orgId",orgId);
String reg = p.addValue(reg,"roomId",roomId);
//5、引用jar中的方法getStringToJson02( )对场景变量中的参数按照加密规则进行加密
String s= p.getStringToJson02("noStrN",reg,"${secret}");
//6、将最终处理好的参数存在metersphere中,以便请求体获取参数
vars.put("parameterBase64",s);
//7、调试中的使用的语句,打印日志
log.info("打印输出"+s);
3.3.2后置脚本
prev.setDataEncoding("UTF-8");
3.3.3断言
http请求断言
脚本断言
if(${sum_1}==1){
AssertionResult.setFailure(false);
log.info("=====诊疗目录启用成功=====");
}else{
AssertionResult.setFailure(true);
log.info("=====诊疗目录启用失败=====");
}
3.3.4请求体
- 填写post路径
- 在请求体处选择raw,内容填写${parameterBase64}
${parameterBase64}------获取前置脚本中保存的经过BASE64加密后的参数
六、运行测试用例
带有SQL请求的必须要点调试才行,测试用例是按顺序从上到下执行的。
调试结果如下
整体看结果
响应体
断言结果: