Swift Testing #4: 以串行方式运行测试

发布: (2025年12月5日 GMT+8 06:15)
2 min read
原文: Dev.to

Source: Dev.to

Swift Testing 中的测试执行

在 XCTest 中并发执行测试是可选的,实际上默认是串行执行的。而在 Swift Testing 中,默认是并行执行的。

虽然这并不是最佳实践,但有时需要将测试套件串行执行。很可能是因为被测代码在测试之间共享了某些静态状态。

静态状态导致的问题示例

考虑下面的 State 类:

class State {
    private static var numbers = [1, 2, 3]
    func add(number: Int) {
        State.numbers.append(number)
    }
    func add(numbers: [Int]) {
        State.numbers.append(contentsOf: numbers)
    }
    func removeLastNumber() -> Int? {
        State.numbers.popLast()
    }
    var count: Int {
        State.numbers.count
    }
}

下面的测试很可能会因为共享同一静态状态而失败:

struct StaticTests {
    let state = State()
    @Test
    func test1() {
        state.add(numbers: [4, 5])
        #expect(state.count == 5)
        #expect(state.removeLastNumber() == 5)
    }
    @Test
    func test2() {
        state.add(numbers: [6, 7])
        #expect(state.count == 6)
        #expect(state.removeLastNumber() == 7)
    }
}

串行执行测试

要使其正常工作,需要显式配置测试 Suite,并通过 trait .serialized 指定串行执行。

下面是串行执行的测试示例:

@Suite(.serialized) // 明确定义 Suite 为串行
struct StaticTests {
    let state = State()
    @Test
    func test1() {
        state.add(numbers: [4, 5])
        #expect(state.count == 5)
        #expect(state.removeLastNumber() == 5)
    }
    @Test
    func test2() {
        state.add(numbers: [6, 7])
        #expect(state.count == 6)
        #expect(state.removeLastNumber() == 7)
    }
}

参考文献

  • 视频 “Mastering Swift Testing: Run Serialized Tests with One Line of Code!”(Swift and Tips),这里
  • 播放列表 “Swift Testing”(Swift and Tips),这里
  • Swift Testing 文档,这里
  • “Running tests serially or in parallel” 文档,这里
Back to Blog

相关文章

阅读更多 »