当我选择全部运行时,为什么我的单元测试(大部分)都会失败,但是当我一次只运行一个时,它会通过?

时间:2017-10-02 21:07:10

标签: unit-testing

我在Visual Studio 2013中工作,如果选择“全部运行”,我的大多数单元测试都会失败,但是如果我选择一个失败的测试然后单独运行它,它就会通过。此外,如果我选择其中一些测试并运行它们,则第一个要运行的测试将通过,其他测试将失败。但是,如果单独运行,每个都将通过。

我注意到大多数失败的测试都有一个“System.NullReferenceException:对象引用未设置为对象的实例..”,但同样,只有在我运行所有测试时才会出现。

我可以一次一个地运行这些测试,但我非常希望避免这种情况。如果有人以前遇到过这个问题,你是怎么解决的?

上下文:在安装了.Net 4.6.2的Visual Studios 2013中运行它。

更新:每次测试之前都会运行一个测试初始化​​程序,用于设置测试环境的状态。每次测试后都会运行一个dispose方法来清理该环境。

现在,我看到发生的事情是,在测试初始化​​程序的第一次传递之前,有一个特定的对象不存在,但之后确实存在。在第一次测试后的清理中,大多数其他对象都被删除,但是这个对象只是变为空。在第二个(以及所有后来的传递)通过测试初始化​​程序 - 所以在第一个超出第一个实际测试之前 - 该对象保持'null'而不是像第一遍那样获得文件路径。

然后,只要其他任何测试试图调用该对象,它们就会得到一个空值并抛出该异常。

3 个答案:

答案 0 :(得分:1)

如果没有看到你的代码,我只能猜一猜,所以就是这样。

您正在测试类的构造函数中而不是在setup方法中初始化对象。这意味着多个测试同时使用相同的对象,这些对象可以是其他测试所放置的任何状态。

答案 1 :(得分:1)

检查是否将类级别对象设置为null,然后在以后的测试中使用它。

答案 2 :(得分:0)

我最终构建了一个静态方法来在每次测试后处理null对象。我通过检查它是否正在使用,锁定它,然后再次检查它是否正在使用,使该方法线程安全。

现在,每当再次运行testInitializer时,该对象就会被创建并指向正确的路径,而不是简单地保持为null。