Kotest

dependencies {
    testImplementation("dev.tracera:tracera-kotest:<version>")
}

Требуются JDK ≥ 17 и Kotest ≥ 6 (см. Адаптеры автотестов). tracera-kotest на Maven Central.

Переменные окружения, режим прогона и повторы: Адаптеры автотестов.

Ключ Env при повторе: KOTEST_RETRY.

Зарегистрируйте расширение в конфиге проекта:

import dev.tracera.TraceraKotestExtension
import io.kotest.core.config.AbstractProjectConfig

class ProjectConfig : AbstractProjectConfig() {
    override fun extensions() = listOf(TraceraKotestExtension())
}

Привязка testCaseId и autotestName

Импортируйте стандартные API Spec Kotest как обычно, а из dev.tracera — Tracera и Id.

В объявлении (предпочтительно — на уровне Spec для FunSpec; на методе @Test для AnnotationSpec):

import dev.tracera.Tracera
import io.kotest.core.spec.style.FunSpec

@Tracera.Id(42, name = "e2e/login")
class LoginSpec : FunSpec({
    test("login") {
        // …
    }
})

Внутри теста:

import dev.tracera.Tracera
import io.kotest.core.spec.style.FunSpec

class LoginSpec : FunSpec({
    test("login") {
        Tracera.testCase(42, "e2e/login")
    }
})

Пропуск

Используйте стандартный skip Kotest (enabled = { … }, Assume.that, …). Skip reason добавляется в результат как comment.

Шаги

Используйте Tracera.step("…") { … }, Tracera.suspendStep("…") { … } для корутин или @Tracera.Step("…") на методе (sync и suspend). Если у @Tracera.Step заголовок пустой или не указан, в отчёт идёт имя метода; плейсхолдеры {0} / {name} в заголовке заполняются из аргументов метода. Хуки на уровне теста попадают в Предусловие / Постусловие; suite-хуки на уровне Spec в отчёт не попадают.

import dev.tracera.Tracera
import io.kotest.core.spec.style.AnnotationSpec

class CheckoutSpec : AnnotationSpec() {
    @Tracera.Step("add {sku}")
    fun addSku(sku: String) {
    }

    @Tracera.Id(10, name = "e2e/checkout")
    @Test
    fun checkout() {
        addSku("SKU-1")
        Tracera.step("pay") { }
    }
}

Комментарии, ошибки и вложения

Комментарии, ошибки и вложения: Адаптеры автотестов.

Tracera.comment("result-level note")
Tracera.error("result-level error text")
Tracera.step("open login") {
    Tracera.comment("landed on login")
}

Параметризованные тесты

В FunSpec для каждой строки данных сделайте отдельный тест: test("ok") { … }, test("sso") { … }. Укажите @Tracera.Id на классе Spec; в необязательном name можно использовать {param_id} — подставится имя этого теста ("ok", "sso"). В AnnotationSpec методы @Test без аргументов, поэтому плейсхолдеры вроде {login} из параметров недоступны: {param_id} — имя метода Kotlin; чтобы в имени были поля строки, вызовите Tracera.testCase внутри теста. Если name не указан, то autotestName принимает значение имени теста Kotest.

import dev.tracera.Tracera
import io.kotest.core.spec.style.FunSpec

@Tracera.Id(42, name = "login as {param_id}")
class LoginSpec : FunSpec({
    for (login in listOf("ok", "sso")) {
        test(login) {
            assert(login.isNotEmpty())
        }
    }
})