2011-02-11 65 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?

我的答案是隻收集所有這些信息在這裏,並避免使用谷歌搜索/閱讀許多不同解決方案。至少,這對我有用。