xUnit
<PackageReference Include="Tracera.Xunit" Version="*" />
Требуются .NET ≥ 8 и xUnit.net v3 (см. Адаптеры автотестов). Tracera.Xunit на NuGet.
Переменные окружения и режим прогона: Адаптеры автотестов.
Зарегистрируйте адаптер один раз на тестовую сборку:
[assembly: TraceraXunit]
[assembly: TestPipelineStartup(typeof(TraceraXunitStartup))]
Привязка testCaseId и autotestName
Используйте стандартные API xUnit как обычно и глобальный тип Tracera.
В объявлении (предпочтительно — привязка сработает, даже если тест сразу уйдёт в skip):
using Xunit;
public class LoginTests
{
[Fact]
[Tracera.Id(42, name: "e2e/login")]
public void Login()
{
Assert.True(true);
}
}
Внутри теста:
[Fact]
public void Login()
{
Tracera.TestCase(42, "e2e/login");
Assert.True(true);
}
Skip
Используйте стандартный skip xUnit (Assert.Skip, [Fact(Skip = "…")], …). Причина skip добавляется в результат как comment.
Шаги
Используйте Tracera.Step("…", () => { … }), Tracera.Step("…", async () => { … }) (адаптер ждёт завершения async-лямбды), или укажите [Tracera.Step("…")] на методе (sync и async Task). Если у [Tracera.Step] заголовок пустой или не указан, в отчёт идёт имя метода; плейсхолдеры {0} / {name} в заголовке заполняются из аргументов метода. Конструктор и IAsyncLifetime.InitializeAsync попадают в Setup; IDisposable / IAsyncDisposable — в Teardown; тело теста — в Test. Если IClassFixture / конструктор / InitializeAsync падает до тела теста, декларативно привязанные тесты всё равно уходят в отчёт как Failed (пустые шаги, ошибка фикстуры на результате).
using Xunit;
public class CheckoutTests
{
[Tracera.Step("add {sku}")]
public void AddSku(string sku) { }
[Fact]
[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] на каждом методе с [Theory] (один id на все строки или Tracera.TestCase внутри, если id разный). В необязательном name можно использовать плейсхолдеры: {login} (и другие имена аргументов) из параметров метода, либо {param_id} — имя теста в xUnit. Если name не указан, то autotestName принимает значение имени теста в xUnit.
[Tracera.Id(42, name: "login as {login}")]
[Theory]
[InlineData("ok")]
[InlineData("sso")]
public void Login(string login)
{
Assert.False(string.IsNullOrEmpty(login));
}