发送内容如下
包含Allure报告链接、控制台链接、运行结果、异常或者失败脚本
之前在jenkinsfile中已经有了一个参数
string(name: 'robot', defaultValue: '', description: '企业微信群机器人地址,以逗号分隔')
所以在代码中很容易就可以获取到这个字符串了
ROBOT = get_env("robot") # 企业微信群机器人
拼接Allure报告地址
拼接要发送的企业微信地址
class ReportOperator:
def __init__(self, hook: list):
self.headers = {"Content-Type": "text/plain"}
self.hook_url_list = [f"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key={i}" for i in hook]
self.allure_url = f"http://jenkins.com/job/{ProjectName}/{BUILD_NUMBER}/allure/"
self.test_system = {
"Darwin": "MAC",
"Linux": "Linux",
"Windows": "Windows",
}
def send_msg(self, other=''):
data = f"""**【{ProjectName}】**
> 项目名称:{ProjectName}
> 构件编号:#{BUILD_NUMBER}
> 完成时间:{timeoperator.now1}
> 测试环境:{self.test_system.get(platform.system(), platform.system())}
> [报告链接]({self.allure_url})
> [控制台链接]({BUILD_URL})
{other}"""
send_data = {
"msgtype": "markdown", # 消息类型:markdown
"markdown": {
"content": data
}
}
for hook_url in self.hook_url_list:
requests.post(url=hook_url, headers=self.headers, json=send_data)
send_msg
基本已经完成了发送消息的主体,后面的失败和异常用例通过other
参数传入
见:https://gitee.com/zx660644/uitest/blob/master/src/utils/reportoperator.py
在测试完成之后才需要发送报告,这时候可以使用pytest
的pytest_terminal_summary
钩子函数来拿到测试的结果
def pytest_terminal_summary(terminalreporter, exitstatus, config):
"""
统计测试结果
:param terminalreporter:
:param exitstatus:
:param config:
:return:
"""
logger.info(f"总计:{terminalreporter._numcollected}")
stats = terminalreporter.stats
failed_num = len(stats.get('failed', []))
error_num = len(stats.get('error', []))
logger.info(f"通过:{len(stats.get('passed', []))}")
logger.info(f"失败:{failed_num}")
logger.info(f"异常:{error_num}")
logger.info(f"跳过:{len(stats.get('skipped', []))}")
duration = time.time() - terminalreporter._sessionstarttime
logger.info(f"总耗时:{duration}秒")
通过terminalreporter.stats
可以拿到本轮测试的测试结果
10.UI自动化测试框架搭建-获取Jenkins参数已经拿到过Allure中的测试内容了,这次就使用一下
jsonoperator = JsonOperator()
allure_results = jsonoperator.get_allure_result()
config
中不包含workerinput
表示测试结束了
当测试结果失败、异常用例大于0的时候才发送通知,减少无效的通知
使用change_run_detail
方法拿到allure_results
中的具体用例(名称+参数)
拼接测试结果传入到send_msg
函数的other
参数
if not hasattr(config, "workerinput"):
jsonoperator = JsonOperator()
allure_results = jsonoperator.get_allure_result()
if failed_num + error_num > 0:
if ROBOT:
try:
r = ReportOperator(hook=ROBOT.split(','))
result_str = '\n'.join([
f"通过:{len(stats.get('passed', []))}",
f"失败:{len(stats.get('failed', []))}",
f"异常:{len(stats.get('error', []))}",
f"跳过:{len(stats.get('skipped', []))}",
f"耗时:{duration:.2f}秒",
])
try:
passed_list, failed_list, error_list, skipped_list = r.change_run_detail(allure_results)
if len(failed_list):
result_str += '\n\n失败用例:\n'
result_str += '\n'.join(failed_list)
if len(error_list):
result_str += '\n\n异常用例:\n'
result_str += '\n'.join(error_list)
except Exception as e:
logger.error(e)
r.send_msg(result_str)
except Exception as e:
logger.error(e)
见:https://gitee.com/zx660644/uitest/blob/master/src/cases/conftest.py