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));
}