两个测试框架
苹果测试有两套:老牌 XCTest 用类加方法写测试;新的 Swift Testing 用函数加宏,写法更贴近 Swift 现代风格。老项目多半还是 XCTest,新项目可以直接上 Swift Testing。两者底层都跑在同一个测试引擎上,结果都能在 Xcode 里看到,不必纠结迁移时机,挑顺手的用就行。
Swift Testing 不是重写一切,而是让新测试写得更省力。
这篇把两套都过一遍。
XCTest 基础
XCTest 继承 XCTestCase,每个测试是一个方法,用 XCTAssert 断言。
func testTotal() {
let cart = Cart()
cart.add(price: 10)
XCTAssertEqual(cart.total, 10)
}
这是大家最熟的写法。类里写一堆 test 开头的方法,断言写在方法里,跑测试时框架逐个调用。
Swift Testing 新写法
Swift Testing 用 @Test 标一个函数,断言直接写 expect,不用建类。函数名本身就是测试名,读起来像一句自然语言描述。
两套对比速查
- XCTest类加方法,断言 XCTAssert。
- Swift Testing函数加宏 @Test,断言 expect。
- 参数化Swift Testing 一行遍历多组数据。
参数化测试
同一逻辑多组输入,Swift Testing 直接把参数列进去,自动跑每一组,不用复制粘贴多个方法。一组失败了它会告诉你是哪组数据出的问题,定位特别快。以前要写好几个长得差不多的测试方法,现在一个函数加几行数据就全搞定。
异步测试
测异步代码,Swift Testing 直接支持 await,expect 也能等异步结果,不用 XCTest 那套 expectation 手忙脚乱。
迁移与共存
两套框架可以共存,不必一次性迁移。新测试用 Swift Testing 写,老 XCTest 慢慢改。
- 新项目直接上 Swift Testing。
- 多组数据用参数化别复制。
- 异步测试 await 更省心。
- 两套可共存,不必一次性迁完。
实战:测一个价格计算
折扣后价格,参数化跑几组。
@Test("折扣价", arguments: [
(100, 0.8, 80),
(200, 0.5, 100)
])
func discount(p: Double, r: Double, out: Double) {
expect(discounted(p, r) == out)
}
一套输入一条 expect,覆盖率上去了、代码反而更少。测试做到这份上,重构也有底气。等到哪天产品改了折扣规则,你只要改测试里的那几行数据,就能一次性验证新旧两种算法国,既快又稳。