Nunit3如何基于从TestFixtureSource传递的参数更改testcase名称

Nunit3如何基于从TestFixtureSource传递的参数更改testcase名称,nunit,nunit-3.0,Nunit,Nunit 3.0,我正在使用NUnit 3.0和TestFixtureSource在一个装置内使用不同的参数/配置多次运行测试用例(我确实希望在TestFixture级别这样做)。简单的例子: [TestFixtureSource(typeof (ConfigurationProvider))] public class Fixture { public Fixture(Configuration configuration) { _configuration = configur

我正在使用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()失败,另一个配置的Test()成功。在运行报告文件和Visual Studio的测试资源管理器中,失败和成功运行的名称都将显示为just Test(),这不会告诉我是哪个安装程序导致了问题

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


由于NUnit 3.0处于测试阶段,而且这个功能相当新,所以我在文档中找不到任何东西。我找到了TestCaseData,但我不认为它是专门为fixture设计的(它是为测试用例设计的)。

我找不到更改testname的方法,但它应该不是必需的,因为NUnit3通过包含testfixture的描述来构造testname

如果
Configuration
ConfigurationProvider
具有如下实现,则问题中的示例类
Fixture
可以原封不动地使用:

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");
    }
}
“诀窍”是确保fixture的构造函数参数是一个字符串,或者有一个
ToString
-方法,该方法给出了fixture的合理描述

如果您在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>

...

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

  • 在源代码中将测试用例名称定义为sometest\u标记,然后使用命令行工具(如replce\u标记)和您喜欢的任何东西。例如,sometest_build2145
  • 使用msbuild编译dll,例如msbuild/t:REbuild mytestproj.sln。然后在mytestproj.dll中执行所有测试用例