NUnit

<PackageReference Include="Tracera.NUnit" Version="*" />

Требуются .NET ≥ 8 и NUnit ≥ 4 (см. Адаптеры автотестов). Tracera.NUnit на NuGet.

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

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

Предпочтительнее атрибут сборки — так адаптер завершит созданный им прогон, когда автотесты закончатся. Атрибут только на классе тестов всё равно отправляет результаты, но завершение прогона может отложиться до выхода процесса:

[assembly: TraceraNUnit]

[TraceraNUnit] // optional on a test class when the assembly attribute is present
public class LoginTests
{
    // …
}

Привязка testCaseId и autotestName

Используйте стандартные API NUnit как обычно и глобальный тип Tracera.

В объявлении (предпочтительно — привязка сработает, даже если тест сразу уйдёт в skip):

using NUnit.Framework;

[assembly: TraceraNUnit]

public class LoginTests
{
    [Test]
    [Tracera.Id(42, name: "e2e/login")]
    public void Login()
    {
        Assert.That(true);
    }
}

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

[Test]
public void Login()
{
    Tracera.TestCase(42, "e2e/login");
    Assert.That(true);
}

Skip

Используйте стандартный skip NUnit (Assert.Ignore, Assert.Inconclusive, [Ignore], …). Причина skip добавляется в результат как comment.

Шаги

Используйте Tracera.Step("…", () => { … }), Tracera.Step("…", async () => { … }) (адаптер ждёт завершения async-лямбды), или укажите [Tracera.Step("…")] на методе (sync и async Task). Если у [Tracera.Step] заголовок пустой или не указан, в отчёт идёт имя метода; плейсхолдеры {0} / {name} в заголовке заполняются из аргументов метода. Шаги внутри [SetUp] / [TearDown] попадают в секции результата Предусловие / Постусловие; шаги внутри теста — в Тест. Шаги [OneTimeSetUp] / [OneTimeTearDown] в отчёт не попадают; если OneTimeSetUp падает, декларативно привязанные тесты всё равно уходят как Failed (пустые шаги, ошибка setup на результате).

using NUnit.Framework;

[assembly: TraceraNUnit]

public class CheckoutTests
{
    [SetUp]
    public void OpenShop()
    {
        Tracera.Step("open shop", () => { });
    }

    [Tracera.Step("add {sku}")]
    public void AddSku(string sku) { }

    [Test]
    [Tracera.Id(10, name: "e2e/checkout")]
    public void 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");
});

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

Укажите [Tracera.Id] на каждом методе с [TestCase] / [TestCaseSource] (один id на все строки или Tracera.TestCase внутри, если id разный). В необязательном name можно использовать плейсхолдеры: {login} (и другие имена аргументов) из параметров метода, либо {param_id} — имя теста в NUnit (в примере ниже — Login("ok") / Login("sso")). Если name не указан, то autotestName принимает значение имени теста в NUnit.

[Tracera.Id(42, name: "login as {login}")]
[TestCase("ok")]
[TestCase("sso")]
public void Login(string login)
{
    Assert.That(login, Is.Not.Empty);
}