SuperAPI AI 工具集

coverage-report

测试与质量

查看项目

更新于 10-16 01:33

技能介绍

用途:该技能提供一个脚本 scripts/coverage/coverage.sh,用于从终端测量 VivaDicta 的代码覆盖率。覆盖率是运行时指标,必须实际运行测试才能获得,不能与静态的测试/生产代码行数比混淆(后者属于 loc-report 技能)。

主要用法:

  • scripts/coverage/coverage.sh app:模拟器运行完整测试计划,给出整体及分目标覆盖率。
  • scripts/coverage/coverage.sh app ChatViewModel.swift SmartSearchChatViewModel.swift:在上一方式基础上追加指定文件的逐文件行。
  • scripts/coverage/coverage.sh module CloudTranscription:在 macOS 主机上通过 swift test 快速运行单个 SPM 模块,无需模拟器。
  • scripts/coverage/coverage.sh full:清理 DerivedData 后运行完整计划,自动为掉行或 0/0 的模块用 module 路径补齐,输出合并的 16 模块表,较慢(约 10-15 分钟)。 环境变量可覆盖 DESTINATION(默认 iPhone 17 Pro Max 模拟器)和 RESULT(.xcresult 路径)。

两条路径对比:app 基于 xcodebuild + xccov,覆盖整个应用、扩展和所有模块,运行在 iOS 模拟器上,较慢,读取 .xcresult,用于规范数字与应用目标;module 基于 swift test + llvm-cov,仅覆盖单个 SPM 模块,运行在 macOS 主机上,只需数秒,读取 .build 下的测试二进制与 default.profdata,适合单模块测试迭代。应用目标 VivaDicta.app 只能用 app 方式测量。

注意事项:macOS 主机运行会排除仅 iOS 文件,模块的 module 路径总数与 Xcode/xccov 略有差异,module 适合看相对进展,规范总数以 app/xccov 为准。聚合的逐目标行具有非确定性:SPM 模块作为静态库同时链接到应用和自身测试包,链接器去重有时导致某模块独立行在某些运行中掉落或返回 0/0,且掉落模块逐次变化;干净重建可恢复大部分行,这也是 full 所做的。确定性单模块数字请使用 module 路径。头条数字由约 7.3 万行的 VivaDicta.app 目标主导(约 9%),应用约占 80% 代码,模块级测试工作对全局百分比影响很小,建议看每个逻辑模块覆盖率和 ViewModel 的逐文件行。工具链升级后,先执行 rm -rf Modules/<Module>/.build 再走 module 路径,避免陈旧的 .swiftmodule 导入错误。

过滤说明:VivaDictaTestPlan.xctestplan 没有 codeCoverage 固定项,Xcode 会收集所有目标(含 Firebase/Google/GUL/KeyboardKit 等),原始包百分比无意义(约 25%)。coverage.sh 在报告时通过 first_party_overall 过滤为第一方:16 个生产模块 + VivaDicta 应用 + 4 个扩展,排除 TestUtilities、*Mocks、*Tests,第一方整体约 14%。因此过滤由脚本而非测试计划负责。若手动调用 xccov,需自行过滤至第一方,否则会得到被污染的数字。完整终端覆盖率参考也位于 AGENTS.md 的 Test Coverage 一节。