xUnit

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

需要 .NET ≥ 8 和 xUnit.net v3(见 自动化测试适配器)。Tracera.Xunit on NuGet。

环境变量与运行模式:自动化测试适配器。

在每个测试程序集注册一次适配器:

[assembly: TraceraXunit]
[assembly: TestPipelineStartup(typeof(TraceraXunitStartup))]

绑定 testCaseId 与 autotestName

照常使用 xUnit 标准 API,以及全局类型 Tracera。

在声明时(推荐 — 即使测试体提前跳过也会绑定):

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

使用 xUnit 自带的 skip(Assert.Skip、[Fact(Skip = "…")] 等)。Skip 原因会作为 comment 添加到结果。

步骤

使用 Tracera.Step("…", () => { … })、Tracera.Step("…", async () => { … })(会等待 async 回调完成),或在方法上加 [Tracera.Step("…")](同步与 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");
});

参数化测试

在每个 [Theory] 方法上放 [Tracera.Id](所有行共用同一 id,或在测试内调用 Tracera.TestCase 以按行变化)。可选 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));
}