news 2026/2/24 21:25:07

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/2/25 13:37:45

AI编程助手选型指南:opencode开源优势深度解析

AI编程助手选型指南&#xff1a;opencode开源优势深度解析 1. 技术背景与选型需求 随着大模型在软件开发领域的深入应用&#xff0c;AI编程助手已成为提升研发效率的核心工具之一。从GitHub Copilot到Tabnine&#xff0c;商业化产品虽功能成熟&#xff0c;但在隐私保护、模型…

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

python基于flask框架电商秒杀商品管理系统设计与实现

目录摘要关键词开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 随着电子商务的快速发展&#xff0c;秒杀活动成为电商平台吸引用户、提升销量的重要手段。然而&#xff0c;高并发场景下…

作者头像 李华
网站建设 2026/2/23 14:57:40

Seurat-wrappers单细胞分析扩展工具集:从入门到精通

Seurat-wrappers单细胞分析扩展工具集&#xff1a;从入门到精通 【免费下载链接】seurat-wrappers Community-provided extensions to Seurat 项目地址: https://gitcode.com/gh_mirrors/se/seurat-wrappers Seurat-wrappers是一个强大的社区扩展工具集&#xff0c;为单…

作者头像 李华
网站建设 2026/2/23 15:30:55

Source Han Serif CN:彻底告别字体版权困扰的终极解决方案

Source Han Serif CN&#xff1a;彻底告别字体版权困扰的终极解决方案 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为专业中文字体的高昂授权费用而烦恼吗&#xff1f;作为设计…

作者头像 李华
网站建设 2026/2/23 13:01:04

Qwen3-VL与Phi-3-Vision对比:边缘设备部署性能评测

Qwen3-VL与Phi-3-Vision对比&#xff1a;边缘设备部署性能评测 1. 背景与选型动机 随着多模态大模型在智能终端、机器人和边缘计算场景中的广泛应用&#xff0c;如何在资源受限的设备上高效部署视觉语言模型&#xff08;VLM&#xff09;成为工程落地的关键挑战。当前&#xf…

作者头像 李华
网站建设 2026/2/21 14:52:00

如何高效完成图片批量抠图?试试科哥CV-UNet大模型镜像

如何高效完成图片批量抠图&#xff1f;试试科哥CV-UNet大模型镜像 1. 背景与痛点分析 在电商、设计、内容创作等领域&#xff0c;图片背景移除&#xff08;即“抠图”&#xff09;是一项高频且耗时的任务。传统方式依赖人工使用Photoshop等工具逐张处理&#xff0c;效率低下&a…

作者头像 李华