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") { /* ... */ }
}