目的
由于执行完测试的报告存放在内网,当我们人不在公司的时候就比较难评估错误是否为误报
所以需要将测试步骤、异常信息、错误截图发送到专门的群里。
公司使用的是企业微信,所以发送到企业微信中
下面主要讲一下测试步骤和异常信息的提取
测试步骤提取
在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
复制代码
错误截图
由于错误截图使用的公司内部的图片存储服务器,暂时不放了,思路类似
最终效果
https://gitee.com/zx660644/uitest/commit/2fdb2ce0c971d21ac95935940ac8e85a64615e54
最后: 可以在公众号:伤心的辣条 ! 自行领取一份 216 页软件测试工程师面试宝典文档资料【免费的】。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux 必备、Shell、互联网程序原理、Mysql 数据库、抓包工具专题、接口测试工具、测试进阶-Python 编程、Web 自动化测试、APP 自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。
学习技术千万不要孤军奋战,最好是能抱团取暖,相互成就一起成长,群众效应的效果是非常强大的,大家一起学习,一起打卡,会更有学习动力,也更能坚持下去。你可以加入我们的测试技术交流扣扣群:746506216(里面有各种软件测试资源和技术讨论)
喜欢软件测试的小伙伴们,如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!
评论