1.自动化测例架构介绍
1.1 项目介绍
该项目使用python语言实现,基于pytest测试框架且集成Allure和Jenkins,使用阿里开元的代理工具AnyProxy获取接口信息,提交到Flask服务接口存入到mysql数据库,通过Jenkins拉取GitHub代码,并执行测试,最终输出Allure测试报告,并通过邮件发送给相关人员。
1.2 引入目的
减少回归测试的使用时间,提高效率,方便维护和事后追溯
2. 测试整体流程
2.1 开启代理AnyProxy抓取测试数据
2.1.1 配置AnyProxy略过,网上很多教程,也比较简单
服务器可以参考:https://www.jianshu.com/p/e309d4edd9de
2.1.2 提供接收抓取数据的接口及数据库表结构创建
使用flask轻量级web框架,提供接收数据的接口
CREATE TABLE `srm_cases` (
`ID` int(11) unsigned NOT NULL AUTO_INCREMENT,
`REQUEST_URL` varchar(500) NOT NULL DEFAULT '',
`REQUEST_BODY` text,
`REQUEST_METHOD` varchar(10) NOT NULL DEFAULT '',
`CREATE_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`REQUEST_HEADERS` text,
PRIMARY KEY (`ID`),
UNIQUE KEY `REQUEST_URL` (`REQUEST_URL`)
) ENGINE=InnoDB AUTO_INCREMENT=436 DEFAULT CHARSET=utf8mb4 COMMENT='CREATE TABLE `srm_cases` (\n `ID` int(11) unsigned NOT NULL,\n `REQUEST_URL` varchar(200) DEFAULT NULL,\n `REQUEST_BODY` text,\n `REQUEST_METHOD` varchar(10) DEFAULT NULL,\n `CREATE_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON CURRENT_TIMESTAMP,\n PRIMARY KEY (`ID`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;';
2.1.3 提供AnyProxy代理抓取过滤脚本
module.exports = {
*beforeSendResponse(requestDetail, responseDetail) {
if (requestDetail.url.indexOf('gbsdev.geekvape.cn/prod-api') != -1) {
const newRequestOptions = requestDetail.requestOptions;
var req_data = decodeURIComponent(requestDetail.requestData);
var post_data={"requestUrl":requestDetail.url,"requestBody":req_data,"requestHeaders":newRequestOptions.headers,"requestMethod":newRequestOptions.method};
// parse 为自己 server 路径
let res = sendPostJsonHttpRequest(post_data, 'srm');
}
},
};
function sendPostJsonHttpRequest(body, route) {
var http = require('http')
var querystring = require('querystring');
let options = {
hostname: '127.0.0.1',
port: 9999,
path: '/' + route,
method: 'POST',
headers: {"content-type": 'application/json'}
};
var contents=JSON.stringify(body);
var req = http.request(options, function(res){
res.setEncoding('utf8');
});
req.write(contents);
req.end();
};
function sendPostFormHttpRequest(body, route) {
var http = require('http')
var querystring = require('querystring');
let options = {
hostname: '127.0.0.1',
port: 5001,
path: '/' + route,
method: 'POST',
headers: {"content-type": 'application/x-www-form-urlencoded'}
};
var contents = querystring.stringify(body);
var req = http.request(options, function(res){
res.setEncoding('utf8');
});
req.write(contents);
req.end();
};
2.1.4 启动抓取工作
windows 启动代理服务: anyproxy -i -p 8001 -w 8002 -r D:\anyproxycrawljs\shop.js
linux 启动 : /usr/local/nodejs/node12/bin/anyproxy -i -p 8001 -w 8002 -r /usr/local/nodejs/shop.js
MAC : anyproxy -i -p 8001 -w 8002 -r /Users/heavengifts/Desktop/nodejs/srm.js
代理UI页面地址: http://127.0.0.1:8002/
2.2 Jenkins自动构建测试,输出测试报告
3. 具体代码实现
环境搭建 :服务端依赖环境搭建
3.1 封装RestClient,增加日志记录
core -- >> rest_client
3.2 RequestBasic继承RestClient,使其适用本项目
common -- >> basic_http
3.3 封装前置条件【破解验证码及登录】获取Authorization认证
testcases -- >> conftest
common -- >> img_utils
3.4 配置mysql 线程池,读取配置文件数据
common -- >> mysql_pool
3.5 配置数据源,执行测试,发送邮件测试报告
testcases -- >>api_test-- >> test_db_data_srm
testcases -- >> conftest
3.6 查看测试测试报告