python3實現(xiàn)接口自動化(flask+mysql):小麻雀自動化測試平臺(5)---用例執(zhí)行結(jié)果(查看和消息通知)

關(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é)果展示
用例執(zhí)行結(jié)果展示是為了方便直觀地查看到用例執(zhí)行的結(jié)果把篓,選用的是pycharts的餅圖進行展示纫溃,見下圖。
說明:
1韧掩、目前不支持點擊餅圖跳轉(zhuǎn)
2紊浩、現(xiàn)在最多支持15個餅圖展示(可擴展,文件位置:utils\charts\pieCharts.py)
3疗锐、餅圖查詢所有用例計劃的最新執(zhí)行數(shù)據(jù)(不限制最后一次執(zhí)行的時間)


用例執(zhí)行結(jié)果餅圖展示

三坊谁、用例執(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

代碼不做過多講解富蓄,下面做幾點介紹:

  1. 這里我把用例失敗時的報警消息和用例執(zhí)行時間超過設(shè)定時間后的報警消息各自封裝成了獨立的函數(shù)剩燥,實際這兩個函數(shù)之間只有消息體不一樣,可以抽象為一個函數(shù)立倍,有興趣的同學(xué)可以試著做一下
  2. 消息體用的是markdown格式
  3. 由于我公司有開發(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ù)雜的邏輯账阻,不做過多講解,下面簡單介紹幾個地方:

  1. 代碼中的 errorCasesMsgList 是某計劃執(zhí)行完成后失敗用例的列表泽本,如果該列表為空表示全部執(zhí)行成功則不發(fā)送消息淘太,否則就發(fā)送報警消息(配合前面的開關(guān)isDingtalk 使用)
  2. 代碼中的 overWarnTimeLimitList 是某計劃執(zhí)行完成后超過設(shè)定時間的用例列表,如果該列表為空表示沒有超過設(shè)定時間的用例即不需要發(fā)送消息规丽,否則就發(fā)送預(yù)警消息(配合前面的開關(guān)IS_SEND_WARN_MSG 使用)
  3. sendDingTalkMsg_sparrow()和sendDingTalkWarnMsg_sparrow()這兩個函數(shù)就是在上面dingtalk.py中定義的蒲牧,使用的時候引入即可
  4. if sendWarnMsgRes["code"] == 1 這個語句是因為我用了公司封裝的接口發(fā)送的,執(zhí)行結(jié)果中code=1表示發(fā)送成功赌莺,大家使用的時候可以根據(jù)自己的實際情況冰抢,使用對應(yīng)的code碼做判斷。

如有疑問艘狭,請給我留言挎扰,會盡快予以回復(fù)解決

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市巢音,隨后出現(xiàn)的幾起案子遵倦,更是在濱河造成了極大的恐慌,老刑警劉巖官撼,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梧躺,死亡現(xiàn)場離奇詭異,居然都是意外死亡歧寺,警方通過查閱死者的電腦和手機燥狰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斜筐,“玉大人龙致,你說我怎么就攤上這事∏炅矗” “怎么了目代?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嗤练。 經(jīng)常有香客問我榛了,道長,這世上最難降的妖魔是什么煞抬? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任霜大,我火速辦了婚禮,結(jié)果婚禮上革答,老公的妹妹穿的比我還像新娘战坤。我一直安慰自己曙强,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布途茫。 她就那樣靜靜地躺著碟嘴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪囊卜。 梳的紋絲不亂的頭發(fā)上娜扇,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音栅组,去河邊找鬼雀瓢。 笑死,一個胖子當(dāng)著我的面吹牛笑窜,可吹牛的內(nèi)容都是我干的致燥。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼排截,長吁一口氣:“原來是場噩夢啊……” “哼嫌蚤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起断傲,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤脱吱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后认罩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體箱蝠,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年垦垂,在試婚紗的時候發(fā)現(xiàn)自己被綠了宦搬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡劫拗,死狀恐怖间校,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情页慷,我是刑警寧澤憔足,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站酒繁,受9級特大地震影響滓彰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜州袒,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一揭绑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧郎哭,春花似錦洗做、人聲如沸弓叛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至陈惰,卻和暖如春畦徘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抬闯。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工井辆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人溶握。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓杯缺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親睡榆。 傳聞我的和親對象是個殘疾皇子萍肆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345