name: ios-testing description: 针对iOS 26和Swift 6.2的诊所模块化MVVM-C应用程序的测试实践。涵盖单元测试、UI测试、快照测试、基于协议的模拟、异步参与者隔离和依赖注入测试架构,与Domain协议、App目标组合和Data拥有的I/O边界对齐。在编写、审查或重构ios-*和swift-*诊所模块的测试时使用。
iOS测试最佳实践
针对iOS和Swift应用程序的全面测试指南,撰写于首席工程师级别。包含8个类别中的44条规则,按影响优先排序,以指导测试架构决策、测试编写模式和CI基础设施。
诊所架构合约(iOS 26 / Swift 6.2)
本技能中的所有指导都假设诊所模块化MVVM-C架构:
- 功能模块仅导入
Domain+DesignSystem(从不导入Data,从不导入同级功能) - App目标是汇聚点,拥有
DependencyContainer、具体协调器和Route Shell接线 Domain保持纯Swift并定义模型以及存储库、*Coordinating、ErrorRouting和AppError合约Data拥有SwiftData/网络/同步/重试/后台I/O并实现Domain协议- 读/写流默认使用陈旧-同时重新验证读取和乐观排队写入
- ViewModels直接调用存储库协议(无默认用例/交互层)
何时应用
在以下情况下参考这些指南:
- 为iOS应用程序编写新的单元测试或UI测试
- 设计具有依赖注入的可测试架构
- 测试async/await、参与者和Combine发布者
- 设置快照测试或视觉回归套件
- 配置CI流水线、测试计划和并行执行
按优先级分类的规则类别
| 优先级 | 类别 | 影响 | 前缀 |
|---|---|---|---|
| 1 | 测试架构与可测试性 | 关键 | arch- |
| 2 | 单元测试基础 | 关键 | unit- |
| 3 | 测试替身与隔离 | 高 | mock- |
| 4 | 异步与并发测试 | 高 | async- |
| 5 | SwiftUI测试 | 中高 | swiftui- |
| 6 | UI与验收测试 | 中 | ui- |
| 7 | 快照与视觉测试 | 中 | snap- |
| 8 | 测试可靠性与CI | 低中 | ci- |
快速参考
1. 测试架构与可测试性(关键)
arch-protocol-dependencies- 依赖于协议,而非具体类型arch-constructor-injection- 使用构造器注入而非服务定位器arch-test-target-separation- 分离单元和UI测试目标arch-testable-import- 谨慎使用@testable导入arch-single-responsibility-tests- 每个测试一个断言概念arch-arrange-act-assert- 将测试结构化为安排-执行-断言
2. 单元测试基础(关键)
unit-swift-testing-framework- 新测试使用Swift Testing而非XCTestunit-parameterized-tests- 使用参数化测试处理输入变体unit-descriptive-test-names- 根据验证的行为命名测试unit-expect-over-assert- 使用#expect和#require而非XCTAssertunit-require-preconditions- 使用#require作为测试前提条件unit-test-suites- 将相关测试组织成套件unit-test-tags- 使用标签对跨领域测试进行分类
3. 测试替身与隔离(高)
mock-protocol-based-mocks- 从协议创建模拟,而非子类mock-spy-for-verification- 使用间谍验证交互mock-stub-return-values- 使用存根作为确定性返回值mock-avoid-over-mocking- 避免模拟值类型和简单逻辑mock-fake-for-integration- 集成测试使用内存伪造mock-dependency-container- 使用依赖容器进行测试配置
4. 异步与并发测试(高)
async-await-directly- 在测试中直接等待异步函数async-confirmation- 使用confirmation()处理基于回调的APIasync-mainactor-isolation- 在主参与者上测试MainActor隔离的代码async-actor-testing- 通过异步接口测试参与者状态async-task-cancellation- 显式测试任务取消路径
5. SwiftUI测试(中高)
swiftui-test-observable-models- 将@Observable模型作为普通对象测试swiftui-environment-injection- 为测试注入环境依赖swiftui-preview-as-test- 使用预览作为视觉冒烟测试swiftui-view-model-extraction- 将逻辑从视图中提取到可测试模型中swiftui-binding-testing- 使用@Bindable测试绑定行为
6. UI与验收测试(中)
ui-accessibility-identifiers- 使用辅助功能标识符进行元素查询ui-page-object-pattern- 将屏幕封装在页面对象中ui-launch-arguments- 通过启动参数配置测试状态ui-wait-for-elements- 等待元素而非使用sleep()ui-test-user-journeys- 测试完整的用户旅程,而非单个屏幕ui-reset-state-between-tests- 在UI测试之间重置应用状态
7. 快照与视觉测试(中)
snap-swift-snapshot-testing- 使用swift-snapshot-testing进行视觉回归snap-device-matrix- 跨设备尺寸和特性进行快照snap-named-references- 使用命名快照参考以提高清晰度snap-inline-snapshots- 使用内联快照进行非图像断言
8. 测试可靠性与CI(低中)
ci-test-plans- 使用Xcode Test Plans进行环境配置ci-parallel-execution- 启用并行测试执行ci-flaky-test-quarantine- 隔离不稳定测试而非禁用它们ci-deterministic-test-data- 使用确定性测试数据而非随机生成ci-coverage-thresholds- 为关键路径设置覆盖率阈值
如何使用
阅读单独的参考文件以获取详细解释和代码示例:
参考文件
| 文件 | 描述 |
|---|---|
| references/_sections.md | 类别定义和排序 |
| assets/templates/_template.md | 新规则模板 |
| metadata.json | 版本和参考信息 |