C# NUnit测试调试

C# NUnit测试调试,c#,unit-testing,nunit,C#,Unit Testing,Nunit,我在做一个几何图书馆。有200多个单元测试 每当我选择“全部运行”时,有一个特别顽固的测试就会失败,但当我单独运行该测试或对其使用调试器时,测试就会通过。我相信这个问题是在我从VisualStudio'13版转到'15版时出现的 现在,请注意有关几何图形库的一些注释: 对象是不可变的 测试之间没有共享对象 所以我的问题是:这种奇怪行为的可能原因是什么 编辑: 从我在testcase中看到的情况来看,发散行为很奇怪,但测试失败是一个完全有效的结果: 与自身相交的平面就是平面,因此,如果结果被限制为

我在做一个几何图书馆。有200多个单元测试

每当我选择“全部运行”时,有一个特别顽固的测试就会失败,但当我单独运行该测试或对其使用调试器时,测试就会通过。我相信这个问题是在我从VisualStudio'13版转到'15版时出现的

现在,请注意有关几何图形库的一些注释:

对象是不可变的

测试之间没有共享对象

所以我的问题是:这种奇怪行为的可能原因是什么

编辑:


从我在testcase中看到的情况来看,发散行为很奇怪,但测试失败是一个完全有效的结果:

与自身相交的平面就是平面,因此,如果结果被限制为一条直线,那么在该平面上有两个不同点的任何直线都是有效的结果,但对一条特定直线的测试看起来像是将执行结果反向工程到测试预期中

如果需求/规范非常具体地描述了从标识交叉点生成的线的方向,那么情况就不同了,因此您可能希望在这方面提供更多的见解

我很抱歉将此作为答案而不是评论发布-缺少代表。

请尝试以下操作:

打开Nunit GUI,在运行测试之前,在设置中更改上述内容:

它曾经帮助我发现我的问题

顺便说一句: 您使用的是什么版本的NUNIT? 如果您不知道什么是Nunit GUI,那么您可能没有单独下载Nunit。您可以从以下位置获得安装:


我过去也遇到过类似的问题,但结果总是底层代码元素之间出现一些意外的交互,或者测试的编写方式。需要检查的问题包括:

  • 静态对象构造/销毁
  • 同步问题
  • 模拟设置/清理问题
我发现追踪这个问题的最佳方法是采用类似于@Matthew Strawbridge在评论中建议的方法。我将
Ignore
属性添加到Tests/testfixture,以删除测试,直到runall开始工作,然后开始重新添加它们,直到再次出现故障,从而缩小问题范围

有时,您还会发现忽略当前失败的测试会导致另一个测试失败。这是一个很好的迹象,表明问题实际上是由另一个测试本身未正确清理而引起的

查看失败/似乎导致失败的测试之间的代码可以帮助您缩小交互范围。测试的错误/失败原因当然也有助于


选择“全部运行”将以可预测的顺序运行所有测试,因此每次测试的运行方式通常相同。如果您选择了一批测试,那么运行者可能会根据您的选择顺序选择以不同的顺序运行它们,这可能是您在选择测试时体验到不同行为而不是使用“全部运行”的原因。

请检查是否涉及任何静态变量。静态变量存在于AppDomain级别,因此一个测试用例设置的静态变量可能会对其他测试用例产生副作用


在开始搜索静态变量之前,您可以先在单独的应用程序域中运行此测试用例以确认行为。很抱歉,我从未尝试在nunit中创建新的appdomain。但这里的一个答案确实给出了如何为测试用例创建新appdomain的提示-

如果此测试单独通过,但在与其他测试一起运行时失败,则极有可能您的类中存在某些共享状态

如果你说我们所有的对象都是不可变的,那么我的第一个猜测就是看看

Line Intersection (Plane plane);
您希望此方法返回一条与“预期”线相同的线,因此交叉点可能会基于某个共享状态返回一条线


您能告诉我们交叉点的实现吗?

您的问题是什么?使用NUnit时是否存在任何众所周知的怪癖,在作为组的一部分运行时,与单独运行时相比,可能会导致测试失败?不,您很可能会遇到这种情况。展示一个简短的、可复制的例子来说明问题,我们就可以看到确切的问题。可能存在共享资源、不正确的异步性或大量其他可能性。您正在静态使用Point类来调用函数MakePointWithInches。是一个测试可以依赖于另一个也使用此函数的测试的唯一情况。。。你检查过了吗?你能分享Point类的实现吗?我想你需要提供更多细节。对于给定的信息,有太多的可能性:线程、静态成员、缓存……这只是一个例子,其他测试也有这种奇怪的行为。在平面与自身相交的情况下,它只拾取该平面中的特定直线。这是否是处理简并度的一个好方法还存在争议,但测试的线是该方法应该选择的线。(并且是它在测试自行运行时选择的)
Line Intersection (Plane plane);