首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Maven运行来自@类别的所有测试

使用Maven运行来自@类别的所有测试
EN

Stack Overflow用户
提问于 2011-02-11 14:34:11
回答 3查看 6.5K关注 0票数 6

我只想运行我的单元测试的子集,这些测试是由特定的@Category定义的。

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

我的问题的解决办法似乎是由ClasspathSuite项目提供的。所以我开始编写NewTestOldTest接口来定义我的测试类别。然后,我创建了AllTests套件:

代码语言:javascript
运行
复制
@RunWith(ClasspathSuite.class)
public class AllTests { }

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

代码语言:javascript
运行
复制
@RunWith(Categories.class)
@IncludeCategory(NewTest.class)
@SuiteClasses( { AllTests.class })
public class AllNewTests { }

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

代码语言:javascript
运行
复制
@Category(NewTest.class)
public class SomeNewTests {
    // some tests...
}

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

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

代码语言:javascript
运行
复制
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返回一个错误

代码语言:javascript
运行
复制
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] ------------------------------------------------------------------------

引发的异常如下:

代码语言:javascript
运行
复制
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)

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-15 23:30:13

作为一个更新:现在支持JUnit 4.8+样式类别,这是一个可以肯定的插件版本2.11。

“保险”2.11版的发布说明提到了新特性。测试目标可以使用群组进行配置。

票数 6
EN

Stack Overflow用户

发布于 2011-04-15 08:48:50

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

这个想法与classpath项目的原则很接近,即寻找类路径中存在的类,并且只保留那些使用给定注释进行注释的类(例如@NewTest)。

如果你感兴趣,你可以阅读我博客上的全部故事

票数 4
EN

Stack Overflow用户

发布于 2014-04-23 11:11:18

在阅读了一些博客文章和堆叠溢出的问题后,我终于能够用尽是火的插件完成这项工作,正如user1034382所回答的那样。在我的例子中,2.17版本的maven-surefire-plugin。

再加上我的两分钱,就可以在这里找到更最新的解释:使用JUnit类别对测试进行分组

但是,您可能会遇到以下肯定的插件问题:

代码语言:javascript
运行
复制
[ERROR] java.lang.RuntimeException: Unable to load category:

可以用另一个堆栈溢出问题/答案来修正:我应该把Junit @ class的接口类放在哪里?

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4970196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档