目的

由于执行完测试的报告存放在内网,当我们人不在公司的时候就比较难评估错误是否为误报

所以需要将测试步骤、异常信息、错误截图发送到专门的群里。

公司使用的是企业微信,所以发送到企业微信中

下面主要讲一下测试步骤和异常信息的提取

测试步骤提取

在13.UI自动化测试框架搭建-处理Allure报告数据 中我们拿到了一些信息,其实result.json中还包含了测试步骤,所以再对它进行一次提取

def get_steps(self, data, steps_data, num=None):
    if data:
        if not num:
            for index, i in enumerate(data):
                self.get_steps(i, steps_data, index + 1)
        else:
            if all([s not in data["name"] for s in skip_steps]):
                steps_data.append(f'{num}-{data["name"]}')
            if data.get("steps"):
                n = 0
                for j in data.get("steps"):
                    if all([s not in j.get("name") for s in skip_steps]):
                        n += 1
                        self.get_steps(j, steps_data, f"{num}.{n}")

由于步骤有一个嵌套的概念,所以传入一个num表示它的执行顺序

比如1、1.1、1.1.1、2

一些实际测试无意义的步骤,我们可以使用skip_steps来忽略,比如我项目中的一些弹框处理步骤

skip_steps = [
    "点击「同意」",
    "点击「允许」",
    "点击「确定」",
    "点击「稍后再说」",
    "点击「以后再说」",
    "点击「我知道了」",
    "点击「仅在使用中允许」",
    "点击「我知道啦」",
    "点击「始终允许」",
    "点击「仍然视频问诊」",
    "点击「知道了」",
    "点击「关闭」",
]

使用:

steps = []
self.get_steps(json_data.get("steps"), steps)
data = {
    ...
    "steps": ";".join(steps)
}

这样steps中就存放了全部的步骤了

大概展示如下:

1-点击问诊;1.1-点击「我_我的订单-问诊」;2-查看Tab;2.1-查看「我_我的订单-问诊-线上门诊Tab」是否存在;2.2-查看「我_我的订单-问诊-追问包Tab」是否存在;2.3-查看「我_我的订单-问诊-远程诊疗Tab」是否存在;3-点击「线上门诊」查看是否存在「查看全部问诊订单」;3.1-点击「我_我的订单-问诊-线上门诊Tab」;3.2-查看「我_我的订单-问诊-查看全部问诊订单」是否存在;4-获取首条线上门诊订单信息并核对;4.1-转换参数化元素;4.2-获取「我_我的订单-问诊-线上门诊第n条内容」的文字;5-点击「追问包」查看是否不存在「查看全部问诊订单」;5.1-点击「我_我的订单-问诊-追问包Tab」;5.2-查看「我_我的订单-问诊-查看全部问诊订单」是否存在;6-点击「远程诊疗」查看是否不存在「查看全部问诊订单」;6.1-点击「我_我的订单-问诊-远程诊疗Tab」;6.2-查看「我_我的订单-问诊-查看全部问诊订单」是否存在

异常信息

先拿到异常信息

statusDetails = json_data.get('statusDetails', {})

然后对错误进行精简

statusDetails1 = {
    "message": "",
    "trace": ""
}
if statusDetails:
    try:
        message = statusDetails.get("message") and \
                  statusDetails.get("message").split("\n")[0] \
                      .replace("selenium.common.exceptions.NoSuchElementException: Message:", "【异常】") \
                      .replace("AssertionError:", "【断言】")
        if message and "pytest_assume.plugin.FailedAssumption:" in message:
            message = "【多重断言】" + ";".join(
                [i for i in statusDetails.get("message").split("\n") if
                 i.startswith("AssertionError:")]).replace("AssertionError:", "")
        statusDetails1["message"] = message or ""
        statusDetails1["trace"] = statusDetails.get("trace", "")
    except Exception:
        pass

可以根据后续实际的报错来增加replace

data = {
    ...
    "statusDetails": statusDetails1,
    ...
}

效果

【断言】 不存在「购药记录」入口
【断言】 预计极速图文剩余次数为【1次】,实际剩余次数为【0次】

修改发送企业微信部分

def change_run_detail(self, run_detail):
    passed_list = []
    failed_list = []
    error_list = []
    skipped_list = []
    for i in run_detail:
        parameter = ""
        steps = i.get('steps')
        if steps:
            steps = f"【步骤】:{steps}"
        if i.get('parameters', ''):
            parameter = f"({i.get('parameters', '')})"
        if i.get('status') == 'passed':
            passed_list.append(f"{i.get('labels')}:{i.get('fullName')} {parameter}")
        elif i.get('status') == 'failed':
            failed_list.append(
                f"{i.get('labels')}:{i.get('fullName')}{parameter}<font color=#009900 >{steps}</font><font color=#ff0000 >{i['statusDetails']['message']}</font>")
        elif i.get('status') in ['error', 'broken']:
            error_list.append(
                f"{i.get('labels')}:{i.get('fullName')}{parameter}<font color=#009900 >{steps}</font><font color=#ff0000 >{i['statusDetails']['message']}</font>")
        elif i.get('status') == 'skipped':
            skipped_list.append(f"{i.get('labels')}:{i.get('fullName')} {parameter}")
    return passed_list, failed_list, error_list, skipped_list

错误截图

由于错误截图使用的公司内部的图片存储服务器,暂时不放了,思路类似


wxjava 企业微信 springboot_人工智能