进行 iOS 开发时,你可能总想着“得写点测试代码了……”,却一拖再拖。真正打开 XCTest 后,又不知道该从哪里下手。
先说结论:第一个测试从 Given-When-Then 三行开始就够了。准备、执行、验证。熟悉这个顺序后,其他内容自然会跟上。
今天我们会一起掌握 XCTest 基础,并用这个模式真正写出第一个测试。
XCTest 到底是什么?
XCTest 是 Apple 默认集成在 Xcode 中的测试框架。不需要单独安装,直接就能使用。
创建项目时,只要勾选“Include Tests”,测试 target 就会自动生成。
先说重点。
- XCTestCase:用于存放测试的类。继承它即可开始。
- 以 test 开头的方法:如果函数名以 test 开头,Xcode 会自动将其识别为测试。
- XCTAssert 系列:用于验证结果是否正确的函数。
刚开始时,只了解这三项就足够了。
运行测试很简单。点击测试方法左侧的菱形按钮,或按下 Command + U,即可运行全部测试。
Given-When-Then 是什么?
测试初学者最容易困惑的地方是:“所以代码到底该按什么顺序写?”
Given-When-Then 正是用来规定这个顺序的模式。把它分成三个部分来思考即可。
- Given(准备):创建测试所需的值和状态
- When(执行):只执行一次想要验证的行为
- Then(验证):确认结果是否符合预期
换成日常语言就是:“购物车里有 2 个苹果时(Given),计算支付金额(When),结果应该是 2000 韩元(Then)。”
准备、执行、验证。这三个步骤就是 Given-When-Then 的全部。
这样拆分之后,测试日后失败时,马上就能看出问题在哪个阶段。一眼即可判断是准备有误,还是执行结果不正确。
真正写出第一个测试
我们以一个简单的计算器为例。假设有一个用于计算两个数之和的 add 函数。
首先,这是要测试的目标代码。
struct Calculator {
func add(_ a: Int, _ b: Int) -> Int {
return a + b
}
}
现在按照 Given-When-Then 的顺序编写测试。用注释标出三个阶段,会更容易阅读。
func testAddTwoNumbers() {
// Given: 准备计算器和输入值
let calculator = Calculator()
// When: 执行加法
let result = calculator.add(2, 3)
// Then: 验证结果
XCTAssertEqual(result, 5)
}
XCTAssertEqual 用于比较两个值是否相等。如果 result 不是 5,测试会以红色失败;如果是 5,就会以绿色通过。
我至今还记得第一次亮起绿灯时的感觉。明明没什么大不了,却莫名让人很有成就感。
常用 XCTAssert 总结
只知道 XCTAssertEqual 也能开始,但根据场景选择合适的断言,会让代码整洁得多。我把常用的整理成了表格。
| 函数 | 使用时机 |
|---|---|
| XCTAssertEqual(a, b) | 两个值是否相等 |
| XCTAssertTrue(条件) | 条件是否为真 |
| XCTAssertFalse(条件) | 条件是否为假 |
| XCTAssertNil(值) | 值是否为 nil |
| XCTAssertNotNil(值) | 值是否不为 nil |
如果想在失败时留下消息,只需将字符串作为最后一个参数传入。例如:XCTAssertEqual(result, 5, “加法结果不正确”)。
初学者常见问题
问:测试文件应该放在哪里? 答:放在项目的 Tests 文件夹中即可。要运行测试,文件必须包含在测试 target 中。
问:When 必须只有一行吗? 答:不必。不过,最好只执行一个要验证的行为。一个测试只验证一件事,失败原因才会清晰。
问:测试函数应该如何命名? 答:以 test 开头,并让名称体现验证内容,例如 testAddTwoNumbers。
今天我们用 XCTest 基础和 Given-When-Then 模式写出了第一个测试。准备、执行、验证。记住这三个步骤就够了。
不要给自己写完美测试的压力,今天先让一个 add 函数亮起绿灯吧。这个小小的成功会带来下一个测试。加油!

