2008-12-22 28 views
3

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

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

我目前正在做的是将每个失败的测试标记为Explicit并留下TODO注释。

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

有没有更好的方法来做到这一点?还是应该在将它们包含在由CIS运行的测试中之前修复所有测试?

回答

6

那么,在NUnit的,你必须使用忽略属性忽略的测试选项:

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

个人虽然,有两件事情,我有这样的测试做:

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

从您写的内容中搜集我会怀疑很多这些失败的测试已过时,可能并不相关,所以我认为可以删除它们。

无论如何,保持无人理解的测试毫无意义。

UPDATEOren Eini有一个博客文章,概述有关激活的时候,测试失败的大部分我的感受:

The tests has no value by themselves: My most successful project didn't have any tests

引述:

测试是一个工具,在将其应用于项目中之前,应根据通常的指标 评估其使用情况 。有 是很多不使用测试的原因,但 其中大部分归结为:“他们添加 摩擦的过程”。

如果改造旧的,失败的测试会增加过程的摩擦,可能根本没有必要更新它们。

+0

您还可以在[IgnoreAttribute]中加入评论,这使得它们仍然更有用。 – 2008-12-22 07:49:41

8

既然你有一个正在运行的自动生成,这听起来像它的时间为5人天(自由地从Ubuntu社区)(与测试故障通知!):

在每个测试方法多数民众赞成未能插入以下(伪代码):

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

您每插入一次这条语句,您都会将该日期提前一个工作日。在您可能有时间修复测试的某个时间设置时间。

当工作日到达时,您修复或删除它。

1

你正在做一个好的工作,建立一个运行所有测试的持续集成服务器。

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

但是你什么时候有时间来解决它们?这些测试是唯一的安全网,软件开发人员在进一步研究时可以获得。 您需要花时间,否则您将在稍后支付费用。但是,也许这会花更少的时间来写新的测试...

0

你会怎么做一些其他代码累积技术债务?

如果要做TDD(首先测试),Unit Tests会为您做两件事。一种是帮助设计你的物体低耦合和高凝聚力。这些测试不再为你做杰克狗屎。第二,允许你重构你的代码而不改变行为。

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

恕我直言,我会删除测试。他们不再覆盖代码,如果你重构代码,测试不会保护行为。这就像您的代码中的评论已更改,但评论从未更新过。

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

3

我不同意刚删除测试的想法。如果它看起来应该起作用,但它不起作用,那是重要的信息。如果一项测试大多数都可以,但是有一些环境会导致测试失败(例如,读取当前位于不同位置的本地文件),那么当您有时间修复它时,它可以很容易地再次提供值。但是:

  • 添加注释,解释为什么测试失败如果这是由于其他地方的错误,错误ID等是有用的。确保你提供足够的信息在一年内回来。
  • 有一些工具(它可能很简单 - grep!)每周产生一个报告,所以你不要忘记测试。
  • 如果可能的话,找一些方法定期自动运行被忽略的测试,只是为了检查它们是否仍然失败。一个失败并且神奇地开始工作的测试可以提供非常重要的信息(当然与源历史相结合)。
2

我没有时间在一瞬间 解决所有的测试

我觉得你有什么落后这里的...

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

因此,特别是考虑到每年的时间,除非您有月结束或年终问题,否则我会花时间清理我的测试或我的代码或两者。

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