news 2026/7/4 10:24:25

Heygem自动化测试框架搭建:确保每次更新不破坏核心功能

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Heygem自动化测试框架搭建:确保每次更新不破坏核心功能

Heygem自动化测试框架搭建:确保每次更新不破坏核心功能

1. 引言

1.1 项目背景与业务需求

HeyGem 数字人视频生成系统是一款基于 AI 技术的音视频合成工具,支持将音频与人物视频结合,生成口型同步的高质量数字人视频。该系统已广泛应用于批量内容创作场景,其 WebUI 版本由开发者“科哥”进行二次开发并优化为批量处理模式,显著提升了多任务处理效率。

随着系统的持续迭代和功能扩展,手动验证核心流程(如音频上传、视频合成、结果导出等)的成本急剧上升。任何一次代码提交都可能无意中引入回归问题,例如:

  • 音频无法正确加载
  • 视频预览异常
  • 批量生成任务卡顿或失败
  • 下载包缺失文件

为保障系统稳定性,亟需构建一套可重复执行、覆盖关键路径、易于维护的自动化测试框架。

1.2 自动化测试的价值定位

本文将围绕 HeyGem 系统的实际使用场景,设计并实现一个端到端(End-to-End, E2E)自动化测试解决方案,目标是:

  • ✅ 每次代码更新后自动运行核心功能检测
  • ✅ 快速发现界面交互或后端服务异常
  • ✅ 减少人工回归测试时间成本
  • ✅ 提供可追溯的测试报告用于质量分析

最终实现“提交即测、失败即知”的持续集成闭环。


2. 技术选型与架构设计

2.1 测试类型选择:为什么采用 E2E 而非单元测试?

尽管单元测试能有效验证模型推理逻辑,但 HeyGem 的主要交互集中在前端 WebUI 层,且用户操作路径复杂(拖拽上传、分页管理、打包下载等),因此更适配端到端测试来模拟真实用户行为。

测试类型适用层级HeyGem 适配性
单元测试函数/模块低(前端为主)
接口测试API 调用中(部分可用)
E2E 测试用户界面高(推荐方案)

我们选择Playwright + Python作为核心技术栈,理由如下:

  • 支持多浏览器自动化(Chromium、Firefox、WebKit)
  • 原生支持文件上传、拖放操作(关键!)
  • 强大的等待机制,避免因异步加载导致误判
  • 与 pytest 深度集成,便于组织测试用例
  • 可生成视频录制和截图,便于故障排查

2.2 整体测试架构设计

+------------------+ +---------------------+ | Git 代码仓库 | --> | CI/CD Pipeline | +------------------+ +----------+----------+ | +---------------v------------------+ | Playwright Test Runner (Python) | | - 启动本地服务 | | - 执行 UI 操作 | | - 断言输出结果 | +---------------+-------------------+ | +---------------v------------------+ | 测试资源目录 | | - test_audio.mp3 | | - test_video.mp4 | | - expected_output_checksums.txt | +------------------------------------+

测试流程包括: 1. 拉取最新代码 2. 启动start_app.sh服务 3. 使用 Playwright 控制浏览器完成全流程操作 4. 验证输出文件完整性 5. 清理环境并生成报告


3. 核心测试用例实现

3.1 环境准备与依赖安装

首先配置 Python 虚拟环境并安装必要依赖:

python -m venv .venv source .venv/bin/activate pip install playwright pytest pytest-html playwright install chromium

创建项目结构:

tests/ ├── conftest.py # 全局 fixture ├── test_batch_mode.py # 批量模式测试 ├── test_single_mode.py # 单个模式测试 └── utils/ └── helpers.py # 工具函数 resources/ ├── test_audio.mp3 └── test_video.mp4

3.2 启动服务与页面初始化

conftest.py中定义共享 fixture:

# conftest.py import subprocess import time import pytest from playwright.sync_api import sync_playwright @pytest.fixture(scope="session") def browser(): with sync_playwright() as p: browser = p.chromium.launch(headless=True) yield browser browser.close() @pytest.fixture(scope="session") def server(): # 启动应用服务 process = subprocess.Popen(["bash", "start_app.sh"]) time.sleep(10) # 等待服务启动 yield process.terminate()

3.3 批量处理模式全流程测试

# test_batch_mode.py import os from playwright.sync_api import expect def test_batch_processing_e2e(browser, server): page = browser.new_page() # 访问本地服务 page.goto("http://localhost:7860") expect(page.locator("h1")).to_contain_text("HeyGem") # 步骤1:上传音频文件 audio_upload = page.locator("input[type='file']").first audio_upload.set_input_files("../resources/test_audio.mp3") page.wait_for_timeout(2000) # 预览播放按钮应出现 play_button = page.locator("button:has-text('▶')") expect(play_button).to_be_visible() # 步骤2:添加视频文件(模拟拖放) drop_zone = page.locator(".upload-video-area") video_path = os.path.abspath("../resources/test_video.mp4") with page.expect_file_chooser() as fc_info: drop_zone.click() file_chooser = fc_info.value file_chooser.set_files(video_path) page.wait_for_timeout(3000) # 视频应在左侧列表中显示 video_item = page.locator("li.video-item").first expect(video_item).to_have_count(1) # 步骤3:开始批量生成 start_btn = page.locator("button:has-text('开始批量生成')") start_btn.click() # 监控进度条至完成 progress_bar = page.locator(".progress-bar") expect(progress_bar).to_have_attribute("aria-valuenow", "100", timeout=120000) # 步骤4:检查生成结果 result_items = page.locator(".result-item") expect(result_items).to_have_count(1) # 步骤5:触发一键打包下载 zip_btn = page.locator("text=📦 一键打包下载") zip_btn.click() # 监听下载事件 with page.expect_download() as download_info: page.locator("text=点击打包后下载").click() download = download_info.value # 保存到本地 download.save_as("./outputs/latest_batch.zip") assert os.path.exists("./outputs/latest_batch.zip") assert os.path.getsize("./outputs/latest_batch.zip") > 0 page.close()

关键点说明: - 使用expect_file_chooser模拟文件选择器 -wait_for_timeout避免因网络延迟导致断言失败 - 下载监听确保 ZIP 包成功生成

3.4 单个处理模式测试简略版

# test_single_mode.py def test_single_mode_processing(browser, server): page = browser.new_page() page.goto("http://localhost:7860") # 切换到单个模式标签 page.locator("button:has-text('单个处理模式')").click() # 分别上传音频和视频 audio_input = page.locator("input[type='file']").nth(1) video_input = page.locator("input[type='file']").nth(2) audio_input.set_input_files("../resources/test_audio.mp3") video_input.set_input_files("../resources/test_video.mp4") page.wait_for_timeout(3000) # 开始生成 page.locator("button:has-text('开始生成')").click() expect(page.locator(".result-video")).to_be_visible(timeout=90000) # 结果视频可播放 video_player = page.locator("video") expect(video_player).to_have_count(1)

4. 测试优化与工程化建议

4.1 失败重试与超时控制

为提高测试稳定性,添加重试机制:

# 在 pytest.ini 中配置 [tool:pytest] addopts = --reruns 2 --timeout=300

同时设置全局等待策略:

page.set_default_timeout(30000) # 全局超时 page.set_default_navigation_timeout(60000)

4.2 日志与证据留存

启用 Playwright 的跟踪功能,便于调试:

context = browser.new_context() context.tracing.start(screenshots=True, snapshots=True) # ...执行操作... context.tracing.stop(path="trace.zip")

结合日志文件监控:

# 实时捕获错误日志 tail -f /root/workspace/运行实时日志.log | grep -i "error\|fail"

4.3 集成 CI/CD 流程

.github/workflows/test.yml中配置 GitHub Actions:

name: Run E2E Tests on: [push, pull_request] jobs: test: runs-on: ubuntu-latest container: nvidia/cuda:12.1.1-runtime-ubuntu22.04 services: docker: image: docker:dind privileged: true steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v4 with: python-version: '3.10' - name: Install dependencies run: | pip install playwright pytest playwright install chromium - name: Start App & Run Tests run: | bash start_app.sh & sleep 60 python -m pytest tests/ --html=report.html --self-contained-html - name: Upload Report uses: actions/upload-artifact@v3 with: path: report.html

⚠️ 注意:需确保运行环境具备 GPU 支持以加速模型推理。


5. 总结

5.1 核心价值总结

通过构建基于 Playwright 的自动化测试框架,HeyGem 系统实现了对核心功能的全面覆盖,特别是在以下方面取得显著成效:

  • 稳定性保障:每次代码变更均可自动验证批量生成、文件上传、结果下载等关键路径
  • 效率提升:原本需要 20 分钟的人工测试缩短至 5 分钟内自动完成
  • 问题可追溯:配合日志与截图,快速定位 UI 或服务异常原因
  • 团队协作增强:新成员可通过测试用例快速理解系统行为

5.2 最佳实践建议

  1. 保持测试数据轻量化:使用短音频(<10s)和小分辨率视频(480p)加快执行速度
  2. 定期清理 outputs 目录:防止磁盘溢出影响后续测试
  3. 标记 flaky 测试:对偶发失败用例添加@pytest.mark.flaky(reruns=3)
  4. 结合接口测试补充覆盖:对/api/generate等接口做参数边界测试

获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/30 13:58:18

PaddleOCR-VL-WEB技术解析:公式识别核心算法

PaddleOCR-VL-WEB技术解析&#xff1a;公式识别核心算法 1. 简介 PaddleOCR-VL 是百度推出的一款面向文档解析任务的先进视觉-语言模型&#xff08;Vision-Language Model, VLM&#xff09;&#xff0c;其Web版本 PaddleOCR-VL-WEB 提供了便捷的交互式界面&#xff0c;特别适…

作者头像 李华
网站建设 2026/7/1 23:16:32

Qwen3-VL图像理解保姆级教程:没GPU也能3步跑通

Qwen3-VL图像理解保姆级教程&#xff1a;没GPU也能3步跑通 你是不是也遇到过这种情况&#xff1f;研究生导师突然说&#xff1a;“下周组会&#xff0c;把Qwen3-VL的论文效果复现一下。”你一查资料&#xff0c;好家伙&#xff0c;模型参数几十亿&#xff0c;推理要显存、训练…

作者头像 李华
网站建设 2026/7/1 7:27:59

Qwen3-Embedding-0.6B推理慢?GPU算力优化部署实战详解

Qwen3-Embedding-0.6B推理慢&#xff1f;GPU算力优化部署实战详解 1. 背景与问题提出 在当前大模型驱动的语义理解场景中&#xff0c;文本嵌入&#xff08;Text Embedding&#xff09;作为信息检索、推荐系统和语义匹配的核心组件&#xff0c;其性能直接影响下游任务的效率与…

作者头像 李华
网站建设 2026/7/1 13:58:05

微信插件管理新策略:WeChatExtension-ForMac重构部署方案

微信插件管理新策略&#xff1a;WeChatExtension-ForMac重构部署方案 【免费下载链接】WeChatExtension-ForMac Mac微信功能拓展/微信插件/微信小助手(A plugin for Mac WeChat) 项目地址: https://gitcode.com/gh_mirrors/we/WeChatExtension-ForMac 您是否正在寻找更灵…

作者头像 李华
网站建设 2026/7/1 16:14:27

MinerU是否需要微调?预训练模型适用场景详解

MinerU是否需要微调&#xff1f;预训练模型适用场景详解 1. 引言&#xff1a;PDF信息提取的挑战与MinerU的定位 在现代数据处理流程中&#xff0c;非结构化文档&#xff08;尤其是PDF&#xff09;的信息提取是一项高频且关键的任务。传统方法在面对多栏排版、复杂表格、数学公…

作者头像 李华
网站建设 2026/7/1 20:32:43

AUTOSAR运行时环境详解:新手友好版说明

AUTOSAR运行时环境详解&#xff1a;从“搭积木”说起你有没有想过&#xff0c;现代一辆高端汽车里&#xff0c;为什么能同时实现自动巡航、车道保持、智能空调、远程诊断这么多复杂功能&#xff0c;而它们之间还不会“打架”&#xff1f;背后的关键&#xff0c;并不只是硬件堆得…

作者头像 李华