【发布时间】:2010-09-29 13:41:34
【问题描述】:
我想知道使用 JUnit 的 @Ignore 是否是一个好习惯。人们如何使用它?
我想出了以下用例:假设我正在开发一个类并为它编写一个 JUnit 测试,但没有通过,因为我还没有完成这个类。用@Ignore 标记它是一个好习惯吗?
我有点担心我们以后可能会错过被忽略的测试用例,或者人们开始使用它来“强制”测试通过 CI。
【问题讨论】:
标签: java unit-testing testing
我想知道使用 JUnit 的 @Ignore 是否是一个好习惯。人们如何使用它?
我想出了以下用例:假设我正在开发一个类并为它编写一个 JUnit 测试,但没有通过,因为我还没有完成这个类。用@Ignore 标记它是一个好习惯吗?
我有点担心我们以后可能会错过被忽略的测试用例,或者人们开始使用它来“强制”测试通过 CI。
【问题讨论】:
标签: java unit-testing testing
对于由于已知错误而失败的测试,我经常使用@Ignore。一旦错误被确认并记录在错误数据库中,测试失败就没有任何意义,因为错误是已知的。
保留测试代码仍然有意义,因为一旦修复了错误,它将再次有用。因此,我将其标记为忽略,并在注释中指出相关的错误,并在错误报告中注明应重新激活测试以测试修复。
【讨论】:
恕我直言,忽略不应该轻易使用的...由于破窗效果。
我很少发现自己在 xUnit 中使用此属性/注释。我使用它们的唯一几次是在编写 TestCase#1 时作为 TODO,我看到了另一个我错过但也应该包括在内的测试用例。为了不忘记,我写了一个带有描述性名称的小测试用例,并用 Ignore 标记它。继续完成 TestCase#1。但这都是内部签到。我从不签入标有“忽略”的测试。
但是通常我只是使用一张纸 - 测试列表来记下新的测试用例 - 这要简单得多。这也迎合了我部分完成的场景......完成了 10 个测试中的 5 个。我不会签入 5 个忽略的测试,而是保留测试列表并签入 5 个通过的测试。假设您将在接下来的几次签到中完成其余部分,然后再跳到新事物。
我能想到的其他“特殊情况”是..
当您等待来自另一个团队/人员/供应商(其接口已发布-同意)的组件时,如果没有该组件,测试将无法运行。在这种情况下,您可以编写测试并将其标记为 Ignore("Waiting on X to deliver component Y")
【讨论】:
我认为这是一个非常好的使用方式。
您的 CI 服务器应该一直是绿色的(或者在 Hudson 的情况下是蓝色的)。只要不是你的首要任务就是修复它。
现在,如果 CI 因测试代码中的错误而中断(也许测试代码是顽皮且不确定的),那么您应该忽略测试“@Ignore(此测试代码已损坏,引发缺陷 #123) " 并在您的缺陷跟踪器中提出错误。
您不会发布损坏的代码,因为无论何时发布,您都会检查所有缺陷并确定其中是否有任何缺陷,对吗?未运行的损坏测试将与它正在测试的代码/功能一起考虑。当且仅当您对它正在测试的代码也没有损坏感到高兴时,您才发货。如果没有经过测试,则认为它已损坏。
我希望在从 ant 运行测试时使用的 junit xml 报告格式化程序有一天会包括忽略的计数(和原因)以及通过、失败和错误。也许到那时,CI 供应商将包括被忽略的测试计数(如果没有,我可能不得不编写一个 Hudson 插件......)
【讨论】:
好吧,如果你没有完成这门课,那很好,测试失败了。将其标记为@Ignore 意味着您将发布一个未完成类的代码。是的,也许你还没有在任何被执行的代码中使用那个类,但是有一天其他开发人员可能会看到那个类并使用它。然后他失败了,即使它应该工作。
我肯定不会在这种情况下使用@Ignore。
【讨论】:
我认为使用@ignore 是可以的,只要有 -
至少在我看来这是规则;-)
【讨论】:
我认为这违背了测试驱动开发的核心基础。当然,如果你不做 TDD,那么它可能没那么重要。
我想说的是,如果你使用@ignore,那么你就不是精益,也不是在做 TDD。
如果您正在执行 TDD,那么您不应该在对您的存储库所做的任何提交中出现失败的测试。
我完全疯了还是有道理?
【讨论】:
我认为当测试依赖于无法模拟的外部实体时使用@Ignore 是可以的。我们仍然需要测试以确保一切正常,但我们不想部署依赖于外部依赖项的测试。
例如,如果您为 Google 文档编写自定义的电子表格编写器/阅读器,那么使用真正的 google 文档对其进行测试是有意义的。但是,如果 google 文档由于某种原因而关闭,您不希望您的构建失败。在确认您的单元测试在本地通过后,我会在将其推送到生产之前添加一个@Ignore。
总的来说,我认为应该尽可能避免使用@Ignore,因为在大多数情况下,外部类/系统可以被模拟。
【讨论】:
@Ignore 可用于为某些第三方服务编写的测试。我最近发现自己需要检查外部服务是否正在发回我期望的数据。在测试(模拟)中这样做非常方便。因为我知道我的输入数据不会永远有效,并且我可能需要稍后运行类似的测试,所以我添加了 @Ignore 而不是删除测试。
【讨论】: