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 = '200'
        else:
            httpCodeColor = '' + str(caseItem[4]) + ''
        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码做判断。

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

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