關(guān)鍵詞:接口自動化 python3 flask mysql pycharts
源碼地址:https://gitee.com/amanSparrow/sparrow.git
相關(guān)閱讀:
python3實現(xiàn)接口自動化(flask+mysql):小麻雀自動化測試平臺(1)---入門介紹
python3實現(xiàn)接口自動化(flask+mysql):小麻雀自動化測試平臺(2)---用例分組管理
python3實現(xiàn)接口自動化(flask+mysql):小麻雀自動化測試平臺(3)---用例管理
python3實現(xiàn)接口自動化(flask+mysql):小麻雀自動化測試平臺(4)---用例計劃管理
用例執(zhí)行結(jié)果
本文章主要介紹用例計劃執(zhí)行后對執(zhí)行結(jié)果的講解,主要包括兩個方面:
1浦夷、執(zhí)行結(jié)果查看以及直觀的餅圖展示(基于pycharts)
2桑逝、每次執(zhí)行完后的結(jié)果通知提醒(接口監(jiān)控報警)
一、用例執(zhí)行結(jié)果查看
用例執(zhí)行結(jié)果查看是用來查看用例計劃執(zhí)行后的用例的執(zhí)行結(jié)果的,下面第一張圖是用例執(zhí)行結(jié)果查看主界面呛谜。
可以看到整個界面很簡單寝受,需要說明的是:
1、用例名稱是超鏈接乌助,點擊可以跳轉(zhuǎn)到用例管理界面并默認(rèn)查詢出該用例(可以對用例調(diào)試編輯等操作)
2溜在、查詢功能篩選出來的結(jié)果中有時候點擊“詳情”按鈕無法查看詳情(后續(xù)優(yōu)化該問題)
3、點擊“詳情”按鈕可以查看完整的執(zhí)行數(shù)據(jù)他托,見下面第二張圖
4掖肋、執(zhí)行結(jié)果只查詢3小時內(nèi)所有用例計劃最新一個輪次的執(zhí)行結(jié)果(全部查詢的話,在數(shù)據(jù)量很大時會出現(xiàn)效率問題)
5赏参、有時候執(zhí)行結(jié)果查詢查出來的結(jié)果和實際結(jié)果數(shù)量不一致(上面4導(dǎo)致的志笼,后續(xù)優(yōu)化)
二、用例執(zhí)行結(jié)果展示
用例執(zhí)行結(jié)果展示是為了方便直觀地查看到用例執(zhí)行的結(jié)果把篓,選用的是pycharts的餅圖進行展示纫溃,見下圖。
說明:
1韧掩、目前不支持點擊餅圖跳轉(zhuǎn)
2紊浩、現(xiàn)在最多支持15個餅圖展示(可擴展,文件位置:utils\charts\pieCharts.py)
3疗锐、餅圖查詢所有用例計劃的最新執(zhí)行數(shù)據(jù)(不限制最后一次執(zhí)行的時間)
三坊谁、用例執(zhí)行結(jié)果通知提醒(接口監(jiān)控報警的核心功能)
一個監(jiān)控系統(tǒng)如果消息通知提醒機制,那么這個監(jiān)控系統(tǒng)的作用就大打折扣了滑臊,為了做到第一時間獲取執(zhí)行失敗的接口信息口芍,特意給小麻雀接口自動化測試平臺加了監(jiān)控報警的功能。根據(jù)我公司的工作實際需要雇卷,目前只添加了釘釘群報警鬓椭,但是大家可以根據(jù)自己公司的實際需要颠猴,對代碼進行改造以支持自己所需要的通知方式。
目前的釘釘提醒消息包括兩種情況(下圖是發(fā)送的消息結(jié)果截圖)
1小染、用例計劃執(zhí)行完成一次后翘瓮,如果有失敗的用例則發(fā)送報警消息,全部成功則不發(fā)送氧映,默認(rèn)打開
2春畔、用例計劃執(zhí)行完成一次后,如果有接口的響應(yīng)時間超過設(shè)定的時間則發(fā)送預(yù)警提醒消息岛都,默認(rèn)關(guān)閉
釘釘消息通知的相關(guān)代碼涉及到三個地方律姨,列舉如下:
1、config.py(./config.py)
# 釘釘消息的相關(guān)配置
isDingtalk = 1
DINGTALK_URL_SPARROW = 'http://127.0.0.1:8001/dingtalk-admin-web/chatbot/sendMessage?token='
ACCESS_TOKEN_SPARROW = '2394axxxxxxxxxxxxxxxxxxxxdf3e7334yyyyyyyyyfc1093'
IS_SEND_WARN_MSG = False
ACCESS_TOKEN_SPARROW_WARN = 'bb9xxxxxxxxxxxxxx571200ec1bad686c5yyyyyyye15b2d7'
MIN_LIMIT_WARNTIME_YELLOW = 5
MIN_LIMIT_WARNTIME_RED = 10
MESSAGE_URL_SPARROW = 'http://127.0.0.1:8000/case_manage/?caseid='
參數(shù)介紹
isDingtalk 接口執(zhí)行完是否發(fā)送釘釘消息臼疫,1或True表示發(fā)送择份,0或False表示不發(fā)送
DINGTALK_URL_SPARROW 釘釘發(fā)送消息的服務(wù)接口地址
ACCESS_TOKEN_SPARROW 發(fā)送釘釘報警消息的token,設(shè)置釘釘群機器人后可以獲取到該token
IS_SEND_WARN_MSG 接口的響應(yīng)時間超過設(shè)置的時間后是否發(fā)送提醒烫堤,1或True表示發(fā)送荣赶,0或False表示不發(fā)送
ACCESS_TOKEN_SPARROW_WARN 發(fā)送釘釘提醒消息的token,獲取方式同ACCESS_TOKEN_SPARROW
MIN_LIMIT_WARNTIME_YELLOW 設(shè)置超過多長時間發(fā)送預(yù)警提醒并將時間值的顏色設(shè)置為黃色
MIN_LIMIT_WARNTIME_RED 設(shè)置超過多長時間發(fā)送預(yù)警提醒并將時間值的顏色設(shè)置為紅色
MESSAGE_URL_SPARROW 設(shè)置釘釘消息中點擊用例名稱后跳轉(zhuǎn)的url(快速去小麻雀中調(diào)試用例)
2鸽斟、dingtalk.py(./utils/dingtalk.py)
# 發(fā)送sparrow程序釘釘報警消息
def sendDingTalkMsg_sparrow(toUrl, summary, msgText, atWho=[]):
summary = str(summary)
headers = {'Content-Type': 'application/json'}
msg = {
"msgtype": "markdown",
"markdown": {
"title": "小麻雀接口報警",
"text": "#### "+ summary + "拔创,失敗用例信息如下: \n> "
" " + msgText + " \n"
},
"at": {
"atMobiles": atWho,
"isAtAll": False
}
}
msg = json.JSONEncoder().encode(msg)
try:
res = requests.post(toUrl, data=msg, headers=headers)
result = json.loads(res.text)
except Exception as e:
result = {"code":-9,"message":str(e), "data":{}}
return result
# 發(fā)送sparrow程序釘釘預(yù)警消息,如響應(yīng)時間耗時超過n秒
def sendDingTalkWarnMsg_sparrow(toUrl, summaryMsg, msgText, atWho=[]):
headers = {'Content-Type': 'application/json'}
msg = {
"msgtype": "markdown",
"markdown": {
"title": "接口預(yù)警",
"text": "#### "+ summaryMsg + " \n> "
" " + msgText + " \n"
},
"at": {
"atMobiles": atWho,
"isAtAll": False
}
}
msg = json.JSONEncoder().encode(msg)
try:
res = requests.post(toUrl, data=msg, headers=headers)
result = json.loads(res.text)
except Exception as e:
result = {"code":-9,"message":str(e), "data":{}}
return result
代碼不做過多講解富蓄,下面做幾點介紹:
- 這里我把用例失敗時的報警消息和用例執(zhí)行時間超過設(shè)定時間后的報警消息各自封裝成了獨立的函數(shù)剩燥,實際這兩個函數(shù)之間只有消息體不一樣,可以抽象為一個函數(shù)立倍,有興趣的同學(xué)可以試著做一下
- 消息體用的是markdown格式
- 由于我公司有開發(fā)同學(xué)對釘釘?shù)慕涌谧隽朔庋b灭红,所以我是根據(jù)封裝后的參數(shù)要求做的函數(shù)封裝,但是和釘釘?shù)脑涌趯?shù)的格式要求是一樣的口注,如果有同學(xué)在調(diào)試的過程中無法發(fā)送釘釘消息变擒,可以根據(jù)錯誤信息進行調(diào)試,找到符合自己需要的消息體格式即可寝志,釘釘開發(fā)者文檔上有詳細(xì)的文檔說明
3娇斑、wayToRunCase.py(./utils/wayToRunCase.py)
# 組裝釘釘報警消息
if config.isDingtalk and errorCasesMsgList:
collectLogs(loginfo='有失敗用例,需要發(fā)送消息提醒材部,開始發(fā)送釘釘報警消息...', logger='waysToRun')
errorCaseMsg = ''
for caseItem in errorCasesMsgList:
toCaseUrl = config.MESSAGE_URL_SPARROW + str(caseItem[1])
if caseItem[4] == 200:
httpCodeColor = '<font color=#32CD32>200</font>'
else:
httpCodeColor = '<font color=#FF0000>' + str(caseItem[4]) + '</font>'
errorCaseMsg = errorCaseMsg + "【第" + str(errorCasesMsgList.index(caseItem) + 1) + "個】[" + caseItem[0] + "](" + toCaseUrl + ") \n> #### 預(yù)期結(jié)果:" + caseItem[2] + " \n> #### 匹配結(jié)果:" + caseItem[3] + "悠菜,httpCode:" + httpCodeColor + " \n> #### [" + caseItem[5] + "](" + caseItem[5] + ") \n> #### 響應(yīng)信息:" + caseItem[6] + " \n\n> "
sendRes = sendDingTalkMsg_sparrow(DINGTALK_URL, summary, errorCaseMsg)
if sendRes["code"] == 1:
collectLogs(loginfo='釘釘報警消息發(fā)送成功!', logger='waysToRun')
else:
collectLogs(loginfo='釘釘報警消息發(fā)送失敗败富,發(fā)送響應(yīng):%s' % (sendRes,), lever='warning', logger='waysToRun')
# 組裝釘釘報警消息,響應(yīng)時間超過閥值預(yù)警
if config.IS_SEND_WARN_MSG and overWarnTimeLimitList:
summaryMsg = "任務(wù)【" + plan_name + "】中有 " + str(len(overWarnTimeLimitList)) + " 個用例響應(yīng)時間超過 " + str(config.MIN_LIMIT_WARNTIME_YELLOW) + " 秒摩窃,請及時確認(rèn)服務(wù)是否正常兽叮,詳細(xì)信息如下:"
warnCaseMsg = ''
for warnItem in overWarnTimeLimitList:
toWarnCaseUrl = config.MESSAGE_URL_SPARROW + str(warnItem[1])
warnCaseMsg = warnCaseMsg + "【第" + str(overWarnTimeLimitList.index(warnItem) + 1) + "個】[" + warnItem[0] + "](" + toWarnCaseUrl + ") \n> #### 響應(yīng)時間:" + warnItem[2] + " 秒 \n> #### URL:" + warnItem[3] + " \n\n> "
sendWarnMsgRes = sendDingTalkWarnMsg_sparrow(DINGTALK_URL_WARN, summaryMsg, warnCaseMsg)
if sendWarnMsgRes["code"] == 1:
collectLogs(loginfo='釘釘預(yù)警消息發(fā)送成功芬骄!', logger='waysToRun')
else:
collectLogs(loginfo='釘釘預(yù)警消息發(fā)送失敗,發(fā)送響應(yīng):%s' % (sendWarnMsgRes,), lever='warning', logger='waysToRun')
該代碼比較簡單鹦聪,沒有復(fù)雜的邏輯账阻,不做過多講解,下面簡單介紹幾個地方:
- 代碼中的 errorCasesMsgList 是某計劃執(zhí)行完成后失敗用例的列表泽本,如果該列表為空表示全部執(zhí)行成功則不發(fā)送消息淘太,否則就發(fā)送報警消息(配合前面的開關(guān)isDingtalk 使用)
- 代碼中的 overWarnTimeLimitList 是某計劃執(zhí)行完成后超過設(shè)定時間的用例列表,如果該列表為空表示沒有超過設(shè)定時間的用例即不需要發(fā)送消息规丽,否則就發(fā)送預(yù)警消息(配合前面的開關(guān)IS_SEND_WARN_MSG 使用)
- sendDingTalkMsg_sparrow()和sendDingTalkWarnMsg_sparrow()這兩個函數(shù)就是在上面dingtalk.py中定義的蒲牧,使用的時候引入即可
- if sendWarnMsgRes["code"] == 1 這個語句是因為我用了公司封裝的接口發(fā)送的,執(zhí)行結(jié)果中code=1表示發(fā)送成功赌莺,大家使用的時候可以根據(jù)自己的實際情況冰抢,使用對應(yīng)的code碼做判斷。
如有疑問艘狭,請給我留言挎扰,會盡快予以回復(fù)解決