MagicOTP (Online Test Platform)是一个开源的线上测试平台,思想是通过回放大批量线上真实请求,并结合规则验证的形式对服务返回的结果进行校验。相对于传统测试用例设计中固定的输入和输出数据方式,更能提高数据的覆盖度,对系统稳定性监测提供有力的保障。请求数据来源于线上服务真实请求的收集,验证规则又不依赖于具体请求数据,大大节省了开发和维护的成本。依托此线上测试平台,您只需要根据业务需求梳理添加功能点的校验规则,即可完成接入,快速完成对线上服务的业务逻辑验证工作。
-
线上请求回放
线上测试 采集线上请求后通过平台回放请求的方式进行功能逻辑的验证。支持多应用的接入,分别配置不同的请求文件和校验规则。提交任务时指定测试地址、选取测试数据后任务即可执行,可以通过WEBUI查看历史测试任务的结果和详细信息。
-
规则引擎
规则校验 通过脚本对业务功能逻辑进行规则编写,根据不同的应用名称选取相应规则在运行测试任务时进行规则校验,实现验证功能点和数据的匹配。规则还有准入条件的筛选流程,满足预设条件的数据才进行规则验证。通过脚本的方式实时修改免编译发布,编写方便维护成本低。
git clone http://gitlab.alibaba-inc.com/engine-test-platform/xuanwu-op.git
创建数据库
create database steed
source deployment/database.sql
修改配置文件中的ip
1. platform/src/main/resources/application.properties
spring.datasource.url=jdbc:mysql://ip:3306/steed?useSSL=false
spring.datasource.username=****
spring.datasource.password=******
#规则引擎地址
rule.address=http://ip:9191
2. agent/src/main/resources/application.properties
spring.redis.host=ip
3. agent/src/main/resources/applicationContext.xml
<property name="url" value="jdbc:mysql://ip:3306/steed"/>
进入xuanwu-op/agent目录,启动agent
mvn clean package
java -jar target/RuleEngine.jar
进入xuanwu-op/platform,启动platform,完成后即可通过配置的端口号访问(默认访问地址为: ip:9100)
mvn clean package
java -jar target/MagicOTP-1.0-SNAPSHOT.jar
若需要进行前端页面的修改,进入xuanwu-op/platform/frontend编辑后,执行以下命令重新部署即可。
tnpm install
tnpm start
tnpm run build
在编写统计类规则时,数据存储在redis中,需要安装部署redis数据库。
MagicOTP以中国气象局查询天气服务为例,提供了一个通过平台进行线上测试的任务样例。首先在本地创建需要回放的请求串列表文件,平台回放文件中的请求到指定的服务器,对返回的数据通过规则的形式进行功能验证,任务结束后可以查看测试任务执行的结果及详情信息。
-
测试数据文件准备。案例中使用测试数据文件(deployment/steed_data),需拷贝该文件到配置的数据读取路径下(platform/src/main/resources/application.properties)。
请求地址:
文件中不同的id代表不同的城市,通过GET请求会返回一个JSON格式的数据,包含该城市的具体天气信息:
http://www.weather.com.cn/data/sk/101190101.html
{ "weatherinfo":{ "city":"南京", "cityid":"101190101", "temp":"21.9", "WD":"东风", "WS":"小于3级", "SD":"96%", "AP":"1000.9hPa", "njd":"暂无实况", "WSE":"<3", "time":"17:55", "sm":"3.2", "isRadar":"1", "Radar":"JC_RADAR_AZ9250_JB" } }
-
MagicOTP通过获取每条请求返回的不同城市的天气数据,通过预先编写的规则来验证功能是否正确。案例中提供了五条参考规则进行验证。
-
功能逻辑规则
应用名称:steed_data 规则名称:请求中的id与返回中cityid值一致 规则分类:功能逻辑验证 规则等级:高 是否启用:是 准入条件:返回结果jsonArr.size() > 0; 规则内容: temp = 原始查询串.split("/"); temp1 = temp[temp.length-1]; req_cityid = temp1.split(".html")[0]; res_cityid = 返回结果jsonArr.getJSONObject(0).getJSONObject("weatherinfo").get("cityid"); if (req_cityid != res_cityid) { 记录错误("返回中的cityid与请求中不一致"); return false; } return true;
应用名称:steed_data 规则名称:返回结果中的时间满足正则 规则分类:功能逻辑验证 规则等级:高 是否启用:是 准入条件:返回结果jsonArr.size() > 0; 规则内容: res_time = 返回结果jsonArr.getJSONObject(0).getJSONObject("weatherinfo").get("time"); pattern = "^(([0-1]?[0-9])|([2][0-3])):([0-5]?[0-9])(:([0-5]?[0-9]))?$"; flag = matchPattern(res_time,pattern); if( flag == false){ 记录错误("返回时间格式异常"); return false; } return true;
-
统计类规则
应用名称:steed_data 规则名称:中国气象局查询天气服务结果统计空结果率正常 规则分类:其他验证 规则等级:高 是否启用:是 准入条件:(统计结果.get("total_query") != null) and (统计结果.get("total_query") >= 1) 规则内容: total = 统计结果.get("total_query"); emptys = 统计结果.get("empty_return"); if(emptys == null){ return true; } if( total== null || total == 0){ 记录错误(format("统计数据异常,total_query为0或者不存在")); return false; } emptys = emptys * 100; ratio = emptys/total; if(ratio > 80){ 记录错误(format("空结果率为 %s,不在[0,80]范围内",ratio)); return false; } return true;
-
失败规则示例
应用名称:steed_data 规则名称:失败demo: 返回结果中isRadar不为1时失败 规则分类:其他验证 规则等级:高 是否启用:是 准入条件:type == "steed_data"; 规则内容: isRadar = 返回结果jsonArr.getJSONObject(0).getJSONObject("weatherinfo").get("isRadar"); if (isRadar != "1"){ 记录错误("返回结果中的isRadar不为1"); return false; } return true;
-
未命中规则示例
应用名称:steed_data; 规则名称:未命中demo:准入条件不满足 规则分类:其他验证 规则等级:高 是否启用:是 准入条件:type == "steed" 规则内容: return true;
-
-
进入"任务管理"页面,点击新建,填写任务的基本信息如下,点击确定
任务名称:中国气象局查询天气服务 请求地址: http://www.weather.com.cn 测试数据文件:steed_data
-
任务列表中即可查看任务详细信息,包含执行状态、执行结果等。
MagicOTP目前提供了基础的通过线上请求回放的方式进行功能逻辑的验证,后续开源计划如下:
- 开源更加完善的线上测试解决方案;
- 开源利用算法技术的规则智能化推荐生成。
MagicOTP由阿里集团-新零售智能引擎事业群-广告产品技术事业部-技术质量-引擎&基础测试及平台团队荣誉出品,欢迎通过邮件组[email protected]和github issue联系和反馈。