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

时间:2017-05-13 21:10:27

标签: c# visual-studio unit-testing nunit nunit-3.0

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

现在,当我单击Run All Tests时,其他3个测试失败,如下所示:

enter image description here

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

但是,当我在Assert方法所在的行放置一个断点并开始调试时,stacktrace显示expect和actual是相同的值,然后测试通过,如下所示:

enter image description here

我做了一些愚蠢的事情,或者VS2017或NUnit中是否有错误或其他什么?

这种情况会发生在其他人身上吗?

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

4 个答案:

答案 0 :(得分:7)

失败的测试在共同测试时共享影响它们的资源。重新检查受影响的测试及其主题。

您还应该查看主题中的静态字段或属性。如果在设计课程时使用不当,它们往往会引起问题。

答案 1 :(得分:1)

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

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

无论如何,回答你的问题:

  

这种情况会发生在其他人身上吗?

  

我做了一些愚蠢的事情,或者VS2017或NUnit中是否有错误或其他什么?

我打赌它既不是:只是一个更微妙的案例

答案 2 :(得分:0)

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

  1. 在解决方案中打开Local.testsettings文件
  2. 转到“单元测试”设置
  3. 取消选中“对测试目录中的程序集使用加载上下文”。复选框

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

答案 3 :(得分:0)

我自己遇到了这种现象,但是很容易找到原因。更具体地说,我测试了一些矩阵计算,并在测试类中定义了要作为类变量进行计算的数据,并使用该变量进行了计算。但是,我的矩阵例程修改了原始数据,因此当我在测试类上使用“运行测试”时,第一个测试破坏了数据,而下一个测试无法成功。

下面的示例代码旨在显示我的意思。

[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]{};
}