XCUITest
在 Package.swift 中为 UI 测试 target 添加 tracera-swift 的 TraceraXCUITest 依赖(会一并引入 Tracera):
dependencies: [
.package(url: "https://github.com/tracera-dev/tracera-swift", from: "0.1.0"),
],
targets: [
.testTarget(
name: "MyAppUITests",
dependencies: [
.product(name: "TraceraXCUITest", package: "tracera-swift"),
]
),
]
需要 Swift ≥ 6、macOS ≥ 15(或 iOS ≥ 18)以及 Xcode ≥ 16(见 自动化测试适配器)。
环境变量与运行模式:自动化测试适配器。
继承 TraceraXCTestCase,并在 class func setUp() 中调用一次 install()(媒体默认关闭 — 见截图):
import XCTest
import Tracera
import TraceraXCUITest
final class CheckoutUITests: TraceraXCTestCase {
override class func setUp() {
install()
}
// …
}
若重写实例 setUp / tearDown(每个测试一次 — 不是 class func setUp),在 setUp 末尾调用 super.setUp(),在 tearDown 开头调用 super.tearDown(),这样步骤会进入 准备 / 测试 / 清理。
绑定 testCaseId 与 autotestName
在每个测试方法开头用 Tracera.testCase 绑定:
func testCheckout() {
Tracera.testCase(42)
// Tracera.testCase(42, "e2e/checkout")
// …
}
若未指定 name,则 autotestName 取 XCTest 的测试名称。若多个方法共用同一用例 id,也可在实例 setUp 中绑定。
跳过
使用 skip("reason"),以便原因写入结果的 comment:
func testCheckout() throws {
Tracera.testCase(42)
try skip("needs a seeded account")
}
步骤
使用 Tracera.step("…") { } 或 await Tracera.step("…") { }。实例 setUp / tearDown 中的步骤进入结果的 准备 / 清理;测试体内的步骤进入 测试。
override func setUp() {
Tracera.step("launch app") { }
super.setUp()
}
func testCheckout() throws {
Tracera.testCase(10)
try Tracera.step("tap checkout") {
try Tracera.step("nested leaf") { }
}
}
override func tearDown() {
super.tearDown()
Tracera.step("terminate app") { }
}
注释、错误与附件
限制与允许的 MIME 类型:自动化测试适配器。
Tracera.comment、Tracera.error 和附件会添加到当前打开的步骤;若没有打开的步骤,则添加到结果。Tracera.attachmentFile 接收文件路径;Tracera.attachmentBytes 接收名称和字节(MIME 类型可选)。附件在结果上报时上传。
Tracera.comment("result-level note")
Tracera.error("result-level error")
Tracera.attachmentFile("Fixtures/screenshot.png")
Tracera.step("open login") {
Tracera.comment("step note")
Tracera.attachmentBytes("body.json", data: Data(#"{"ok":true}"#.utf8), mimeType: "application/json")
}
若在 Task 中调用 Tracera API(步骤、注释、错误、附件),请先在测试中调用 getContext(),再用 runWithContext 运行 worker — 否则这些调用不会写入报告:
let ctx = getContext()
Task {
await runWithContext(ctx) {
Tracera.step("worker") { /* ... */ }
}
}
参数化测试
使用字面量 Tracera.testCase(id, name)(或省略 name → XCTest 测试名)。
截图与媒体
install() 是上报所必需的(见上文)。通过其参数可在每个测试结束时附加媒体(默认 .off):screenshots: — .onFailure / .onSuccess / .always(iOS/tvOS:XCUIScreen;macOS:在允许屏幕录制时使用 ScreenCaptureKit);hierarchy: → window-hierarchy.txt;logs: → device-log.txt(unified log / OSLogStore)。
override class func setUp() {
install(screenshots: .onFailure, hierarchy: .onFailure, logs: .onFailure)
}
若要在选定时刻附加截图、层级或日志(例如点击之后),请手动调用:
Tracera.step("after login") {
screenshot()
attachHierarchy()
attachDeviceLog()
}