(还是不太完善,先记录一下,免得忘了)
一、思路:
1、相同:接口和参数完全相同
2、不同:域名不同
3、要做的:对比响应,对比完产生报告,方便查看
二、需要的:
1、对于相同的最好通过读取配置文件的方式,参数化进行处理,使用的是ddt
2、域名不同(暂未处理,写死了)
3、对比json,自己总是考虑不全,有bug,所以查找第三方库处理(json_tools)
4、报告,使用unittest执行产生报告BeautifulReport
三、具体:
1、配置文件格式:使用的json处理方式
[
{
"description": "草稿列表第一页",
"skip": false,
"interface":"/article/draft?page=2",
"method": "GET",
"contentType": "application/x-www-form-urlencoded",
"data": {}
},
{
"description": "获取内容列表第一页",
"skip": false,
"interface": "/content/contentList?page=1",
"method": "get",
"contentType": "application/x-www-form-urlencoded",
"data": {}
},
{
"description": "视频的realmlist",
"skip": true,
"interface":"/video/realmlist",
"method": "get",
"contentType": "application/json",
"data": {}
}
]
2、具体代码:
【unittest】:https://www.cnblogs.com/daxiong2014/p/10449184.html
自动化测试框架
【ddt】:https://www.cnblogs.com/fukun/p/8671718.html
实现参数化
【BeautifulReport】 :https://blog.csdn.net/yiwenrong/article/details/101781792
报告模板
【json_tools】:https://blog.csdn.net/shuyichao/article/details/88311845
json对比,使用json_tools.diff(json01,json02),对比结果也很直观,放入一个list中,每个元素都是一个map,主要有add,remove和replace三种,add指的是json02比json01多出来的部分,remove则相反,replace是值不相同的地方,具体看博客,关键是如果要过滤的话根据这个结果过滤也很方便
# -*- coding: utf-8 -*-
import json_tools
import json
import unittest
import requests
import ddt
from BeautifulReport import BeautifulReport as bf
import time
'''代码重构,对比接口'''
filename = 'conf.json'
def get_interface():
with open(filename, 'r', encoding='utf8') as fp:
json_data = json.load(fp)
return json_data
@ddt.ddt
class Diff(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("****start****")
@classmethod
def tearDownClass(cls):
print("***end***")
@classmethod
def req(cls, method, host, interface, data={}, headers={}):
# 处理请求
url = host + interface
payload = data
response = requests.request(method, url, headers=headers, data=payload)
return json.loads(response.content)
@ddt.file_data('conf.json')
def test_diff(self, description, skip, interface, method, contentType, data):
if not skip:
test_host = 'host01'
nomal_host = 'host02'
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36',
'Content-Type': 'application/x-www-form-urlencoded'
}
print(description)
print("jh_url:" + test_host + interface)
print("nomal_url:" + nomal_host + interface)
print("data:" + str(data))
header['Content-Type'] = contentType
jh_res = Diff.req(method, test_host, interface, data,headers=header)
# print(json.dumps(jh_res, indent=4, ensure_ascii=False))
nomal_res = Diff.req(method, nomal_host, interface, data,headers=header)
# print(json.dumps(nomal_res, indent=4, ensure_ascii=False))
diff_res = json_tools.diff(jh_res, nomal_res)
print(json.dumps(diff_res, indent=4, ensure_ascii=False))
self.assertEqual(len(diff_res), 0)
else:
print(description)
print("skip")
if __name__ == "__main__":
suite = unittest.TestLoader().loadTestsFromTestCase(Diff)
run = bf(suite)
# run.report(filename='demo'+"_"+str(int(time.time())),description='test_demo_report')
run.report(filename='diff', description='test_diff_report')
3、运行
python xxxx.py
4、报告展示:
三、问题(待优化)
1、host最好也能进行配置
2、处理依赖的接口不够灵活(目前是根据传入的description字段进行判断,然后在写要依赖的接口取值),但是这块最好也能进行配置项
3、如果要过滤某些字段的判断,或忽略list的排序问题
4、简单的平台化:后续想用Django实现,要做的是上传配置文件,返回html报告地址,用户点击地址可查看报告详情
5、还有就是想用python脚本实现代理获能取所有请求,自动获取接口、请求头,请求参数,自动分别请求不同域名进行diff,哎,懂得太少。。。
6、仅仅是diff了,但是原本有的功能可能会被忽略,例如先存数据,再取数据,设计流程化请求diff