news 2026/6/10 9:16:43

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/5/30 4:39:13

AMD Ryzen硬件调试革命:85%效率提升的系统性能优化方案

AMD Ryzen硬件调试革命&#xff1a;85%效率提升的系统性能优化方案 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://g…

作者头像 李华
网站建设 2026/5/31 5:15:04

STM32驱动LVGL显示完整指南

STM32驱动LVGL实战全解析&#xff1a;从零搭建嵌入式图形界面 你有没有遇到过这样的项目需求——客户想要一个“像手机一样流畅”的触摸屏界面&#xff0c;而你的主控只是块STM32&#xff1f;别慌&#xff0c;这不是天方夜谭。今天我们就来拆解如何用 一颗不带GPU的Cortex-M7…

作者头像 李华
网站建设 2026/6/8 11:48:48

提升语音交互体验|利用SenseVoice Small识别文本与情绪状态

提升语音交互体验&#xff5c;利用SenseVoice Small识别文本与情绪状态 1. 引言&#xff1a;语音交互中的情感理解需求 随着智能语音助手、客服机器人、会议记录系统等应用的普及&#xff0c;传统的语音识别技术已无法满足日益复杂的交互需求。用户不再仅仅关注“说了什么”&…

作者头像 李华
网站建设 2026/5/8 2:37:24

Mac版微信插件完整管理指南:3分钟解决所有安装与卸载问题

Mac版微信插件完整管理指南&#xff1a;3分钟解决所有安装与卸载问题 【免费下载链接】WeChatExtension-ForMac Mac微信功能拓展/微信插件/微信小助手(A plugin for Mac WeChat) 项目地址: https://gitcode.com/gh_mirrors/we/WeChatExtension-ForMac 还在为微信插件崩溃…

作者头像 李华
网站建设 2026/6/8 18:09:57

面试反馈自动化:基于候选人语音情绪生成初步评价

面试反馈自动化&#xff1a;基于候选人语音情绪生成初步评价 在现代招聘流程中&#xff0c;面试官需要处理大量候选人录音或视频记录&#xff0c;手动撰写反馈不仅耗时且容易受主观因素影响。本文将介绍如何利用 SenseVoiceSmall 多语言语音理解模型&#xff08;富文本/情感识…

作者头像 李华