测试与代码质量

XCTest 基础:用 Given-When-Then 编写第一个测试(初学者指南)

进行 iOS 开发时,你可能总想着“得写点测试代码了……”,却一拖再拖。真正打开 XCTest 后,又不知道该从哪里下手。

3 分钟阅读
XCTest 基础:用 Given-When-Then 编写第一个测试(初学者指南) 封面图

进行 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, “加法结果不正确”)。

只选择常用的 XCTAssert,代码就会整洁得多
只选择常用的 XCTAssert,代码就会整洁得多

初学者常见问题

问:测试文件应该放在哪里? 答:放在项目的 Tests 文件夹中即可。要运行测试,文件必须包含在测试 target 中。

问:When 必须只有一行吗? 答:不必。不过,最好只执行一个要验证的行为。一个测试只验证一件事,失败原因才会清晰。

问:测试函数应该如何命名? 答:以 test 开头,并让名称体现验证内容,例如 testAddTwoNumbers。


今天我们用 XCTest 基础和 Given-When-Then 模式写出了第一个测试。准备、执行、验证。记住这三个步骤就够了。

不要给自己写完美测试的压力,今天先让一个 add 函数亮起绿灯吧。这个小小的成功会带来下一个测试。加油!