JUnit @Ignore 有什么作用?

17
在JUnit中,您可以在方法之前使用@Ignore告诉测试运行器自动跳过这些测试。据我了解,这只是一种方便的方式来记录/标记未完成或不再起作用的测试,以便稍后回来处理。
那么,我说得对吗?在运行时,一个带有@Ignore注释的测试、一个没有注释的方法和一个被注释掉的方法之间没有区别(假设这些测试都是自包含的)。是否有一种方式在Netbeans上获取JUnit中被忽略的测试用例列表?如果没有,@Ignore标签有多少实用价值呢?因为将测试失败可能更有用,以免被忽视。
6个回答

24
我这么说对吗,运行时@Ignore测试、没有注释的方法和被注释的方法之间没有任何区别吗?
@Ignore注解的方法可以通过反射找到。没有注解的方法不能(或者准确地说,不能确定地被识别为忽略的测试方法),而被注释的方法甚至连字节码都不会生成。
虽然我认为在运行时查找@Ignore方法并没有太多实际价值,但生成统计/报告可能是有用的。
@Ignore标签真正的用处有多大?
其中一个我可以想到的是可搜索性。你可以很容易地在源代码中识别所有的@Ignore注解,而未经注释或注释掉的测试则不那么容易找到。
也许将测试失败以便不被忽视会更有用?
如果您想要(并且可以)立即修复它,那么让它失败是可以的。有些情况下你不能这么做,但你仍然希望该方法存在,以免被遗忘。这时就应使用@Ignore

9
  • 没有注释的方法很可能是实用方法,通常被测试中的其他方法使用。

  • 被注释掉的方法是完全隐藏的。

  • 但您可以使用@Ignore来表示您暂时禁用了测试。如果您有一个大而复杂的代码段正在转换中,您可能希望在该代码段失败时暂时禁用一些测试,特别是如果运行该代码的机制作为某个更大的回归套件的一部分运行。 @Ignore属性将提醒您(或您的QA团队)还有更多工作要做。

    请记住,有@Ignore的测试仍然是活动代码,并且可以通过反射查看甚至执行,而注释掉的代码则不能。这也意味着当您重构其他代码时,它们也会得到更新,并且API中的语法破坏将在那里显示。因此,即使设置了@Ignore的测试也可以积极地促进代码质量。

  • JUnit 4 TestRunners将把@Ignore的测试显示为“跳过”,因此您可以在最后看到通过/失败/跳过的测试数量。

虽然您的Netbeans副本可能没有充分利用@Ignore,但我可以向您保证,它并不是JUnit测试的唯一消费者。


对的,这就是禁用测试的不同方式所带来的影响。但是在运行时,它们都变得等效了,对吧?(假设它不是实用方法) - donnyton
4
除了以下两点:
  1. 使用@Ignore注解的测试可以通过反射访问,因此会传达一些额外的信息。
  2. 如果你注释掉一个测试,你将永远不知道是否破坏了API,导致潜在的语法错误。保留代码并使用@Ignore注解至少意味着在代码更改期间语法仍然是正确的。
- lavinio
1
@Ignore测试也应该被JUnit4 TestRunners报告为“跳过”测试,这在报告中仍然是有用的信息。 - Nate
@lavinio:你可能想把“除了两件事”这个评论融入到你的回答文本中……这会提高回答的质量。 - vkraemer

6

忽略的测试比被注释掉的测试更易于维护(并且更容易被维护)。它们会因为事物的发展而受到编译器错误、IDE的结构化搜索和IDE辅助重构的影响。


3

请注意,TestNG 对此提供了略有不同的支持:

  • You can include a description of why the test is being ignored:

    @Test(enabled = false, description = "Disabled until BUG-1234 gets fixed")
    
    • The Eclipse TestNG plug-in and the HTML reports will give you a list of all the tests that have been disabled, along with the reason why:

enter image description here


1
junit 4.11支持@Ignore("Description")。我不知道这是什么时候引入的。 - Thorbjørn Ravn Andersen

1

使用@Ignore而不是注释掉@Test的优点在于,Hudson/Jenkins将其识别为被忽略的测试,并相应地在测试结果中显示。因此,您会提醒自己有一个被忽略的测试,这是一个很大的好处!


另一方面(我猜这可能是引发这篇文章的原因),使用IDE的人会立即通过颜色看出测试被注释了,但很容易忽略它被@Ignored。 - Ed Staub
1
如果你浏览类,那是正确的。但是如果你运行测试类,Eclipse会在结果中用一个被划掉的图标显示你跳过的测试;-) - Kai

0

在我看来,@Ignore的用处是可以在报告中知道有x个测试被跳过了,如果测试没有被注释为测试或者已经被注释掉了,你就无法得到这个信息。 让测试失败并不是一个好的选择,因为我们知道我们想要忽略的测试在某些时候并不相关,但是以后可能需要重新启用它们。所以我们希望看到所有其他测试是否会成功/失败,知道我们将跳过不相关的测试(我们已经跳过它们的事实将在报告中可见)。


我听说过这个,但是我在哪里可以找到报告呢?Netbeans在可视化JUnit运行器中没有报告。 - donnyton
我不了解Netbeans,我在终端中使用maven命令(mvn test / integration-test)。默认情况下,报告会生成在target/failsafe-reports或surefire-reports文件夹中,但目标文件夹可以自定义。但是在Netbeans中,您不会得到一个包含X个测试、X1个失败、X2个错误和X3个跳过的摘要吗?跳过测试的数量是从@Ignore注释中推断出来的。 - Jihed Amine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接