ios-testing

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

iOS Testing Skill

iOS测试技能

Build reliable iOS apps with comprehensive testing
通过全面测试构建可靠的iOS应用

Learning Objectives

学习目标

By completing this skill, you will:
  • Write effective unit tests with XCTest
  • Create reliable UI tests
  • Implement proper mocking strategies
  • Debug efficiently with Instruments
  • Achieve high code coverage
完成本技能学习后,你将能够:
  • 使用XCTest编写高效的单元测试
  • 创建可靠的UI测试
  • 实施恰当的Mocking策略
  • 借助Instruments高效调试
  • 实现高代码覆盖率

Prerequisites

前置要求

RequirementLevel
iOS FundamentalsCompleted
SwiftIntermediate
MVVM patternBasic
要求水平
iOS基础已掌握
Swift中级
MVVM模式基础

Curriculum

课程大纲

Module 1: XCTest Fundamentals (4 hours)

模块1:XCTest基础(4小时)

Topics:
  • XCTestCase structure
  • Assertions library
  • Test lifecycle (setUp/tearDown)
  • Async testing
Code Example:
swift
final class UserViewModelTests: XCTestCase {
    private var sut: UserViewModel!
    private var mockService: MockUserService!

    override func setUp() {
        super.setUp()
        mockService = MockUserService()
        sut = UserViewModel(service: mockService)
    }

    func test_loadUser_success() async {
        mockService.result = .success(.mock())

        await sut.loadUser(id: "123")

        XCTAssertNotNil(sut.user)
        XCTAssertFalse(sut.isLoading)
    }
}
主题:
  • XCTestCase结构
  • 断言库
  • 测试生命周期(setUp/tearDown)
  • 异步测试
代码示例:
swift
final class UserViewModelTests: XCTestCase {
    private var sut: UserViewModel!
    private var mockService: MockUserService!

    override func setUp() {
        super.setUp()
        mockService = MockUserService()
        sut = UserViewModel(service: mockService)
    }

    func test_loadUser_success() async {
        mockService.result = .success(.mock())

        await sut.loadUser(id: "123")

        XCTAssertNotNil(sut.user)
        XCTAssertFalse(sut.isLoading)
    }
}

Module 2: Mocking & Test Doubles (4 hours)

模块2:Mocking与测试替身(4小时)

Topics:
  • Protocol-based mocking
  • Spy, stub, fake patterns
  • Dependency injection for testing
  • Fixtures and factories
主题:
  • 基于协议的Mocking
  • Spy、Stub、Fake模式
  • 用于测试的依赖注入
  • 测试数据与工厂

Module 3: UI Testing (5 hours)

模块3:UI测试(5小时)

Topics:
  • XCUIApplication setup
  • Element queries
  • Accessibility identifiers
  • Page Object pattern
  • Handling flaky tests
主题:
  • XCUIApplication配置
  • 元素查询
  • 可访问性标识符
  • 页面对象模式
  • 处理不稳定测试

Module 4: Debugging (4 hours)

模块4:调试(4小时)

Topics:
  • LLDB commands
  • Breakpoints (symbolic, conditional)
  • View Debugger
  • Memory Graph Debugger
主题:
  • LLDB命令
  • 断点(符号断点、条件断点)
  • 视图调试器
  • 内存图调试器

Module 5: Performance Testing (3 hours)

模块5:性能测试(3小时)

Topics:
  • XCTMetric usage
  • Time Profiler
  • Allocations instrument
  • Leaks detection
主题:
  • XCTMetric使用
  • 时间分析器
  • 分配工具
  • 内存泄漏检测

Module 6: CI Integration (3 hours)

模块6:CI集成(3小时)

Topics:
  • Xcode Cloud setup
  • GitHub Actions
  • Code coverage reports
  • Test parallelization
主题:
  • Xcode Cloud配置
  • GitHub Actions
  • 代码覆盖率报告
  • 测试并行化

Assessment Criteria

评估标准

CriteriaWeight
Unit test quality30%
Mock implementation20%
UI test reliability25%
Debugging skills15%
CI integration10%
标准权重
单元测试质量30%
Mock实现20%
UI测试可靠性25%
调试技能15%
CI集成10%

Coverage Targets

覆盖率目标

ComponentTarget
ViewModels90%+
Services85%+
Utils95%+
Views70%+
组件目标
ViewModels90%+
Services85%+
Utils95%+
Views70%+

Common Mistakes

常见误区

  1. Testing implementation → Test behavior instead
  2. Flaky UI tests → Use waitForExistence
  3. Missing tearDown → Clean up resources
  4. Slow tests → Use mocks, avoid network
  1. 测试实现细节 → 应测试行为而非实现
  2. 不稳定的UI测试 → 使用waitForExistence
  3. 缺少tearDown → 清理资源
  4. 缓慢的测试 → 使用Mock,避免网络请求

Skill Validation

技能验证

  1. Test Suite: 80% coverage on sample project
  2. Mock Library: Reusable mock implementations
  3. UI Test Flow: End-to-end login flow
  4. Performance Baseline: Measure scroll performance
  1. 测试套件:示例项目达到80%覆盖率
  2. Mock库:可复用的Mock实现
  3. UI测试流程:端到端登录流程
  4. 性能基准:测量滚动性能