8

我正在使用 NUnit 3.0 和 TestFixtureSource 在具有不同参数/配置的夹具内多次运行测试用例(我确实想在 TestFixture 级别执行此操作)。简单的例子:

[TestFixtureSource(typeof (ConfigurationProvider))]
public class Fixture
{
    public Fixture(Configuration configuration)
    {
        _configuration = configuration;
    }

    private Configuration _configuration;

    [Test]
    public void Test()
    {
        //do something with _configuration
        Assert.Fail();
    }
}

假设 Test() 对其中一种配置失败,而对另一种配置成功。在运行报告文件和 Visual Studio 的测试资源管理器中,失败和成功运行的名称将仅显示为 Test(),它不会告诉我有关哪个设置导致问题的任何信息。

有没有办法在这种情况下影响测试用例的名称(即在每个夹具运行/配置的名称前加上前缀)?作为一种解决方法,我目前正在每个测试用例触发之前打印到结果输出,但我宁愿避免这样做。

由于 NUnit 3.0 处于测试阶段,而且这个功能相当新,我无法在文档中找到任何内容。我找到了 TestCaseData 但我认为它还没有被定制为与夹具一起使用(它是为测试用例设计的)。

4

2 回答 2

3

我找不到更改测试名称的方法,但它不应该是必需的,因为 NUnit3 通过包含测试装置的描述来构造测试名称。

如果和具有这样的实现,则问题中的示例类Fixture可以不变地使用:ConfigurationConfigurationProvider

public class Configuration
{
    public string Description { get; }

    public Configuration(string description)
    {
        Description = description;
    }

    public override string ToString()
    {
        return Description;
    }
}

public class ConfigurationProvider : IEnumerable
{
    public IEnumerator GetEnumerator()
    {
        yield return new Configuration("Foo");
        yield return new Configuration("Bar");
        yield return new Configuration("Baz");
    }
}

“技巧”是确保夹具的构造函数参数是字符串或具有ToString给出夹具合理描述的方法。

如果您在 Visual Studio 中使用 NUnit 3 测试适配器,则测试装置将显示为Fixture(Foo)Fixture(Bar)因此Fixture(Baz)您可以轻松区分它们的测试。nunit3-console.exe 的 xml 输出也使用描述性名称 fx:fullname=MyTests.Fixture(Bar).Test

<test-case id="0-1003" name="Test" fullname="MyTests.Fixture(Bar).Test" methodname="Test" classname="MyTests.Fixture" runstate="Runnable" result="Failed" ... >
    <failure>
        <message><![CDATA[]]></message>
        <stack-trace><![CDATA[at MyTests.Fixture.Test() in ... ]]></stack-trace>
    </failure>
    ...
</test-case>

在 Visual Studio 中使用 NUnit 3 测试适配器

于 2017-02-17T19:43:25.427 回答
0

执行此类操作的一种方法是在源代码中查找和替换标记,并在使用命令行 msbuild执行之前动态构建测试库。高级步骤是

  1. 在源代码中将测试用例名称定义为sometest_TOKEN,然后使用fnr.exe replce _TOKEN 之类的命令行工具,随心所欲。例如sometest_build2145
  2. 使用 msbuild 编译 dll,例如msbuild /t:REbuild mytestproj.sln。此后执行mytestproj.dll中的所有测试用例。
于 2017-02-24T07:04:39.260 回答