当我 运行 所有测试时单元测试失败但当我调试时通过

Unit Tests failing when I Run All Tests but pass when I Debug

我在 Visual Studio 2017 年使用 NUnit3 并进行 TDD。自从我更新了我的代码以使我的最新测试通过后,发生了一些非常奇怪的事情。

现在,当我单击 运行 所有测试时,我的其他 3 个测试都失败了,如下所示:

它告诉我我的 Assert 方法中的实际值和预期值不相等。

但是,当我在Assert方法所在的行下断点并开始调试时,堆栈跟踪显示预期和实际是相同的值,然后测试通过,如下所示:

我是不是在做一些愚蠢的事情,或者 VS2017 或 NUnit 中是否存在错误?

其他人遇到过这种情况吗?

[编辑:我应该补充一点,我已经将每个测试写成单独的 class]

可能会出现一些细微的差异。例如,如果第一个测试改变了一个影响第二个测试行为的状态,那么如果我 运行 单独进行,那么第二个测试的结果可能会不一样。

在无法使用断点时帮助理解测试失败的想法可能是添加日志记录。

总之,回答你的问题:

This ever happen to anyone else?

Am I doing something stupid or could there be a bug in VS2017 or NUnit or something?

我敢打赌两者都不是:只是一个更微妙的案例

失败的测试共享一个资源,当一起测试时会影响它们。重新检查受影响的测试及其主题。

您还应该查看主题中的 static 字段或属性。如果在设计 类.

时使用不当,它们往往会导致问题

我在 Visual Studio 2017 年使用 MSTest 作为测试框架时遇到了类似的问题。当测试 运行 时,单元测试中的断言失败,但在调试单元测试时会通过。这发生在少数单元测试中,但不是全部。除了断言失败之外,许多单元测试也因 System.TypeLoadException (Could not load type from assembly error) 而失败。我最终做了以下解决问题的方法:

  1. 打开解决方案中的Local.testsettings文件
  2. 转到 "Unit Test" 设置
  3. 取消选中 "Use the Load Context for assemblies in the test directory." 复选框

采取这些步骤后,所有单元测试在 运行 时开始通过。

我自己也遇到过这种现象,但是很容易就找到了原因。更具体地说,我测试了一些矩阵计算,在我的测试 class 中,我将要计算的数据定义为 class 变量,并用它执行了我的计算。然而,我的矩阵例程修改了原始数据,所以当我在测试 class 上使用 "run tests" 时,第一次测试破坏了数据,下一次测试无法成功。

下面的示例代码试图说明我的意思。

[TestFixture]
public void MyTestClass()
{
    [Test]
    public void TestMethod1()
    {
        MyMatrix m = new MyMatrix();

        // Method1() modifies the data...
        m.Method1(_data);
    }

    [Test]
    public void TestMethod2()
    {
        MyMatrix m = new MyMatrix();

        // here you test with modified data and, in general, cannot expect success
        m.Method2(_data);
    }

    // the data to test with
    private double[] _data = new double[1, 2, 3, 4]{};
}