使用Maven从@Category运行所有测试

时间:2011-02-11 14:34:11

标签: junit maven categories surefire

我想只运行我的单元测试的一个子集,即由特定@Category定义的单元测试。

所以我读了几个SO问题,比如this one(这正是我要找的),还有this one

我的问题的解决方案似乎由ClasspathSuite project提供。所以我开始编写将定义我的测试类别的NewTestOldTest接口。然后,我创建了AllTests套件:

@RunWith(ClasspathSuite.class)
public class AllTests { }

之后,我创建了一个AllNewTests套件:

@RunWith(Categories.class)
@IncludeCategory(NewTest.class)
@SuiteClasses( { AllTests.class })
public class AllNewTests { }

最后,我创建了两个JUnit类,每个类别一个:

@Category(NewTest.class)
public class SomeNewTests {
    // some tests...
}

@Category(OldTest.class)
public class SomeOldTests {
    // some tests...
}

现在,如果我运行 AllTests ,Eclipse会启动我项目的所有测试,而Maven会因为没有找到测试而失败:

mvn test -Dtest=AllTests

...
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running my.company.AllTests
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.093 sec
There are no tests to run.

如果我运行 AllNewTests (这是正确的事情,对吧?),在Eclipse中一切都很好(即它只运行带@Category(NewTest.class)注释的测试)但 Maven返回错误

mvn test -Dtest=AllNewTests

...
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running my.company.AllNewTests
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.125 sec <<< FAILURE!

Results :

Tests in error:
  initializationError(my.company.AllNewTests)

Tests run: 1, Failures: 0, Errors: 1, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------

抛出的异常如下:

org.junit.runner.manipulation.NoTestsRemainException
    at org.junit.runners.ParentRunner.filter(ParentRunner.java:256)
    at org.junit.experimental.categories.Categories.<init>(Categories.java:142)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:35)
    at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24)
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:33)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:146)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:97)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.maven.surefire.booter.ProviderFactory$ClassLoaderProxy.invoke(ProviderFactory.java:103)
    at $Proxy0.invoke(Unknown Source)
    at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:145)
    at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:70)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69)

我的问题是我做错了什么?


技术细节:Java 6,Maven 3.0.2,JUnit 4.8.1,Surefire插件2.7.1,cpsuite-1.2.5

3 个答案:

答案 0 :(得分:6)

作为更新:从Surefire插件v2.11开始,现在支持JUnit 4.8+样式类别。

release notes for Surefire v2.11提到了新功能。可靠性:测试目标可以使用groups配置。

答案 1 :(得分:4)

我通过创建自己的JUnit Runner解决了我的问题,扩展了Suite

这个想法接近Classpath Suite项目的原则,即查找类路径中存在的类,并仅保留使用给定注释(例如@NewTest)注释的类。

如果您有兴趣,可以阅读full story on my blog

答案 2 :(得分:1)

在阅读了一些博客文章和stackoverflow问题后,我终于能够使用surefire插件进行此工作,因为user1034382已经回答了问题。在我的情况下,使用版本2.17的maven-surefire-plugin。

只需加上我的两分钱,就可以在这里找到更新的解释: Using JUnit Categories to group tests

但是您可能会遇到以下surefire插件问题:

[ERROR] java.lang.RuntimeException: Unable to load category:

可以使用此其他stackoverflow问题解答: Where should I put interface class for Junit @Category?

我的回答是在这里收集所有这些信息,避免谷歌搜索/阅读许多不同的解决方案。至少,这对我有用。