☰
MHY_Scanner单元测试与CI/CD实践:gtest五大测试套件全解读
2026/9/25 2:06:46 网站建设 项目流程

MHY_Scanner单元测试与CI/CD实践:gtest五大测试套件全解读

【免费下载链接】MHY_ScannerMHY扫码登录器,支持从直播流抢码。项目地址: https://gitcode.com/gh_mirrors/mh/MHY_Scanner

MHY_Scanner 是一款免费开源的米哈游游戏扫码登录工具,支持从屏幕自动识别二维码和从直播流抢码登录。本文完整解读它基于 gtest 构建的 5 个单元测试套件、CMake 测试开关机制,以及配套的 Windows CI/CD 自动化构建流程,带你看看一个"抢码工具"是如何用单元测试保障识别质量的。🧪

为什么扫码工具需要一套单元测试?

MHY_Scanner 的核心链路是:截屏/拉流 → 视频解码 → 识别二维码 → 解析登录链接 → 完成登录。这条链路上任何一环出问题,工具就"白抢"了。因此项目在 tests/ 目录下维护了一套分层测试:

测试套件测试目标是否注册到 ctest
test_core网络请求、token 接口、UUID、URL 编解码✅
test_gui四款游戏二维码图像的解码回归✅
test_streamlinkB站/抖音/虎牙直播流地址获取❌(手动调试)
test_videoFFmpeg 软解直播流 + 内存泄漏检查❌(手动调试)
test_video_hwdxva2 GPU 硬解直播流❌(手动调试)

开启测试编译:一个 CMake 开关搞定

单元测试默认不参与主程序构建,由根目录 CMakeLists.txt 中的UNIT_TESTS选项控制:

option(UNIT_TESTS "Unit Tests" OFF) ... if(UNIT_TESTS) enable_testing() add_subdirectory(tests) endif()

配置时加上-DUNIT_TESTS=ON即可编译出全部 5 个测试可执行文件。测试框架采用 GoogleTest 1.13.0(头文件来自3rdparty/googletest-1.13.0/include),并在 tests/CMakeLists.txt 中显式关闭了BUILD_GMOCK——纯断言用例用不上 mock,保持依赖轻量。

五大测试套件全解读

1️⃣ test_core:核心接口与工具函数

test_core.cpp 共 4 个 TEST 用例,覆盖三类"地基"能力:

  • API:HttpClient的GetRequest可用性、getStokenByGameToken换取 stoken 的返回结果(登录流程的关键一步);
  • UUID:CreateUUID4()生成的 UUID 长度校验;
  • URLEncode:urlDecode("Hello%23World%22")应还原为Hello#World",保证登录参数解析不出错。

2️⃣ test_gui:二维码识别回归测试(核心中的核心)

test_gui.cpp 是质量保障的"重头戏":把四款米哈游游戏的真实登录二维码截图作为测试素材(存放在 doc/image/),用QRScanner::decodeSingle解码后断言结果与预期登录 URL逐字符相等:

  • 绝区零:doc/image/zzz_qrcode_1440.png
  • 崩坏3:doc/image/bh3_qrcode_1080.png
  • 原神:doc/image/hk4e_qrcode_1080.png
  • 崩坏:星穹铁道:doc/image/hkrpg_qrcode_1080.png

这种"真图 + 精确断言"的写法,能确保 OpenCV 升级或ScanModel/下 detect 模型调整后,识别准确率不回退。

3️⃣ test_streamlink:直播流地址获取

test_streamlink.cpp 分别实例化LiveDouyin、LiveBili、LiveHuya,调用GetLiveStreamStatus()后打印GetLiveStreamLink()的结果——验证"由 RID 换取 FLV 直播流地址"这一抢码前置步骤在多平台下均可用。

4️⃣ test_video:FFmpeg 软解 + 内存泄漏检查

test_video.cpp 中的AvFFmpegDecoder以QThread形式运行:avformat_open_input打开 FLV 流 → 找视频流 → 解码 →sws_scale缩放至 1280×720 BGR →cv::imshow预览。main里通过_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF)开启 CRT 内存泄漏检测(见 test_video.cpp),专门盯住 FFmpeg 上下文释放是否干净。

5️⃣ test_video_hw:dxva2 GPU 硬解

test_video_hw.cpp 走硬件加速路线:av_hwdevice_find_type_by_name("dxva2")定位 GPU 设备,av_hwframe_transfer_data把解码帧从显存拷回内存后再显示。抢码对解码帧率极度敏感,这个套件用于验证 GPU 解码路径在低延迟下稳定可用。

用 ctest 运行测试:工作目录的小心机

tests/CMakeLists.txt 只为test_core和test_gui调用了add_test,并做了两处关键配置:

  • WORKING_DIRECTORY指向src,保证用例里../doc/image/xxx.png的相对路径正确;
  • 为test_gui注入 Qt 6.2.3 的PATH环境变量,否则链接 Qt 的测试程序找不到 DLL 无法启动。

运行方式(需在 tests 目录下已构建的 CTest 环境中):

ctest --output-on-failure

CI/CD 构建工作流:一条命令产出 Release 包 🚀

项目的持续集成入口是 .github/workflows/windows-build.yml,触发条件为 push 到 main、打v*tag 或手动触发(见 windows-build.yml)。关键步骤:

  1. 装 Qt 6.8.0(MSVC2022 64 位)并开启缓存(windows-build.yml);
  2. vcpkg 二进制缓存:以vcpkg.json的哈希做缓存 key,依赖没变就不重新编译第三方库;
  3. CMake 配置:指定x64-windows-static-mdtriplet 静态链接,UNIT_TESTS=OFF、DEV=OFF(windows-build.yml);
  4. 打包发布:并行编译 →cmake --install收集 Qt/FFmpeg DLL 与ScanModel/模型 → PowerShell 压成 ZIP 上传 artifact(保留 5 天)→ 打 tag 时自动创建 Release(windows-build.yml)。

值得一提的是,当前 CI 以"快速产出可发布包"为目标,单元测试更多用于开发者本地回归;若将test_core/test_gui接入流水线,即可实现"每次提交自动回归识别准确率",这是很好的社区贡献方向。

小结 📌

  • 五大套件各司其职:test_core守接口、test_gui守识别准确率、test_streamlink守拉流、test_video/test_video_hw守解码稳定性;
  • -DUNIT_TESTS=ON一键开启测试构建,ctest即可回归核心与识别用例;
  • CI/CD 用 vcpkg 缓存 + 静态链接把完整构建打包成 ZIP 并自动发版,是 Windows 桌面工具很实用的实践范本。

【免费下载链接】MHY_ScannerMHY扫码登录器,支持从直播流抢码。项目地址: https://gitcode.com/gh_mirrors/mh/MHY_Scanner

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询