NUnit测试调试

NUnit Test Debugging

我正在研究几何库。有 200 多个单元测试。

有一个特别顽固的测试,每当我 select "Run All" 时都会失败,但当我 运行 单独测试或对其使用调试器时,测试会通过。我相信这个问题是在我从 visual studio '13 版转到 '15 版时出现的。

现在关于几何库的一些说明:

对象是不可变的。

测试之间没有共享对象。

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

编辑:

[Test()]
public void Plane_IntersectionWithPlane_IdenticalPlane()
{
     Plane testPlane = new Plane(new Direction(Point.MakePointWithInches(2, -1, 1)), 
                                               Point.MakePointWithInches(2, 1, 2));
     Line found = (testPlane.Intersection(testPlane));

     Line expected = new Line(new Direction(Point.MakePointWithInches(0, -1, -1)), 
                                            Point.MakePointWithInches(2, 1, 2));
     Assert.IsTrue(found.Equals(expected));
}

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

与自身相交的平面就是平面,所以如果结果仅限于一条线,那么任何在平面上有 2 个不同点的线 都是有效的结果,但测试 某一特定行 看起来像是将执行结果逆向工程到测试预期中。

如果要求/规范对标识相交生成的线的方向非常具体,那就另当别论了,所以您可能想在这方面提供更多见解。

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

尝试以下操作:

打开 Nunit GUI 在你 运行 测试之前更改上面的设置:

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

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

http://www.nunit.org/index.php?p=download

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

  • 静态对象构造/销毁
  • 同步问题
  • 模拟设置/清理问题

我发现追踪问题的最佳方法是遵循@Matthew Strawbridge 在评论中建议的类似方法。我将 Ignore 属性添加到 Tests/TestFixtures 以删除测试,直到 运行-all 开始工作,然后开始重新添加它们,直到它再次中断以缩小问题范围。

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

查看导致失败的 fail/seem 测试之间的代码可以帮助您缩小交互范围。 error/failure 测试的原因当然也有帮助...

选择 'Run-all' 运行 以可预测的顺序进行所有测试,因此测试通常 运行 每次都采用相同的方式。如果您 select 进行了一批测试,那么 运行 人员可能会根据您的 selection 顺序选择 运行 不同的顺序,这可能就是为什么你在 selecting 测试时遇到了不同的行为,而不是使用 运行-all.

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

您可以 运行 在一个单独的应用程序域中首先确认此测试用例,然后再开始搜索静态变量。抱歉,我从未尝试在 nunit 中创建新的应用程序域。但是这里的答案之一确实给出了有关如何为测试用例创建新的应用程序域的提示 - Run unit tests in different appdomain with NUnit

如果此测试单独通过但在 运行 与其他测试一起时失败,则极有可能您的 类.

中有一些共享状态

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

的实现
Line Intersection (Plane plane);

您希望此方法 return 一条被认为与您的 "expected" 线相同的线,因此交叉点 return 可能是一条基于某些共享状态的线。

您能向我们展示 Intersection 的实现吗?