如何让Junit 4忽略一个基本测试类?

76

我有一个基类用于多个测试,里面包含一些所有测试都需要的帮助方法。

这个基类本身没有任何测试,但是 JUnit(在 eclipse 中)正在调用测试运行器并抱怨没有要测试的方法。

我该如何让它忽略这个类?

我知道我可以添加一个 dummyTest 方法来解决这个问题,但这也会出现在所有子类中。

有建议吗?


它被执行并仍在运行。 - Allain Lalonde
2
请参考类似问题:https://dev59.com/vHRB5IYBdhLWcg3wSVYI - Synox
我刚刚得知,如果我们编写一个测试用例,则测试用例内应至少包含一个@Test方法,这是必须的。否则,它将会给出初始化错误。这是真的吗? - Shiva Komuravelly
6个回答

106

使用@Ignore注解。它也可以用于类。 看这个例子:

@Ignore public class IgnoreMe {
                        @Test public void test1() { ... }
                        @Test public void test2() { ... }
                }

此外,您可以使用@Ignore注解一个包含测试方法的类,这样将不会执行其中的任何测试。

来源:JUnit JavaDoc


1
我同意这应该可以工作,所以+1。但是在NetBeans 6.2和JUnit 4.5中,“@ignore”仅被列为适用于方法。 - Allain Lalonde
查找并调用库的版本是4.5,但jar文件却是junit4-1.jar,很奇怪。接受了你的答案。谢谢。 - Allain Lalonde
你能给我指出一个有效的参考资料,证明@Ignore仅适用于junit 4.5中的方法吗?我似乎找不到相关信息。 - deepakraut
如果我想忽略除一个方法之外的所有方法的测试(而不是在每个方法上方标注@ignore),该怎么办? - O.Badr

34

作为一条注释,我总是建议给出忽略的原因:

@Ignore("This test will prove bug #123 is fixed, once someone fixes it")

我希望运行来自ant的测试时,junit xml报告格式化程序将有一天包括忽略的计数(和原因),以及通过、失败和错误。


8
岁月流逝,但“问题 #123”仍未得到解决。 - J-Alex

26
将类设置为abstract应该足以适用于JUnit 4。如果不起作用,请仔细检查您使用的JUnit版本。
这也表明了您的意图,即这只是测试的一部分。
它还可以防止JUnit将类中的测试计数为“被忽略的”(因此最终被忽略的测试计数将符合您的预期)。
或者,重命名该类。大多数运行器使用类名来确定哪些类是测试,哪些是帮助程序。在默认设置下,使用Maven时,您只需确保基类不以Test开头或结尾,并且不以TestCase结尾。(http://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html)

1
@Ignore和abstract的组合非常棒! - derekv
3
您不需要使用@Ignore。仅使用抽象类就足够了(在我看来也是最好的选择)。 - techfly
4
使用JUnit 4,abstract就足够了。 - Aaron Digulla
太好了!使用@Ignore并且不使用abstract,当我使用mvn package命令行构建时,我的最终报告中出现了不必要的跳过测试。 - PJ_Finnegan

16

JUnit5

@Ignore未来版本将不再使用。如果您正在使用JUnit5,可以从JUnit Jupiter中使用@Disabled

import org.junit.jupiter.api.Disabled;

你甚至可以在注释中使用@Disabled@Disabled("这里是一些评论")

用注释标注类,将禁用类中的所有测试:

@Disabled
public class DemoTest { }

@Disabled("some comment here")
public class DemoTest { }

方法

@Disabled
public void whenCaseThenResult() { }

@Disabled("some comment here")
public void whenCaseThenResult() { }

1
你也做得很好。一如既往! - GhostCat

11

有三种选项:

  1. 在JUnit 4或5中,将基类设置为抽象的就足够了。如果使用@Ignore属性,则它将显示为已忽略的测试(并将其添加到测试总数中)。

  2. 您可以使用@Ignore注释。该注释也适用于类。 @Ignore测试注释用于忽略特定的测试或一组测试,以跳过构建失败。

@Ignore("Base class not yet ready") 
class MyBaseClassTestCases {...}
  • 您可以更改测试类的名称,以便在测试名称的开头或结尾没有单词Test (区分大小写)/或者单词TestCase在结尾处。


  • 在我看来,最相关的答案。 - coffman21
    抽象类绝对是用于基本测试类的最佳选择。 - user1075613

    1

    添加一个空的测试是有效的。

    @Test(expected = Test.None.class)
    public void ATest() {}
    

    注意,如果不加上 (expected = Test.None.class),会导致 Sonar 报错 "至少添加一个断言"。


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