(還是不太完善,先記錄一下顿仇,免得忘了)
一淘正、思路:
1、相同:接口和參數(shù)完全相同
2臼闻、不同:域名不同
3鸿吆、要做的:對比響應(yīng),對比完產(chǎn)生報(bào)告述呐,方便查看
二伞剑、需要的:
1、對于相同的最好通過讀取配置文件的方式市埋,參數(shù)化進(jìn)行處理黎泣,使用的是ddt
2、域名不同(暫未處理缤谎,寫死了)
3抒倚、對比json,自己總是考慮不全坷澡,有bug托呕,所以查找第三方庫處理(json_tools)
4、報(bào)告频敛,使用unittest執(zhí)行產(chǎn)生報(bào)告BeautifulReport
三项郊、具體:
1、配置文件格式:使用的json處理方式
[
{
"description": "草稿列表第一頁",
"skip": false,
"interface":"/article/draft?page=2",
"method": "GET",
"contentType": "application/x-www-form-urlencoded",
"data": {}
},
{
"description": "獲取內(nèi)容列表第一頁",
"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
實(shí)現(xiàn)參數(shù)化
【BeautifulReport】 :https://blog.csdn.net/yiwenrong/article/details/101781792
報(bào)告模板
【json_tools】:https://blog.csdn.net/shuyichao/article/details/88311845
json對比着降,使用json_tools.diff(json01,json02),對比結(jié)果也很直觀拗军,放入一個list中任洞,每個元素都是一個map蓄喇,主要有add,remove和replace三種交掏,add指的是json02比json01多出來的部分妆偏,remove則相反,replace是值不相同的地方盅弛,具體看博客钱骂,關(guān)鍵是如果要過濾的話根據(jù)這個結(jié)果過濾也很方便
# -*- coding: utf-8 -*-
import json_tools
import json
import unittest
import requests
import ddt
from BeautifulReport import BeautifulReport as bf
import time
'''代碼重構(gòu),對比接口'''
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挪鹏、運(yùn)行
python xxxx.py
4罐柳、報(bào)告展示:
三、問題(待優(yōu)化)
1狰住、host最好也能進(jìn)行配置
2张吉、處理依賴的接口不夠靈活(目前是根據(jù)傳入的description字段進(jìn)行判斷,然后在寫要依賴的接口取值)催植,但是這塊最好也能進(jìn)行配置項(xiàng)
3肮蛹、如果要過濾某些字段的判斷,或忽略list的排序問題
4创南、簡單的平臺化:后續(xù)想用Django實(shí)現(xiàn)伦忠,要做的是上傳配置文件,返回html報(bào)告地址稿辙,用戶點(diǎn)擊地址可查看報(bào)告詳情
5昆码、還有就是想用python腳本實(shí)現(xiàn)代理獲能取所有請求,自動獲取接口邻储、請求頭赋咽,請求參數(shù),自動分別請求不同域名進(jìn)行diff吨娜,哎脓匿,懂得太少。宦赠。陪毡。
6、僅僅是diff了勾扭,但是原本有的功能可能會被忽略毡琉,例如先存數(shù)據(jù),再取數(shù)據(jù)妙色,設(shè)計(jì)流程化請求diff