Skip to the content.

PTools 质量与验收方法

目标

质量文档描述“如何测”和“什么算通过”;某一次构建、扫描或真机测试的事实结果写入 report/, 不在本文件硬编码临时数字。

静态门禁

每次修改后执行:

bash Scripts/validate_docs.sh
bash Scripts/validate_document_versions.sh
bash Scripts/validate_build_entries.sh
bash Scripts/validate_quality_scans.sh
bash Scripts/validate_debug_instruments_5_18.sh
bash Scripts/validate_517_ui.sh
bash Scripts/validate_519_package_tests_docs.sh
swift package dump-package
git diff --check

必要时执行 pod lib lint PooTools.podspec --allow-warnings --skip-tests。修改 Swift 文件后先做 前端解析,再做完整 Xcode 构建;语法解析不能替代工程构建。

静态门禁必须覆盖:

Build Matrix

入口 配置 目的
SwiftPM Debug / Release,iOS 17+ target、依赖和 manifest 契约
CocoaPods Core 与目标 subspec lint podspec、source、资源和依赖
Xcode PooTools-Example Debug / Release 工程 membership、链接和完整源码
Xcode PooTools Debug Core target 的独立构建
Xcode Simulator / Generic Device 区分模拟器产物、设备产物和 toolchain 阻断

外部 Pods、链接搜索路径、Metal toolchain、签名和依赖产物必须单独分类,不能伪装成 PTools 源码通过。

Runtime Regression

Scene / Navigation

List / Media

UI / Accessibility

Debug / PTInstruments

Performance Measurement

使用同一设备、同一构建和同一操作脚本,每种状态至少重复五次,记录中位数和峰值:

Simulator 结果只能证明功能回归和构建,不替代真实设备的性能预算。

Report Ownership

结果 位置
当前依赖/API/并发/模块扫描 report/current/
发布冻结基线 report/baselines/<version>/
人维护的测试方法 本文件
测试领域与验证缺口 TEST_MATRIX.md
发布流程 docs/maintainers/RELEASE.md

自动报告必须包含 AUTO-GENERATED、Generator、Source revision 和 Generated at 元数据。

Quality Gate 划分

本地和 GitHub Actions 共用 Scripts/quality.sh。完整门禁执行:

./Scripts/quality.sh all

也可以只执行一个领域:version、docs、architecture、tests、concurrency、pods 或 xcode。 Gate 并行执行,最终 summary 只汇总 JSON artifact,不重复执行检查。质量报告包含 quality-report.json 和 quality-report.md;失败日志统一打印 Gate、failure code、Expected、 Actual、File 和 Rule。开发版本不要求等于最新正式 tag;只有 tag 内 VERSION 与 tag 名称 一致的标签才是正式标签,异常历史标签会被忽略并记录。

Tests Gate 使用 SwiftPM 的独立 test product 执行 Platform / Advanced XCTest;P2 与 Media 测试 target 在 iOS Simulator triple 下编译。SwiftPM 当前不能直接从 macOS 主机运行 iOS-simulator XCTest bundle,因此 Simulator 行为由 Xcode Build Gate 和手工/宿主回归覆盖, 不会把 macOS 主机运行结果冒充为 iOS 测试结果。

MediaViewer 的 dynamic background 需要在 status bar / Dynamic Island 后方连续铺满;它的 分页列表使用 edge-to-edge 的 never inset 策略,普通 PTCollectionView 仍保持 automatic。