news 2026/10/16 1:38:26

lolPing 桌面应用怎么测:测试与 CI 实践完整清单

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
lolPing 桌面应用怎么测:测试与 CI 实践完整清单

【免费下载链接】lolPing

League of Legends ping wheel for your Windows desktop. Hold Alt, drag, and ping anywhere, with the original animations and sounds.

项目地址:https://gitcode.com/gh_mirrors/lo/lolPing
点击查看免费下载

lolPing 是一个给 Windows 和 macOS 桌面用的英雄联盟风格 ping 轮盘:按住 Alt 拖拽、松手即可在任何位置发出 ping,带有原汁原味的动画和音效。这类应用有个特殊的测试难题——它要监听全局鼠标键盘、画透明悬浮窗,很难直接用 UI 自动化碰它。这个项目用"纯逻辑抽离 + 协议模拟 + 假进程替身"的组合拳,把大部分行为变成了不碰 UI 就能跑的单测,再由 GitHub Actions 在 Windows 和 macOS 双平台把关。下面是一份完整的清单式盘点。

一、测试分层:一个应用,三套测试

lolPing 的代码分为两层:Electron(TypeScript)负责窗口、悬浮层和房间协议;C++ 进程 hook-helper 负责底层的输入钩子(Windows 全局钩子 / macOS event tap)。对应地,测试也分三层,全部由 vitest.config.ts 和 run.mjs 驱动:

层跑什么命令位置
C++ 纯逻辑手势状态机Decisionnpm run test:helperhelper_tests.cpp
协议集成启动真实 helper 的--simulate模式,喂模拟按键npm testprotocol.test.ts
TypeScript 单测主进程、渲染层、共享模块npm testtests/

🎯 核心思路只有一句话:把"决策"从"胶水"里抽出来,测决策,不测胶水。钩子拿到按键后做什么,全部由一个纯函数状态机 decision.cpp 决定;C++ 测试直接向状态机灌入事件序列,断言它该"吞掉"哪些输入、该向 Electron 发什么事件——完全不需要真实的鼠标键盘。

二、TypeScript 测试:40+ 个文件,镜像 src 结构

测试目录 tests/ 与源码 src/ 一一对应:tests/main/对应src/main/,tests/shared/对应src/shared/。几个有代表性的做法值得借鉴:

1. 假替身(fixtures)替代真实依赖

tests/main/fixtures/ 里放着一套"替身演员":

  • fake-helper.mjs:用 Node 脚本冒充 C++ helper。它能模拟三种状态——正常回显、启动即崩溃、macOS 无辅助功能权限退出。于是 inputBridge.test.ts 可以稳定复现"helper 崩溃 3 次后放弃重启""无权限时不盲目重启"这类故障恢复逻辑。
  • fakeSocket.ts:WebSocket 替身,测试想让它打开就打开、想断线就断线,relayConnection.test.ts 借此覆盖了 Nostr 中继的订阅、重连和回声去重。
  • fakeTransport.ts 与 fakeRelay.ts:把局域网 UDP 和中继网络都换成内存管道,房间加密、防重放等逻辑(如 roomCrypto.test.ts、replayGuard.test.ts)因此零真实网络。

2. 确定性三板斧:注入时间、注入随机、等待条件

以 floodGuard.test.ts 为例,时间不是Date.now(),而是外部传入的now: () => number,测试用advance(1000)手动拨快时钟,验证限流预算"随时间回血"。项目规范(AGENTS.md)明确写着:不写固定 sleep,等条件而不是等时间。

npm run typecheck # 类型检查 npm run test:helper # 构建并跑 C++ 测试 npm test # 跑全部 TypeScript 测试

3. 连 CI 脚本本身也有测试

最有意思的一条:releaseWorkflow.test.ts 直接读取 release.yml 的文本,用断言"锁死"发布流程的顺序——比如"平台 job 里绝不能出现--draft=false"、"Windows job 必须上传latest.yml和 blockmap"。工作流改错了?测试会先红给你看。

三、CI 双平台:一次推送,两道门禁

CI 定义在 ci.yml,main分支推送和每个 PR 都会触发两个并行 job:

  • test(windows-latest):npm ci→typecheck→test:helper(编译 hook-helper.exe 并跑 C++ 测试,TypeScript 协议测试依赖这个产物)→npm test→npm run build与build:site,保证能打包、演示页能构建。
  • test-mac(macos-latest,Apple Silicon):同样的测试链,外加dist:mac完整出包,再用codesign --verify校验签名、确认 hook-helper 是 arm64、托盘图标在位,最后把.dmg作为 artifact 保留 14 天。

两个细节很实用:macOS 上设置了CSC_FOR_PULL_REQUEST: true(arm64 未签名 app 根本启动不了,PR 上也必须做 ad-hoc 签名);权限只给contents: read,最小化 CI 的越权能力。

四、发布流水线:测试是发布的入场券

release.yml 在推送形如v0.5.1的 tag 时触发,同样先跑test:helper和npm test,通过才允许出安装包。它的顺序被设计成"草稿发布"模式:先建 draft release → Windows 和 macOS job 分别上传安装包与latest.yml/blockmap → 最后由 publish job 转正。这样已安装应用读取更新时不会遇到"latest.yml 还没上传"的失败窗口。

五、清单:改动合入前跑一遍

  • npm run typecheck类型零报错
  • npm run test:helperC++ 状态机测试通过
  • npm test全部 Vitest 通过,新逻辑带测试,修 bug 带"不修就红"的测试
  • 涉及输入、悬浮窗、声音的改动,额外用npm run dev在对应系统上手跑一遍——测试绿了不等于 UI 没问题
  • 双平台行为一致:平台差异用 platform.ts 或 hook-helper 各自的hooks_win.cpp/hooks_mac.cpp隔离
  • 需要人工验证的场景(如房间),可用 tools/room-peer 造一个假队友在单机上压测

lolPing 这套实践对新手的最大启发是:桌面应用不必靠"点鼠标"来测。把状态机、协议、限流、加密都做成可注入时间的纯模块,再配一套假进程和假 socket,绝大多数逻辑都能在 CI 里零 UI 地跑起来;剩下的少量"手感"问题,留给人和真机。

【免费下载链接】lolPing

League of Legends ping wheel for your Windows desktop. Hold Alt, drag, and ping anywhere, with the original animations and sounds.

项目地址:https://gitcode.com/gh_mirrors/lo/lolPing
点击查看免费下载

相关推荐

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

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

如何下载安装 Chatlog Alpha:macOS 与 Windows 全平台部署清单

后端CLIMCP 服务即时通讯RAG人工智能AI 技能 【免费下载链接】chatlog_alpha 原 [chatlog]项目(一个微信数据库解密读取及提供mcp服务、http服务的开源软件),现已支持通过微信clawbot接口推送消息,可以实时转发全部或指定消息到cl…

作者头像 李华
网站建设 2026/10/16 1:35:17

无需写代码:用可视化工具抓取滚动加载页面的完整指南

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

作者头像 李华
网站建设 2026/10/16 1:34:49

Jev:TypeSafe AI的行为契约与可信执行基座

最近全网刷屏的“Jev”这个词,几乎一夜之间出现在技术社区、AI工具评测、开发者群聊和招聘JD里——有人把它比作“TypeSafe时代的Copilot”,也有人称它是“System One Model落地的第一块真实拼图”。但翻遍主流技术媒体、GitHub趋势榜和Hugging Face模型…

作者头像 李华