"""
流程:爬蟲爬取wiki中的接口文檔--->針對爬取數(shù)據(jù)進行接口測試--->生成測試報告
"""
author = ' Blokks '
import requests
from bs4 import BeautifulSoup
import json
import time
class InterfaceTesting(object):
def init(self):
pass
def get_APIdata_from_wiki(self):
"""
獲取confluence上的API文檔數(shù)據(jù):獲得結(jié)果為一個列表其中每個子列表結(jié)構(gòu)為[api_id,api_name,api_method,api_url,api_data,api_response]
"""
url = "http://112.74.196.215:8090/dologin.action"#文檔管理工具的登錄地址
login_data = {
'os_username': 'tangzhiliang',
'os_password': 'welcome123',
'login': '登錄'
}#登錄賬號密碼
res = requests.post(url=url, data=login_data)#發(fā)起請求進行登錄
cookies_ = res.cookies#獲取登錄后的cookies
session = requests.Session()#構(gòu)建session用于保存cookie等信息
session.cookies = cookies_
session.cookies.set('confluence-sidebar.width', '285')#將上一步獲得的cookie添加進session
url_to_API = "http://112.74.196.215:8090/display/Tech2/API+Test+Case"#API文檔的保存頁面
res_ = session.get(url_to_API)#發(fā)起請求
page_return = res_.text
soup = BeautifulSoup(page_return)#使用beautifulsoup對獲取的頁面html結(jié)構(gòu)進行處理
td_tags = soup.find_all('td', class_='confluenceTd')#使用beautifulsoup庫獲取所有的td標(biāo)簽
API_data = []
for i in range(0, len(td_tags), 4):
each_row = []
for j in range(0, 4):
try:
each_row.append(td_tags[i + j].text)#每4個td標(biāo)簽進行循環(huán)獲取td標(biāo)簽內(nèi)容并添加進列表
except:
pass
API_data.append(each_row)
for i in API_data:
print(i)
return API_data#所有列表存進最終保存數(shù)據(jù)列表中
def run_API_test(self):
all_data = self.get_APIdata_from_wiki()
all_result = []
for i in all_data:#遍歷所有獲取的接口文檔數(shù)據(jù)耿币,一次進行接口測試
r = self.single_API_test(i[2],i[3],i[4],i[5])
if r == 0:
all_result.append([i[1],'pass'])
else:
all_result.append([i[1],'fail'])
return all_result#返回所有接口測試的結(jié)果
def single_API_test(self,url,request_type,request_data,expected_output):#當(dāng)個API的測試
header_ = {'Apikey': 'T2-PROD-DC67B679-A032-4AC3-BD5A-D5EC571AAF86',
'Cookie': 'guest_id=1501952081; stat_passport=491501%0915818650780%09u3251183456449',
'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/63.0.3239.132 Safari/537.36'"}
if request_type == 'GET':#判斷請求類型使用不同的請求方式
output = requests.get(url,params=request_data,headers=header_)
elif request_type == 'POST':
output = requests.post(url,patams=request_data,headers=header_)
else:
raise Exception('request type error,must be GET or POST')
flag = 0
for k, w in json.loads(output).items():#將接口返回數(shù)據(jù)與接口文檔中國的數(shù)據(jù)進行比較
if output[k] == expected_output[k]:
pass
else:
flag += 1
return flag#通過返回為0,為其他數(shù)值時不通過
def format_test_report(self):
test_result = self.run_API_test()
pass_case = 0
fail_case = 0
all_case = len(test_result)
for i in test_result:
if i[1] == 'pass':
pass_case += 1
else:
fail_case += 1
"""
這里構(gòu)造接口測試報告拗窃,還在設(shè)計頁面
"""
if name == 'main':
start_time = int(time.time())
while True:
mid_time = int(time.time())
if (mid_time - start_time)%120 == 0:#每兩分鐘跑一次腳本
api_test =InterfaceTesting()
api_test.format_test_report()
else:
pass