3

我在一个解决方案文件中有许多项目,它们为它们编写了单元测试,我想将它们设置为由我们的持续集成服务器运行。但是,由于许多测试写得不好并且没有定期运行,所以很多测试都失败了。

我目前没有时间修复所有测试,但我确实相信运行现有测试是有价值的。处理失败的单元测试的最佳方法是什么?

我目前正在做的是将每个失败的测试标记为显式并留下 TODO 评论。

[Test, Explicit] //TODO: Rewrite this test because it fails

有没有更好的方法来做到这一点?或者我应该先修复所有测试,然后再将它们包含在 CIS 运行的测试中?

4

6 回答 6

8

由于您有一个正在运行的自动构建(带有测试失败通知!),这听起来像是每天 5 次的时间(来自 ubuntu 社区):

在每个失败的测试方法中插入以下(伪代码):

if  ( DateTime.now < new DateTime(2008, 12, 24, 11, 00, 00)) return;

您每插入 5 次此声明,您就会提前一个工作日。将一天中的时间设置在您可能有时间修复测试的某个时间。

当工作日到来时,你修复它或删除它。

于 2008-12-22T08:01:31.783 回答
6

好吧,在 NUnit 中,您可以选择使用 ignore 属性忽略测试:

[Test, Ignore("Test needs rewrite")]

不过,就个人而言,我对此类测试做了两件事:

  • 如果我不理解测试,或者测试过时/与当前规格不同步,请删除它们
  • 如果修复是微不足道的,则将其重构为正确的规范

从您所写的内容中收集,我怀疑许多失败的测试已经过时并且可能一开始可能不相关,所以我认为删除它们会很好。

无论如何都没有人理解的测试是没有意义的。

更新Oren Eini有一篇博文,概述了我对激活旧的、失败的测试的大部分感受:

测试本身没有价值:我最成功的项目没有任何测试

去引用:

测试是一种工具,在将其应用于项目之前,应根据通常的指标评估其使用情况。不使用测试的原因有很多,但大多数都归结为:“它们给过程增加了摩擦”。

如果改造旧的、失败的测试会增加流程的摩擦,那么可能根本不值得更新它们。

于 2008-12-22T07:37:07.027 回答
3

我不同意只删除测试的想法。如果它看起来应该可以工作,但它没有,这是重要的信息。如果一个测试基本上没问题,但是有一些环境因素导致它失败(例如读取一个现在位于不同位置的本地文件),那么当你有时间修复它时,它可以很容易地再次提供价值。然而:

  • 添加注释解释测试失败的原因 如果这是由于其他地方的错误,错误 ID 等很有用。确保您提供足够的信息,以便在一年后返回。
  • 有一些工具(它可能非常简单——grep!)每周生成一份报告,这样你就不会忘记测试。
  • 如果可能的话,找到一些定期自动运行被忽略的测试的方法,只是为了检查它们是否仍然失败。失败并神奇地开始工作的测试可以提供非常重要的信息(当然,结合源历史记录)。
于 2008-12-22T08:12:45.193 回答
2

我目前没有时间修复所有测试

我认为你在这里有一些落后的东西......

如果您真的认为测试有价值,那么我建议您没有时间修复它们。现在,他们告诉你软件要么没有做它应该做的事情,要么测试正在检查不再适用的东西。无论哪种方式,这都表明该过程在某个地方被破坏了。

所以,特别是考虑到一年中的时间,除非你有月末或年终问题,否则我会花时间清理我的测试或代码,或两者兼而有之。

说真的,如果你不听他们告诉你的话,进行测试有什么意义呢?如果您不能相信持续集成的功能,为什么还要麻烦运行它呢?

于 2008-12-22T09:02:09.617 回答
1

您在设置运行所有测试的持续集成服务器方面做得很好。

但是禁用测试有什么用呢?它们就像注释掉的代码。死测试。正如乔恩所说:让它们运行或删除它们。如果像你说的那样写得不好,通常最好写新的。

但是你什么时候有时间修复它们?测试是唯一的安全网,软件开发人员在进一步发展时拥有。您需要花时间,否则您将在以后付款。但也许编写新测试需要更少的时间......

于 2008-12-22T08:08:40.067 回答
0

你会如何处理其他一些积累了技术债务的代码?

如果进行 TDD(先测试),单元测试会为您做两件事。一是帮助设计具有低耦合和高内聚的对象。这些测试不再为你做傻事。第二,允许您在不改变行为的情况下重构代码。

听起来你失败的测试现在是机会成本。换句话说,不再为您的项目增加价值。只是花费你金钱和时间。看看你花时间想知道如何处理它们?测试不再有效。

恕我直言,我会删除测试。它们不再覆盖代码,因此如果您重构代码,测试不会保护行为。这就像您的代码中的注释已更改,但注释从未更新。

如果您确实删除了测试,您将需要将测试所涵盖的代码视为“遗留”(Feather 的定义)。

于 2008-12-22T08:12:40.683 回答