MHY_Scanner单元测试与CI/CD实践:gtest五大测试套件全解读
MHY_Scanner单元测试与CI/CD实践gtest五大测试套件全解读【免费下载链接】MHY_ScannerMHY扫码登录器支持从直播流抢码。项目地址: https://gitcode.com/gh_mirrors/mh/MHY_ScannerMHY_Scanner 是一款免费开源的米哈游游戏扫码登录工具支持从屏幕自动识别二维码和从直播流抢码登录。本文完整解读它基于 gtest 构建的 5 个单元测试套件、CMake 测试开关机制以及配套的 Windows CI/CD 自动化构建流程带你看看一个抢码工具是如何用单元测试保障识别质量的。为什么扫码工具需要一套单元测试MHY_Scanner 的核心链路是截屏/拉流 → 视频解码 → 识别二维码 → 解析登录链接 → 完成登录。这条链路上任何一环出问题工具就白抢了。因此项目在 tests/ 目录下维护了一套分层测试测试套件测试目标是否注册到 ctesttest_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_TESTSON即可编译出全部 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 用例覆盖三类地基能力APIHttpClient的GetRequest可用性、getStokenByGameToken换取 stoken 的返回结果登录流程的关键一步UUIDCreateUUID4()生成的 UUID 长度校验URLEncodeurlDecode(Hello%23World%22)应还原为Hello#World保证登录参数解析不出错。2️⃣ test_gui二维码识别回归测试核心中的核心test_gui.cpp 是质量保障的重头戏把四款米哈游游戏的真实登录二维码截图作为测试素材存放在 doc/image/用QRScanner::decodeSingle解码后断言结果与预期登录 URL逐字符相等绝区零doc/image/zzz_qrcode_1440.png崩坏3doc/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_videoFFmpeg 软解 内存泄漏检查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_hwdxva2 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-failureCI/CD 构建工作流一条命令产出 Release 包 项目的持续集成入口是 .github/workflows/windows-build.yml触发条件为 push 到 main、打v*tag 或手动触发见 windows-build.yml。关键步骤装 Qt 6.8.0MSVC2022 64 位并开启缓存windows-build.ymlvcpkg 二进制缓存以vcpkg.json的哈希做缓存 key依赖没变就不重新编译第三方库CMake 配置指定x64-windows-static-mdtriplet 静态链接UNIT_TESTSOFF、DEVOFFwindows-build.yml打包发布并行编译 →cmake --install收集 Qt/FFmpeg DLL 与ScanModel/模型 → PowerShell 压成 ZIP 上传 artifact保留 5 天→ 打 tag 时自动创建 Releasewindows-build.yml。值得一提的是当前 CI 以快速产出可发布包为目标单元测试更多用于开发者本地回归若将test_core/test_gui接入流水线即可实现每次提交自动回归识别准确率这是很好的社区贡献方向。小结 五大套件各司其职test_core守接口、test_gui守识别准确率、test_streamlink守拉流、test_video/test_video_hw守解码稳定性-DUNIT_TESTSON一键开启测试构建ctest即可回归核心与识别用例CI/CD 用 vcpkg 缓存 静态链接把完整构建打包成 ZIP 并自动发版是 Windows 桌面工具很实用的实践范本。【免费下载链接】MHY_ScannerMHY扫码登录器支持从直播流抢码。项目地址: https://gitcode.com/gh_mirrors/mh/MHY_Scanner创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

PaiAgent AI工作流编排平台完全解析:轻量级Dify/n8n国产替代,拖拽式组合多模型AI能力

PaiAgent AI工作流编排平台完全解析:轻量级Dify/n8n国产替代,拖拽式组合多模型AI能力

PaiAgent AI工作流编排平台完全解析:轻量级Dify/n8n国产替代,拖拽式组合多模型AI能力 【免费下载链接】PaiAgent 🔥轻量级的AI工作流编排系统,类似dify、n8n,全程使用Vibe Coding,AI工具为QoderCLI。涉及到…

2026/9/25 2:06:54 阅读更多 →
react-vis BarSeries 完全指南:用 VerticalBarSeries / HorizontalBarSeries 构建柱状图与堆叠柱状图

react-vis BarSeries 完全指南:用 VerticalBarSeries / HorizontalBarSeries 构建柱状图与堆叠柱状图

数据可视化图表库前端 【免费下载链接】react-vis Data Visualization Components 项目地址: https://gitcode.com/gh_mirrors/re/react-vis 点击查看 免费下载 导读 Bar Series(柱状系列)是 react-vis 中用于绘制矩形柱体的核心系列组件&a…

2026/9/25 2:05:54 阅读更多 →
Apache Beam 社区指标同步:基于 GitHub GraphQL API 的 PR/Issue 数据采集与 PostgreSQL 落地实践

Apache Beam 社区指标同步:基于 GitHub GraphQL API 的 PR/Issue 数据采集与 PostgreSQL 落地实践

大数据批处理流处理数据工程 【免费下载链接】beam Apache Beam is a unified programming model for Batch and Streaming data processing. 项目地址: https://gitcode.com/gh_mirrors/beam4/beam 点击查看 免费下载 本文以 Apache Beam 仓库中 .test-infra/metr…

2026/9/25 2:05:54 阅读更多 →

最新新闻

UEFI蓝屏排查实战:从引导诊断到启动盘制作全攻略

UEFI蓝屏排查实战:从引导诊断到启动盘制作全攻略

1. UEFI蓝屏问题的本质与诊断思路电脑蓝屏这件事,干了十几年运维和装机,我敢说UEFI环境下的蓝屏跟传统Legacy BIOS时代的蓝屏,排查逻辑完全是两码事。很多人一看到蓝屏就条件反射地重装系统,结果装完没两天又蓝了,问题…

2026/9/25 2:46:19 阅读更多 →
ADC采样的工程哲学:从量化误差到信号还原

ADC采样的工程哲学:从量化误差到信号还原

1. 先纠正一个广为流传的观点:量化误差不是“算错”,而是信息取舍做嵌入式这些年,我见过太多人一提到 ADC 就说“12 位精度比 10 位更准”。这话只对了一半,而且容易让人产生一个错误直觉——ADC 的分辨率越高,采出来的…

2026/9/25 2:46:19 阅读更多 →
灰色模型GM(1,1)电力负荷预测实战指南

灰色模型GM(1,1)电力负荷预测实战指南

简介:本资源是一份面向电力系统分析初学者与能源领域算法实践者的灰色模型(GM)负荷预测代码实现,聚焦小样本、非线性电力负荷序列的建模与预测问题。包内共8个文件,含4个MATLAB核心脚本(gmfun.m、ols_run.m…

2026/9/25 2:46:19 阅读更多 →
Linux+Samba 自建家庭云盘服务器实战指南

Linux+Samba 自建家庭云盘服务器实战指南

1. 整体构思与硬件选型说实在的,我一直觉得现在各家网盘虽然存取方便,但总有几道迈不过去的坎:容量稍微上去就要付费、上传下载速度被限死、文件放在别人服务器上总归不太安心。前段时间家里旧电脑退役,硬盘还好好的,我…

2026/9/25 2:46:19 阅读更多 →
麦克纳姆轮驱动原理与安装调试全指南:从受力分析到PID整定

麦克纳姆轮驱动原理与安装调试全指南:从受力分析到PID整定

1. 麦克纳姆轮到底解决了什么问题第一次见到麦克纳姆轮的人,大概率会盯着它看半天——轮子边缘斜着排了一圈小辊子,看起来像是哪个玩具厂随手拼出来的东西。但只要通电让它转起来,你就会发现这台小车能横着走、斜着走、原地打转,甚…

2026/9/25 2:46:19 阅读更多 →
RazerIOs离线安装全指南:Linux雷蛇外设开箱即用

RazerIOs离线安装全指南:Linux雷蛇外设开箱即用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 2:45:19 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →