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)
}
}