2011-02-11 51 views
6

我只想运行我的单元测试的子集,这些测试由特定的@Category定义。使用Maven运行@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) annoted的测试,但的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,4.8.1的JUnit,一定能成功的插件2.7.1,cpsuite-1.2.5

回答

6

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

release notes for Surefire v2.11提及新功能。 surefire:测试目标可以使用groups进行配置。

+0

你真的成功了吗?我似乎无法让它工作。 Surefire(2.11/2.12)似乎忽略了这些团体。它只是运行所有测试。 – 2012-02-09 11:32:26

4

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

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

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

+0

这种方法现在已经完全过时了,在surefire插件中进行了演变(请参阅user1034382答案)。 – romaintaz 2012-03-06 07:53:03

1

在阅读了一些博客文章和stackoverflow的问题后,我终于可以用surefire插件做这个工作,正如user1034382回答。在我的情况与版本2。17 maven-surefire-plugin。

我想补充我的两分钱,越达最新的解释可以在这里找到: Using JUnit Categories to group tests

但是你可以用下面的万无一失插件问题上运行:

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

,可以用这个其他stackoverflow问题/答案: Where should I put interface class for Junit @Category?

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