更改NUnit测试的名称

shy*_*kov 3 .net c# nunit unit-testing

我希望我的基于基于NUnit框架的单元测试在Visual Studio测试资源管理器中更具可读性。

例如,最好使用类似的东西(通过从属性中分配值)代替Test_Case_1TestCase1拥有,但方法名称中不允许使用空格和字符。Test Case #1, Category: First, Category: Second[Category]

我知道它在中可能是开箱即用的xUnit,但是我不能涉及它,因为我正在使用无法使用xUnit框架实现的自定义项。

是否可以用重写单元测试的显示名称NUnit?到目前为止,我可以看到,该FullName字段TestDetail具有私有设置程序。

是否有其他方法或方法更改NUnit测试的显示名称?

for*_*rir 5

如果使用参数化测试,则支持此功能,可以TestName在添加TestCase属性时指定。

如果您没有使用TestCase,那么您可以将其用作不太理想的解决方案,以实现您想要的工作。因此,您可以这样声明测试:

[TestCase(null,TestName="Test Case #1, Category: First, Category: Second")]
public void TestCase(object ignored)
Run Code Online (Sandbox Code Playgroud)

这是不理想的,因为它不是编程的,因此您必须手动输入测试名称,而不是根据测试方法的属性生成它。您还必须将参数传递给方法,这就是ignored和的含义null。当然,您可以开始使用参数化测试,在这种情况下,您需要将实际值传递给测试。

[TestCase(5,TestName="Test Case #1, Category: First, Category: Second")]
public void TestCase(int someInput) {
    Assert.AreEqual(5, someInput);
}
Run Code Online (Sandbox Code Playgroud)


Tre*_*ess 5

您可以创建自己的 Name 属性:

// I used the same namespace for convenience
namespace NUnit.Framework
{
    public class NameAttribute  : NUnitAttribute, IApplyToTest
    {
        public NameAttribute(string name)
        {
            Name = name;
        }

        public string Name { get; set; }

        public void ApplyToTest(Test test)
        {
            test.Properties.Add("Name", Name);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以像使用常规 NUnit 属性一样使用它(就像类别和描述一样)。

[Test, Name("My Awesome Test"), Category("Cool.Tests"), Description("All cool tests")]
public void Test313()
{
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

您可以在 TestContext 中看到数据:

if (TestContext.CurrentContext.Test.Properties.ContainsKey("Name"))
{
    name = TestContext.CurrentContext.Test.Properties.Get("Name") as string;
}
Run Code Online (Sandbox Code Playgroud)