为什么 nunit 不运行包含控制/特殊字符的测试

问题描述

如果我有一个类似的测试类

public class Tests
{
    [TestCaseSource(nameof(TestSource))]
    public void Test(string c)
    {
        Assert.Pass();
    }

    public static IEnumerable<object> TestSource()
    {
        for (char c = '\0'; c < 255; c++)
        {
            yield return c.ToString();
        }
    }
}

那么 Visual Studio 中的测试运行器可以发现所有测试,但不会运行所有测试。

这些是未运行的 ascii 字符范围:

U_0001 - U_0006
U_000E - U_001F
U_007F - U_0084
U_0086 - U_009F

我们目前使用其中一些字符,例如 U_0002 进行网络工作相关测试,这些字符包含在测试中但目前未运行

这是测试运行的输出

---------- Starting test discovery for requested test run ----------
NUnit Adapter 3.17.0.0: Test discovery starting
NUnit Adapter 3.17.0.0: Test discovery complete
========== Test discovery finished: 255 Tests found in 4,8 sec ==========
---------- Starting test run ----------
NUnit Adapter 3.17.0.0: Test execution started
Running selected tests in C:\Users\WEIK014\source\repos\TestSourceTestProject\TestSourceTestProject\bin\Debug\netcoreapp2.1\TestSourceTestProject.dll
   NUnit3TestExecutor discovered 199 of 199 NUnit test cases
NUnit Adapter 3.17.0.0: Test execution complete
========== Test run finished: 199 Tests run in 8,6 sec (199 Passed,0 Failed,0 Skipped) ==========

如你所见,它甚至不承认它跳过了测试。

项目中的版本:

  • 项目 .Net Core 2.1
  • NUnit 3.13.1
  • NUnit3TestAdapter 3.17.0

以下是这些测试无法运行的一些视觉证据

enter image description here

解决方法

这听起来可能是 Visual Studio 或测试适配器中显示 Unicode 控制字符的错误。作为一种解决方法,您可以覆盖控制字符的测试显示名称:

public static IEnumerable<TestCaseData> TestSource()
{
    for (char c = '\0'; c < 255; c++)
    {
        var data = new TestCaseData(c.ToString());
        if (char.IsControl(c))
        {
            data.SetArgDisplayNames($"{(int)c:X4}");
        }
        yield return data;
    }
}

这将保留可打印字符的显示(例如 Test("a")),而控制字符将显示为 Test(0001) 等。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...