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

Posted

技术标签:

【中文标题】运行所有测试时单元测试失败,但调试时通过【英文标题】:Unit Tests failing when I Run All Tests but pass when I Debug 【发布时间】:2017-10-12 23:18:35 【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

一次运行一个测试有效,对吧? @Zenima 是的,三个单独运行时都通过了,但是当我单击“运行所有测试”时都失败了,我不明白,因为它们仍然是单元测试,而不是集成测试。 @MichaelHennigan 失败的测试共享一个资源,当一起测试时会影响它们。重新检查受影响的测试及其主题。 @Nkosi 那么这是否会发生,因为我在不同的测试中使用相同的变量名? @MichaelHennigan 如果该变量对于测试类是全局的,是的。但如果没有看到有问题的代码,就看不到你的情况 【参考方案1】:

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

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

【讨论】:

谢谢@Nkosi。当我注释掉静态字段并点击运行所有测试时,两个较旧的测试通过了。但是,我最近的测试失败了。我使用静态 int nextID 为新用户对象提供 NextID 的 UserID,然后递增 NextID。如何在不搞乱单元测试的情况下实现此功能? @MichaelHennigan 好的,这是一个新问题。问一个能正确解释问题的新问题,我会看看我能提供怎样的帮助。我有一些想法,但这只是猜测,没有看到您遇到的实际问题。这很可能是一个设计问题。 或者这有关系吗?我应该忽略我的测试在我全部运行时没有全部通过的事实吗? 不要忽略测试。正确设计您的课程将解决问题。永远不要忽视测试。他们将来会回来咬你(技术债务)。 好的 - 这里有新问题:***.com/questions/43958823/…【参考方案2】:

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

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

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

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

是的

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

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

【讨论】:

感谢您回复我的问题。我认为由于我的代码更改可能有一些奇怪但合乎逻辑的原因,但我花了很长时间浏览我的测试代码和生产代码,但找不到测试失败的原因。单击“运行所有测试”会发生什么?我不明白为什么它与逐个运行每个测试不同 这样想:您的一项测试会干扰其他测试。只有当你一起运行它们时,它们才会干扰。【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

以上是关于运行所有测试时单元测试失败,但调试时通过的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins 中的单元测试失败

在 VS 中运行单元测试与调试单元测试时,我应该期待啥区别?

Swift 动态转换失败 - 尝试运行单元测试时出错

Angular:运行Git push时如何强制运行单元测试?

启用 proguard 的 Android 单元测试

如何快速调试 sCrypt 单元测试错误