跳转到正文
YGJoon 技术博客

XCTest 异步业务回归:规则边界与并发时序控制

发布于:
·731 字 · 约 2 分钟·作者:
从纯规则测试、注入式依赖和可控并发时序出发,构建稳定的移动端业务回归检查体系。
XCTest 异步业务回归:规则边界与并发时序控制文章封面
目录

示例代码均为匿名化改写,用于说明模式;测试通过注入依赖来避免真实网络和账号。

先看测试覆盖什么边界

一个成熟的移动客户端通常既有纯规则测试,也有依赖替身驱动的 ViewModel 测试。前者适合验证定位阈值、状态到动作映射、输入限制和参数编码;后者可以模拟网络成功、失败、账号变化及用户重复点击。

网络客户端可用 URLProtocol 或等价替身检查请求参数、头部和 HTTP 错误。避免在单元测试中依赖真实账号、网络和第三方支付 SDK,能让失败原因更集中。

import XCTest

struct RequestGate {
    private(set) var currentID = UUID()

    mutating func begin() -> UUID {
        currentID = UUID()
        return currentID
    }

    func canApply(responseFor requestID: UUID) -> Bool {
        requestID == currentID
    }
}

final class RequestGateTests: XCTestCase {
    func testOlderResponseIsRejectedAfterNewRequestStarts() {
        var gate = RequestGate()
        let oldRequest = gate.currentID
        let newRequest = gate.begin()

        XCTAssertFalse(gate.canApply(responseFor: oldRequest))
        XCTAssertTrue(gate.canApply(responseFor: newRequest))
    }
}

主动控制异步先后

详情页并发请求可通过 actor、continuation 或测试门闩挂起旧请求:先让新请求完成,再放行旧响应,并断言旧数据没有覆盖当前状态。这种测试能稳定复现手动点测很难抓到的时序问题。

支付恢复和账号切换也适合做顺序测试:先记录待处理事项,再模拟回跳、前后台切换和换账号,确保只有当前账号的权威服务端结果才能清理记录。

用可控网络替身明确放行顺序,比依赖 sleep 更稳定;测试可以先完成新请求,再放行旧响应,直接验证过期结果会被丢弃。

让失败报告能读懂

把许多断言塞进一个泛化测试方法,会降低失败报告的定位价值。按输入条件、状态转移和错误路径拆分测试,让测试名称说明业务合同。

建议覆盖:

测试数量本身不能证明覆盖质量;需要结合关键副作用、失败路径和并发顺序逐项审查。

涉及 Keychain 的单元测试应注入内存替身,避免依赖开发机或 CI 的钥匙串状态。异步等待时限也要为较慢的 runner 留出余量,并让失败名称指向具体业务合同。


分享这篇文章:


相关文章

上一篇
Swift actor 网络客户端设计:共享上下文隔离与请求取消
下一篇
iOS 工程架构审查:模块边界、安全风险与发布检查