效率神器!企业微信机器人通知自动化构建测试数据!


在这里插入图片描述

配置企业微信消息通知,统计测试数据

可以参考企业微信官网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 命令即可运行配置文件中指定文件。

终端打印结果:

在这里插入图片描述

企业微信结果:

在这里插入图片描述

以上就很简单的完成了自动化构建数据企业微信结果通知。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值