Swift Testing
Добавьте SPM-пакет и зависимость на TraceraTesting:
.package(url: "https://github.com/tracera-dev/tracera-swift.git", from: "0.1.0"),
// …
.product(name: "TraceraTesting", package: "tracera-swift"),
Требуется Swift ≥ 6 (macOS 15 / Xcode 16; см. Адаптеры автотестов).
Переменные окружения и режим прогона: Адаптеры автотестов.
Привязка testCaseId и autotestName
Предпочтительна декларативная привязка:
@Test("checkout", .traceraId(42))
func checkout() {
// …
}
@Test("login as {user}", .traceraId(42), arguments: ["alice", "bob"])
func login(user: String) {
// …
}
Когда id не является константой времени компиляции, откройте pin через .tracera и привяжите императивно:
@Test("checkout", .tracera)
func checkout() {
Tracera.testCase(42)
// Tracera.testCase(42, "e2e/checkout")
}
Пропуск
Используйте skip("reason"), чтобы причина попала в результат как comment:
@Test("checkout", .traceraId(42))
func checkout() throws {
try skip("needs a seeded account")
}
Шаги
Используйте Tracera.step("…") { … } (sync или async). Шаги внутри setup / teardown идут в Предусловия / Постусловия; остальные — в Тест.
@Test("checkout", .traceraId(10))
func checkout() throws {
try setup("open shop") {}
try Tracera.step("add item") {
Tracera.step("nested leaf") {}
}
try teardown("close shop") {}
}
Комментарии, ошибки и вложения
Лимиты и допустимые 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 и вызываете в нём API Tracera (шаги, комментарии, ошибки, вложения), сначала вызовите getContext() в тесте и запустите воркер через runWithContext — иначе эти вызовы в отчёт не попадут:
let ctx = getContext()
Task {
await runWithContext(ctx) {
Tracera.step("worker") { /* ... */ }
}
}
Параметризация
Каждая строка arguments — отдельный кейс. Поставьте плейсхолдеры вроде {user} или {0} в заголовок @Test("…") или в name: у .traceraId, чтобы у каждой строки был свой autotestName:
@Test("login as {user}", .traceraId(7), arguments: ["alice", "bob"])
func login(user: String) {
Tracera.step("sign in") { /* ... */ }
}