NUnit

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

需要 .NET ≥ 8 和 NUnit ≥ 4(见 自动化测试适配器)。Tracera.NUnit on NuGet。

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

重试 Env 键:NUNIT_RETRY。

推荐在程序集上启用,以便套件结束后适配器能结束它创建的运行。仅标在测试类上仍会上传结果,但结束运行可能要等到进程退出:

[assembly: TraceraNUnit]

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

绑定 testCaseId 与 autotestName

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

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

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

使用 NUnit 自带的 skip(Assert.Ignore、Assert.Inconclusive、[Ignore] 等)。Skip 原因会作为 comment 添加到结果。

步骤

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

参数化测试

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