测试
SwiftPM 与 XCTest,Apple 的单元测试框架 集成。从终端运行 swift test
,或在您的 IDE(Xcode 或类似工具)中触发测试操作,将运行您的所有 XCTest 测试用例。测试结果将显示在您的 IDE 中或打印到终端。
在 Linux 上进行测试的一种便捷方法是使用 Docker。例如
$ docker run -v "$PWD:/code" -w /code swift:latest swift test
以上命令将使用最新的 Swift Docker 镜像运行测试,利用绑定挂载将源代码连接到您的文件系统。
Swift 支持特定于架构的代码。默认情况下,Foundation 导入特定于架构的库,如 Darwin 或 Glibc。在 macOS 上开发时,您最终可能会使用在 Linux 上不可用的 API。由于您很可能在 Linux 上部署云服务,因此在 Linux 上进行测试至关重要。
关于 Linux 测试的一个历史上重要的细节是 Tests/LinuxMain.swift
文件。
- 在 Swift 5.4 及更高版本中,测试在所有平台上自动发现,无需特殊文件或标志。
- 在 Swift 版本 >= 5.1 < 5.4 中,可以使用
swift test --enable-test-discovery
标志在 Linux 上自动发现测试。 - 在低于 5.1 的 Swift 版本中,
Tests/LinuxMain.swift
文件为 SwiftPM 提供了它需要在 Linux 上运行的所有测试的索引,并且在您添加更多单元测试时,保持此文件更新至关重要。要重新生成此文件,请在添加测试后运行swift test --generate-linuxmain
。将此命令包含在您的持续集成设置中也是一个好主意。
生产环境测试
-
对于 Swift 5.1 到 5.4 之间的版本,始终使用
--enable-test-discovery
进行测试,以避免遗忘在 Linux 上的测试。 - 利用 sanitizers。在生产环境中运行代码之前,最好作为 CI 流程的常规部分,执行以下操作
- 使用 TSan(线程清理器)运行您的测试套件:
swift test --sanitize=thread
- 使用 ASan(地址清理器)运行您的测试套件:
swift test --sanitize=address
和swift test --sanitize=address -c release -Xswiftc -enable-testing
- 使用 TSan(线程清理器)运行您的测试套件:
- 通常,在测试时,您可能希望使用
swift build --sanitize=thread
进行构建。生成的二进制文件运行速度较慢,不适合生产环境,但您或许能够尽早发现线程问题 - 在您部署软件之前。通常,线程问题非常难以调试和重现,并且还会导致随机问题。TSan 有助于及早发现这些问题。