如何用腾讯云 SCF 部署企微机器人定时推送小程序云测结果(亲测无坑分享)

前言

小程序开发测试过程中,云测平台是较常用的测试工具之一,通过将小程序云测任务结果自动推送到企业微信,能够让团队及时了解测试情况并快速跟进。

实现功能说明:

- 自动获取最新一条 MiniTest 测试任务(任务 ID、跑测平台、成功率等)

- 获取任务测试报告分享链接(30天有效)

- 渲染为 Markdown 消息模板

- 部署腾讯云 SCF 企业微信机器人每日定时通知、@指定人员/all

- 支持失败自动重试、配置灵活


 一、前期准备

云测平台:MiniTest-自动化测试平台 (可以直接看微信官方文档 很详细也很简单上手)

基本步骤:

  1. 下载微信开发者工具,导入小程序项目创建
  2. 安装云测服务扩展插件
  3. 自动化测试录制测试用例,同步用例到云测服务
  4. MiniTest 平台新建小程序测试任务/定时任务

腾讯云(SCF):是腾讯提供的无服务器云平台,对个人开发者永久免费,适合低频任务(如定时推送通知就足够用了)

部署详细步骤:

1. 注册账号登录:https://cloud.tencent.com/product/scf

2. 访问 SCF 控制台,选择左侧导航栏的 函数服务

3. 新建 -> 从头开始创建

4. 配置项可按如下图:

  • 基础配置

  • 函数代码:选择 本地上传zip包,注意执行方法要与代码里的执行入口对应好,这里是 main.main_handler

  • 触发器:Cron 30 6 * * * 代表每天早上 6:30

配置好后点击完成即创建成功,可点击 部署 或 测试,如果配置正确,将自动向你的企业微信群发送最新一条测试任务消息。


二、整体项目

1. 项目结构目录

| 文件 | 说明 |
|------|------|
| `main.py` | 云函数入口,自动执行任务 |
| `utils.py` | 工具函数,含数据请求和发送消息 |
| `config.yaml` | 配置文件,含 token、模板、Webhook 等 |
| `requirements.txt` | 第三方依赖 |

2. 代码内容

# config.yaml  (模板内容可自行配置)

wecom:
  webhook: "你的企业微信群机器人Webhook链接"

minitest:
  token: "你从MiniTest获取的token"
  group_en_id: "你的MiniTest项目英文ID"

message:
  at_list:
    - "@all"   # 可填写具体的成员企业微信ID,如 zhangsan
  template: |
    早上好~
    【云测日报】
    任务ID:{id}
    跑测平台:{platform}
    成功率:{rate}
    测试报告链接:[点击查看报告]({url})
    {at}

# main.py (主函数)

    # 从 utils 模块导入四个工具函数,分别用于读取配置、获取任务信息、构建消息和发送消息
    from utils import load_config, get_latest_task_info, build_markdown_message, send_wecom_message_with_retry
    
    
    # SCF 云函数主入口函数,event 和 context 是平台传入的参数
    def main_handler(event=None, context=None):
        # 读取本地配置文件 config.yaml
        config = load_config("config.yaml")
    
        # 调用接口获取最新的测试任务信息
        task_info = get_latest_task_info(config)
    
        if not task_info:
            print("未获取到最新任务信息")
            return
    
        # 构建消息内容
        message = build_markdown_message(config, task_info)
    
        # 发送消息到企业微信,失败时自动重试
        send_wecom_message_with_retry(config, message)
    

    # utils.py (工具函数)

    云测 API 接口文档地址:第三方接口介绍 | 微信开放文档

    import yaml
    import time
    import requests
    
    
    def load_config(path):
        with open(path, 'r', encoding='utf-8') as f:
            return yaml.safe_load(f)
    
    
    def get_latest_task_info(config):
        # 任务列表接口
        url = "https://minitest.weixin.qq.com/thirdapi/plan_list"
        params = {
            "token": config["minitest"]["token"],
            "group_en_id": config["minitest"]["group_en_id"],
            "page_index": 1,
            "page_size": 1  # 只取最新一条
        }
        try:
            # 发 GET 请求拿到任务列表
            resp = requests.get(url, params=params)
            data = resp.json()
    
            # 如果接口返回成功且有任务
            if data["rtn"] == 0 and data["data"]["plan_list"]:
                # 取第一条任务
                task = data["data"]["plan_list"][0]
                # 再查这个任务的测试报告链接
                report = requests.get("https://minitest.weixin.qq.com/thirdapi/share_url", params={
                    "token": config["minitest"]["token"],
                    "group_en_id": config["minitest"]["group_en_id"],
                    "plan_id": task["id"]
                }).json()
                # 如果拿到了报告链接,存到任务里
                task["report_url"] = report["data"]["share_url"] if report["rtn"] == 0 else ""
                return task
        except Exception as e:
            print("获取任务失败:", e)
        return None
    
    
    def build_markdown_message(config, task):
        # 从配置中读取消息模板
        msg_tpl = config["message"]["template"]
        # 获取要 @ 的人列表
        at_list = config["message"].get("at_list", [])
        # 转成企业微信支持的 @ 格式
        at_str = " ".join([f"<@{uid}>" for uid in at_list])
    
        # 填充消息模板
        message = msg_tpl.format(
            id=task["id"],
            platform=task.get("platforms", ""),
            rate=f"{task.get('success_rate', 0)*100:.1f}%" if task.get("success_rate") else "",
            url=task.get("report_url", ""),
            at=at_str
        )
        return message
    
    
    def send_wecom_message_with_retry(config, content, retries=3):
        webhook = config["wecom"]["webhook"]
        data = {
            "msgtype": "markdown",
            "markdown": {"content": content}
        }
    
        # 最多重试3次
        for attempt in range(retries):
            try:
                # 发 POST 请求发送消息
                resp = requests.post(webhook, json=data)
                if resp.status_code == 200 and resp.json().get("errcode") == 0:
                    print("消息发送成功")
                    return
            except Exception as e:
                print(f"发送失败,重试中({attempt+1}/{retries}):", e)
            # 每次失败等待 3 秒后重试
            time.sleep(3)
        print("消息发送失败")
    

    # requirements.txt  (依赖文件)

    requests==2.28.2
    urllib3==1.26.15
    PyYAML==6.0
    

    3. 本地代码打包:

    终端运行

    pip install -r requirements.txt -t .  (安装依赖)
    zip -r wecom_notifier.zip .  (打包执行)

    如果 zip 报错失败,也可直接尝试:

    • 打开项目文件夹,进入项目目录内部

    • 全选 所有文件(比如 main.py, utils.py, config.yaml 等)

    • 右键 → 发送到 → 压缩文件夹

    • 命名为 wecom_notifier.zip

    上传 wecom_notifier.zip 到函数平台使用即可


    三、最后

    效果示例:

    当前已基本满足 “动态获取云测任务结果,定时推送企业微信自动通知”,后续可以拓展至钉钉/飞书等其他平台,也能够基于自身需求再增加丰富功能。

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    Ohhhzm

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

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

    余额充值