
配置企业微信消息通知,统计测试数据
可以参考企业微信官网api进行接口发送:群机器人配置说明 - 文档 - 企业微信开发者中心
创建群机器人
记住这个 webhook 地址 用于接口发送消息通知
编写接口请求,用于发送消息
通过request
请求接口,发送消息, 创建工具类 SendMsgToWorkWeiXin
import requests
class SendMsgToWorkWeiXin:
def __init__(self):
self.session = requests.session()
"""
发送测试数据结果统计
"""
def send_test_results_msg(self, webhook, desc, cases_total, cases_success_total, cases_fail_total, cases_skipped_total, cases_time_total, cases_report_address):
"""
:param webhook: 群机器人 webhook 地址
:param desc: 发送企业微信消息描述
:param cases_total: 用例总数
:param cases_success_total: 成功用例数
:param cases_fail_total: 失败用例数
:param cases_skipped_total: 跳过用例数
:param cases_time_total: 仅会话运行时间
:param cases_report_address: 测试报告链接跳转地址
:return:
"""
body = {
"msgtype": "template_card",
"template_card": {
"card_type": "text_notice",
"main_title": {
"title": "自动化测试结果数据统计",
"desc": desc
},
"horizontal_content_list": [
{
"keyname": "运行总数",
"value": cases_total
},
{
"keyname": "运行成功",
"value": cases_success_total
},
{
"keyname": "运行失败",
"value": cases_fail_total
},
{
"keyname": "运行跳过",
"value": cases_skipped_total
},
{
"keyname": "运行会话耗时",
"value": str(cases_time_total) + " sec"
},
{
"keyname": "测试报告地址",
"value": "点击访问",
"type": 1,
"url": cases_report_address
}
],
"jump_list": [
{
"type": 1,
"url": cases_report_address,
"title": "测试报告地址"
}
],
"card_action": {
"type": 1,
"url": cases_report_address
}
}
}
response = self.session.post(url=webhook, json=body)
print("正在发送测试结果通知, 结果如下:")
print(response.json())
"""
通知人员
"""
def send_notifying_officer(self, webhook, notifying_officer):
"""
:param webhook: 群机器人 webhook 地址
:param notifying_officer: 通知人员 list列表 例如 ["150xxx", "@all"] 其中手机号为唯一标识 @all 为艾特全体人员
:return:
"""
body = {
"msgtype": "text",
"text": {
"mentioned_mobile_list": notifying_officer
}
}
response = self.session.post(url=webhook, json=body)
print("正在通知企业微信人员, 结果如下:")
print(response.json())
创建钩子函数
在根目录文件夹下面,创建一个 conftest.py
文件,书写钩子函数
conftest.py
:
import time
from sendmsg.SendMsgToWorkWeiXin import SendMsgToWorkWeiXin
from utils.LoadEnvUtil import LoadEnvUtil
# 企业微信机器人 webhook
webhook = "https://www.baidu.com"
# 通知描述
desc = "xxxx 平台 web ui/接口 自动化数据汇总"
# 通知企业微信人员 list 集合
# 艾特某一个人填入其手机号即可 @all表示艾特所有人 不需要可以去掉
notifier = ["150xxxxxx", "@all"]
# 文档中心测试报告跳转地址
address = "https://work.weixin.qq.com/?from=openApi"
def pytest_configure(config):
"""记录 Pytest 开始的时间"""
config.start_time = time.time() # 记录 Pytest 初始化时的时间
def pytest_terminal_summary(terminalreporter, exitstatus):
"""在 Pytest 会话结束时计算总耗时并统计结果"""
end_time = time.time()
# 用 config 共享的 start_time
total_time = round(end_time - terminalreporter.config.start_time, 2) # 保留两位小数的总耗时
# 控制台的输出时间包括pytest插件加载 插件运行 测试用例运行 钩子函数运行 等所有时间综合
# 在此统计的仅仅是 pytest 会话执行前后时间 不包括插件加载 失败重跑 钩子函数运行完毕的时间
print(f"\n仅测试会话运行耗时: {total_time:.2f} 秒")
print("\n==== pytest 会话结束 ====")
# 获取测试结果统计
stats = terminalreporter.stats
skipped_tests = len(stats.get("skipped", [])) # 跳过测试数量
failed_tests = len(stats.get("failed", [])) # 失败测试数量
passed_tests = len(stats.get("passed", [])) # 成功测试数量
total_tests = passed_tests + failed_tests + skipped_tests # 总测试数量
print("\n==== 测试统计 ====")
print(f"总测试用例数量: {total_tests}")
print(f"✅ 成功: {passed_tests}")
print(f"❌ 失败: {failed_tests}")
print(f"⏭️ 跳过: {skipped_tests}")
# 根据不同的退出状态输出不同的信息
if exitstatus == 0:
print("✅ 所有测试通过!")
elif exitstatus == 1:
print("❌ 有测试失败,请检查日志!")
elif exitstatus == 2:
print("⚠️ 测试用例未被正确收集,请检查路径或语法错误!")
elif exitstatus == 3:
print("⏹️ 测试被手动中断!")
else:
print("未知错误,请检查配置或环境问题。")
try:
open_notifier = LoadEnvUtil.get_env_params("OPEN_OFFICER_NOTIFICATION", "false").lower()
if open_notifier == "true":
# 通知企业微信结果
SendMsgToWorkWeiXin().send_test_results_msg(webhook, desc, total_tests, passed_tests, failed_tests,
skipped_tests, total_time, address)
# 企业微信通知具体人员
SendMsgToWorkWeiXin().send_notifying_officer(webhook, notifier)
except Exception as e:
print("❌ {}".format(e))
备注:这里使用了.env(在根目录下创建个.env)文件与读取env文件工具类,来判断是否开启上传报告与企业微信通知
.env文件
OPEN_OFFICER_NOTIFICATION=false
# 默认为false 配置与不配置均可 大小写均可 true为开启
读取env文件工具类
import os
from dotenv import load_dotenv, set_key
class LoadEnvUtil:
@classmethod
def get_env_params(cls, key, default=None):
"""
:param key: env variable {Key}
:param default: Loading the env variable, Get {Key-->Value}
:return:
"""
load_dotenv()
return os.environ.get(key, default)
@classmethod
def set_env_params(cls, params, value):
"""
:param params: env variable {Key}
:param value: env variable {Value}
:return: Check whether the env file exists, and create it if it does not
"""
env_file = '.env'
if not os.path.exists(env_file):
with open(env_file, 'w') as f:
pass # Create an empty.env file
load_dotenv()
set_key(env_file, params, value, quote_mode='never')
print(f"{params} has been written to the env file")
运行过程
如果配置 pytest.ini
文件,只需要在终端运行 pytest
命令即可运行配置文件中指定文件。
终端打印结果:
企业微信结果:
以上就很简单的完成了自动化构建数据企业微信结果通知。