JUnit的@Ignore

时间:2009-01-05 06:25:49

标签: java unit-testing testing

我想知道使用JUnit的@Ignore是否是一个好习惯。以及人们如何使用它?

我提出了以下用例:假设我正在开发一个类并为它编写一个JUnit测试,但是没有通过,因为我对这个类没有完成。用@Ignore标记它是一个好习惯吗?

我有点担心以后我们可能会错过被忽略的测试用例,或者人们开始使用它来“强制”测试通过CI。

9 个答案:

答案 0 :(得分:22)

我想这很好。

docs说,

  

测试跑步者将报告被忽略的测试次数以及测试次数   跑了,失败的测试次数。

因此,这意味着即使您之后忘记删除它,也应该已经通知您。

docs中给出的示例完全类似于您的情况。

@Ignore("not ready yet")

答案 1 :(得分:9)

我经常使用@Ignore进行因已知错误而失败的测试。一旦错误被确认并记录在错误数据库中,测试失败就没有任何意义,因为错误已经知道。

保留测试代码仍然有意义,因为一旦修复了bug,它将再次有用。因此,我将其标记为忽略,并附有指示相关错误的注释,并在错误报告中理想地注意,应该重新激活测试以测试修复。

答案 2 :(得分:8)

恕我直言,忽略不应该轻易使用......由于窗户效果不佳。

我很少发现自己在xUnit中使用了这个属性/注释。在编写TestCase#1时,我使用它们的唯一几次是 TODO ,我看到了我错过的另一个测试用例,但也应包括在内。为了让我不忘记它,我写了一个带有描述性名称的小测试用例并用Ignore标记它。继续完成TestCase#1。但这都是内部登记入住。我从不检查标有Ignore的测试。

然而,通常我只是使用一张纸 - 测试列表来记下新的测试用例 - 这要简单得多。这也迎合了我部分完成的情况......完成了10次测试中的5次。我没有在5个忽略的测试中签入,而是保留测试列表并检查5个通过的测试。假设您在接下来的几次签到之前完成其余的工作,然后再开始新的工作。

我能想到的其他“特殊情况”是...... 当您等待来自其他团队/个人/供应商(其接口已发布同意)的组件时,如果没有该组件,测试将无法运行。在这种情况下,您可以编写测试并使用Ignore标记它(“等待X以传递组件Y”)

答案 3 :(得分:6)

我认为使用它是一种非常好的方式。

您的CI服务器应始终为绿色(或Hudson的蓝色)。只要不是你的第一要务就是解决它。

现在,如果由于测试代码中的错误而导致CI崩溃(可能测试代码是顽皮且非确定性的)那么您应该忽略测试“@Ignore(此测试代码是borken,引发缺陷#123) “并提出缺陷跟踪器中的错误。

您不会发送损坏的代码,因为无论何时发货,您都要检查所有缺陷并确定它们中的任何缺陷是否正确?未运行的损坏测试将与其正在测试的代码/功能一起考虑。当且仅当您对其测试的代码没有被破坏感到高兴时,您才会发货。如果没有经过测试,请将其视为破损。

我希望从ant运行测试时使用的junit xml报告格式化程序有一天会包含忽略的计数(以及原因)以及pass,fail和error。也许那时,CI供应商将包括忽略的测试计数(如果不是我可能必须写一个Hudson插件......)

答案 4 :(得分:3)

好吧,如果你没有完成课程,那么测试就失败了。将其标记为@Ignore意味着您将发送未完成类的代码。而且,也许你还没有在任何执行的代码中使用该类,但是有一天其他开发人员可能会看到该类并使用它。然后他甚至失败了它应该工作。

我肯定不会在那种情况下使用@Ignore。

答案 5 :(得分:1)

我认为使用@ignore只要有 -

就可以了
  1. 这个方法无法以某种形式进行测试并在代码中记录的一个很好的理由。这应该是一个特殊情况,需要进行讨论或代码审查,看看是否有任何方法可以对其进行测试。
  2. 测试尚未构建 - 理想情况下,这应该只针对遗留代码。这也应该进行代码审查,并且应该添加测试任务。
  3. 至少在我看来这是规则; - )

答案 6 :(得分:0)

我认为这违背了测试驱动开发的核心基础。如果你没有做TDD,那么它可能并不重要。

我会说,如果你使用@ignore,那么你就不是精益而不是TDD。

如果你正在进行TDD,那么你不应该在你对回购的任何提交中进行失败的测试。

我是完全疯了还是这有道理?

答案 7 :(得分:0)

我认为当测试依赖于无法模拟的外部实体时,可以使用@Ignore。我们仍然需要测试以确保工作正常,但我们不想部署依赖于外部依赖的测试。

例如,如果您为Google文档编写自定义SpreadsheetWriter / Reader,则使用真正的Google文档进行测试是有意义的。但是,如果谷歌文档由于某种原因而关闭,您不希望您的构建失败。在确认您的单元测试通过本地后,我会在将其推向生产之前添加@Ignore。

总的来说,我认为应该尽可能避免使用@Ignore,因为在大多数情况下可以嘲笑外部类/系统。

答案 8 :(得分:0)

@Ignore可用于为某些第三方服务编写的测试。我最近发现自己需要检查外部服务是否正在发回我期望的数据。在测试(模拟)中这样做非常方便。由于我知道我的输入数据无法永久工作,我可能需要稍后运行类似的测试,我添加了@Ignore而不是删除测试。