繁体   English   中英

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

[英]Why do my unit tests (mostly) fail when I select Run All but then pass when I only run one at a time?

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

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

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

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

更新:在每个测试之前运行一个测试初始值设定项,用于设置测试环境的状态。 还有一个 dispose 方法在每次测试后运行以清理该环境。

现在,我看到发生的事情是,有一个对象在第一次通过测试初始值设定项之前不存在,但之后确实存在。 在第一次测试后的清理中,大多数其他对象都被删除了,但这个对象只是变成了空。 在第二次(以及所有后来的通过)通过测试初始值设定项时——所以就在第一次之后的任何实际测试之前——该对象保持“空”,而不是像第一次那样获得文件路径。

然后,每当其他测试中的任何一个尝试调用该对象时,它们都会得到一个空值并抛出该异常。

没有看到您的代码,我只能猜测,所以就在这里。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM