0Pricing
Swift Academy · 课时

XCTestCase 设置、清理与测试方法

使用 setUp/tearDown 组织测试类,并为测试方法命名。

XCTestCase 设置、清理与测试方法 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。

XCTestCase 基础

XCTestCase 是所有 Swift 单元测试的基类。每个以测试前缀开头的方法都是一个测试用例。

import XCTest

final class MathTests: XCTestCase {
  func testAddition() {
    XCTAssertEqual(2 + 2, 4)
  }
}

setUp 和 tearDown

setUp() 在每个测试之前运行。tearDown() 在每个测试之后运行。请使用它们初始化共享状态并执行清理。

final class UserServiceTests: XCTestCase {
  var sut: UserService!
  override func setUp() {
    super.setUp()
    sut = UserService()
  }
  override func tearDown() {
    sut = nil
    super.tearDown()
  }
}

setUpWithError 和 tearDownWithError

setUp/tearDown 的可抛出错误版本:如果设置过程抛出错误,测试会自动标记为失败。

override func setUpWithError() throws {
  sut = try UserService(config: loadTestConfig())
}
override func tearDownWithError() throws {
  try sut.cleanup()
}

类级别设置

class setUp() 和 class tearDown() 会在该类中的所有测试之前或之后各运行一次,适合用于开销较大的共享资源。

final class DBTests: XCTestCase {
  static var db: TestDatabase!
  override class func setUp() {
    super.setUp()
    db = TestDatabase.inMemory()
  }
  override class func tearDown() {
    db.close()
    super.tearDown()
  }
}

命名测试方法

请将测试命名为 test_methodName_condition_expectedResult,以提高可读性并生成清晰的失败消息。

func test_login_withValidCredentials_returnsUser() throws { ... }
func test_login_withInvalidPassword_throwsUnauthorized() throws { ... }

addTeardownBlock

直接以内联方式注册每个测试专用的清理代码块,无需重写 tearDown。

func testCreateFile() throws {
  let url = FileManager.default.temporaryDirectory.appendingPathComponent("test.txt")
  addTeardownBlock { try? FileManager.default.removeItem(at: url) }
  // ... test
}

禁用测试

在测试方法前加上 _,或将其注释掉,即可跳过该测试。XCTest 还支持使用 XCTSkipIf 跳过测试。

func testExperimentalFeature() throws {
  try XCTSkipIf(ProcessInfo.processInfo.environment["CI"] != nil, "Skip on CI")
  // ... test
}

测试方法不能抛出错误(Xcode 16 之前)

在较早版本的 Xcode 中,声明为 throws 的测试方法会通过 XCTAssertNoThrow 将错误作为测试失败传播出来。

func testDecode() throws {
  let user = try JSONDecoder().decode(User.self, from: validJSON)
  XCTAssertEqual(user.name, "Alice")
}

显式使测试失败

调用 XCTFail("reason"),即可通过描述性消息强制测试失败。

func testCallback() {
  var called = false
  service.doWork { called = true }
  if !called { XCTFail("Callback was never invoked") }
}

测试计划

Xcode 测试计划允许您使用不同配置(语言、环境变量、检测器)运行相同的测试。

// File → New → Test Plan
// Add test targets and configure per-configuration env vars
// Useful for running localized UI tests or with Address Sanitizer

并行测试

在 Xcode 方案设置中启用并行测试,即可并发运行测试类并缩短测试总耗时。

// Product → Scheme → Test → Options → Execute in parallel
// Each XCTestCase class runs in a separate process
// Ensure tests are independent and don't share global state

快速检查

哪个 XCTestCase 方法会在该类中的所有测试之前运行一次,而不是在每个单独的测试之前运行?

课程回顾

重写 setUp/tearDown(或其可抛出错误的版本),以执行每个测试的设置和清理。使用 class setUp/tearDown 管理每个类只需初始化一次的资源。为测试命名时应清楚描述其用途。使用 addTeardownBlock 执行内联清理,并使用 XCTSkipIf 进行条件跳过。

常见问题解答

「XCTestCase 设置、清理与测试方法」课时是免费的吗?

是的 — 「XCTestCase 设置、清理与测试方法」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。

「XCTestCase 设置、清理与测试方法」这节课中我会学到什么?

使用 setUp/tearDown 组织测试类,并为测试方法命名。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Swift Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「XCTestCase 设置、清理与测试方法」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Swift Academy 课中编写并运行代码吗?

能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. XCTestCase 设置、清理与测试方法
  2. XCTAssert 系列与抛出断言
  3. 基于协议的模拟与依赖注入
  4. 异步测试与性能测量
← 返回 Swift Academy