python3实现接口自动化(flask+mysql):小麻雀自动化测试平台(5)---用例执行结果(查看和消息通知)

关键词:接口自动化 python3 flask mysql pycharts

源码地址:https://gitee.com/amanSparrow/sparrow.git

相关阅读:

python3实现接口自动化(flask+mysql):小麻雀自动化测试平台(1)---入门介绍
python3实现接口自动化(flask+mysql):小麻雀自动化测试平台(2)---用例分组管理
python3实现接口自动化(flask+mysql):小麻雀自动化测试平台(3)---用例管理
python3实现接口自动化(flask+mysql):小麻雀自动化测试平台(4)---用例计划管理

用例执行结果

本文章主要介绍用例计划执行后对执行结果的讲解,主要包括两个方面:
1、执行结果查看以及直观的饼图展示(基于pycharts)
2、每次执行完后的结果通知提醒(接口监控报警)

一、用例执行结果查看
用例执行结果查看是用来查看用例计划执行后的用例的执行结果的,下面第一张图是用例执行结果查看主界面。
可以看到整个界面很简单,需要说明的是:
1、用例名称是超链接,点击可以跳转到用例管理界面并默认查询出该用例(可以对用例调试编辑等操作)
2、查询功能筛选出来的结果中有时候点击“详情”按钮无法查看详情(后续优化该问题)
3、点击“详情”按钮可以查看完整的执行数据,见下面第二张图
4、执行结果只查询3小时内所有用例计划最新一个轮次的执行结果(全部查询的话,在数据量很大时会出现效率问题)
5、有时候执行结果查询查出来的结果和实际结果数量不一致(上面4导致的,后续优化)


用例执行结果查看主界面

用例执行结果详情

二、用例执行结果展示
用例执行结果展示是为了方便直观地查看到用例执行的结果,选用的是pycharts的饼图进行展示,见下图。
说明:
1、目前不支持点击饼图跳转
2、现在最多支持15个饼图展示(可扩展,文件位置:utils\charts\pieCharts.py)
3、饼图查询所有用例计划的最新执行数据(不限制最后一次执行的时间)


用例执行结果饼图展示

三、用例执行结果通知提醒(接口监控报警的核心功能)
一个监控系统如果消息通知提醒机制,那么这个监控系统的作用就大打折扣了,为了做到第一时间获取执行失败的接口信息,特意给小麻雀接口自动化测试平台加了监控报警的功能。根据我公司的工作实际需要,目前只添加了钉钉群报警,但是大家可以根据自己公司的实际需要,对代码进行改造以支持自己所需要的通知方式。
目前的钉钉提醒消息包括两种情况(下图是发送的消息结果截图)
1、用例计划执行完成一次后,如果有失败的用例则发送报警消息,全部成功则不发送,默认打开
2、用例计划执行完成一次后,如果有接口的响应时间超过设定的时间则发送预警提醒消息,默认关闭


通知消息截图
钉钉消息通知的相关代码涉及到三个地方,列举如下:

1、config.py(./config.py)

# 钉钉消息的相关配置
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='

参数介绍
isDingtalk  接口执行完是否发送钉钉消息,1或True表示发送,0或False表示不发送
DINGTALK_URL_SPARROW  钉钉发送消息的服务接口地址
ACCESS_TOKEN_SPARROW  发送钉钉报警消息的token,设置钉钉群机器人后可以获取到该token
IS_SEND_WARN_MSG  接口的响应时间超过设置的时间后是否发送提醒,1或True表示发送,0或False表示不发送
ACCESS_TOKEN_SPARROW_WARN  发送钉钉提醒消息的token,获取方式同ACCESS_TOKEN_SPARROW
MIN_LIMIT_WARNTIME_YELLOW 设置超过多长时间发送预警提醒并将时间值的颜色设置为黄色
MIN_LIMIT_WARNTIME_RED  设置超过多长时间发送预警提醒并将时间值的颜色设置为红色
MESSAGE_URL_SPARROW  设置钉钉消息中点击用例名称后跳转的url(快速去小麻雀中调试用例)

2、dingtalk.py(./utils/dingtalk.py)

# 发送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

# 发送sparrow程序钉钉预警消息,如响应时间耗时超过n秒
def sendDingTalkWarnMsg_sparrow(toUrl, summaryMsg, msgText, atWho=[]):
    headers = {'Content-Type': 'application/json'}
    msg = {
        "msgtype": "markdown",
        "markdown": {
            "title": "接口预警",
            "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. 这里我把用例失败时的报警消息和用例执行时间超过设定时间后的报警消息各自封装成了独立的函数,实际这两个函数之间只有消息体不一样,可以抽象为一个函数,有兴趣的同学可以试着做一下
  2. 消息体用的是markdown格式
  3. 由于我公司有开发同学对钉钉的接口做了封装,所以我是根据封装后的参数要求做的函数封装,但是和钉钉的原接口对参数的格式要求是一样的,如果有同学在调试的过程中无法发送钉钉消息,可以根据错误信息进行调试,找到符合自己需要的消息体格式即可,钉钉开发者文档上有详细的文档说明

3、wayToRunCase.py(./utils/wayToRunCase.py)

# 组装钉钉报警消息
if config.isDingtalk and errorCasesMsgList:
    collectLogs(loginfo='有失败用例,需要发送消息提醒,开始发送钉钉报警消息...', 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> #### 预期结果:" + caseItem[2] + " \n> #### 匹配结果:" + caseItem[3] + ",httpCode:" + httpCodeColor + " \n> #### [" + caseItem[5] + "](" + caseItem[5] + ") \n> #### 响应信息:" + caseItem[6] + " \n\n> "
    sendRes = sendDingTalkMsg_sparrow(DINGTALK_URL, summary, errorCaseMsg)
    if sendRes["code"] == 1:
        collectLogs(loginfo='钉钉报警消息发送成功!', logger='waysToRun')
    else:
        collectLogs(loginfo='钉钉报警消息发送失败,发送响应:%s' % (sendRes,), lever='warning', logger='waysToRun')

# 组装钉钉报警消息,响应时间超过阀值预警
if config.IS_SEND_WARN_MSG and overWarnTimeLimitList:
    summaryMsg = "任务【" + plan_name + "】中有 " + str(len(overWarnTimeLimitList)) + " 个用例响应时间超过 " + str(config.MIN_LIMIT_WARNTIME_YELLOW) + " 秒,请及时确认服务是否正常,详细信息如下:"
    warnCaseMsg = ''
    for warnItem in overWarnTimeLimitList:
        toWarnCaseUrl = config.MESSAGE_URL_SPARROW + str(warnItem[1])
        warnCaseMsg = warnCaseMsg + "【第" + str(overWarnTimeLimitList.index(warnItem) + 1) + "个】[" + warnItem[0] + "](" + toWarnCaseUrl + ") \n> #### 响应时间:" + warnItem[2] + " 秒 \n> #### URL:" + warnItem[3] + " \n\n> "
    sendWarnMsgRes = sendDingTalkWarnMsg_sparrow(DINGTALK_URL_WARN, summaryMsg, warnCaseMsg)
    if sendWarnMsgRes["code"] == 1:
        collectLogs(loginfo='钉钉预警消息发送成功!', logger='waysToRun')
    else:
        collectLogs(loginfo='钉钉预警消息发送失败,发送响应:%s' % (sendWarnMsgRes,), lever='warning', logger='waysToRun')

该代码比较简单,没有复杂的逻辑,不做过多讲解,下面简单介绍几个地方:

  1. 代码中的 errorCasesMsgList 是某计划执行完成后失败用例的列表,如果该列表为空表示全部执行成功则不发送消息,否则就发送报警消息(配合前面的开关isDingtalk 使用)
  2. 代码中的 overWarnTimeLimitList 是某计划执行完成后超过设定时间的用例列表,如果该列表为空表示没有超过设定时间的用例即不需要发送消息,否则就发送预警消息(配合前面的开关IS_SEND_WARN_MSG 使用)
  3. sendDingTalkMsg_sparrow()和sendDingTalkWarnMsg_sparrow()这两个函数就是在上面dingtalk.py中定义的,使用的时候引入即可
  4. if sendWarnMsgRes["code"] == 1 这个语句是因为我用了公司封装的接口发送的,执行结果中code=1表示发送成功,大家使用的时候可以根据自己的实际情况,使用对应的code码做判断。

如有疑问,请给我留言,会尽快予以回复解决

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335