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

Junit 使用Maven从@Category运行所有测试,junit,maven,categories,surefire,Junit,Maven,Categories,Surefire,我只想运行我的单元测试的一个子集,这些测试是由特定的@类别定义的 所以我读了几个问题,比如(这正是我要找的),还有 解决我问题的办法似乎是由政府提供的。所以我开始编写NewTest和OldTest接口来定义我的测试类别。然后,我创建了AllTests套件: @RunWith(ClasspathSuite.class) public class AllTests { } @RunWith(Categories.class) @IncludeCategory(NewTest.class) @Sui

我只想运行我的单元测试的一个子集,这些测试是由特定的
@类别定义的

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

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

@RunWith(ClasspathSuite.class)
public class AllTests { }
@RunWith(Categories.class)
@IncludeCategory(NewTest.class)
@SuiteClasses( { AllTests.class })
public class AllNewTests { }
之后,我创建了一个
AllNewTests
套件:

@RunWith(ClasspathSuite.class)
public class AllTests { }
@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] ------------------------------------------------------------------------
mvn测试-Dtest=AllNewTests
...
-------------------------------------------------------
T T S T S
-------------------------------------------------------
管理我的公司所有新测试

测试运行:1,失败:0,错误:1,跳过:0,运行时间:0.125秒我通过创建自己的
JUnit Runner
,扩展了
套件,解决了我的问题

这个想法与Classpath套件项目的原理很接近,即查找Classpath中存在的类,并只保留使用给定注释注释的类(例如,
@NewTest


如果您感兴趣,可以阅读。

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


网站提到了新功能。surefire:test目标可以使用进行配置。

在阅读了一些博客文章和stackoverflow问题后,我终于能够使用surefire插件实现这一点,正如用户1034382所回答的那样。在我的例子中,是maven surefire插件的2.17版

再加上我的两分钱,更多最新的解释可以在这里找到:

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

[ERROR] java.lang.RuntimeException: Unable to load category:
可通过其他stackoverflow问题/答案解决的问题:


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

你真的成功了吗?很抱歉,我似乎无法让它工作。Surefire(2.11/2.12)似乎忽视了群体。它只是运行所有测试。@JanGoyvaerts这是一个bug,现在已经修复了。事实上,要运行2.11和2.12中的类别,必须指定对junit47提供程序(surefire-junit47)的依赖关系。这在2.13-SNAPSHOT中得到了修复,应该可以在没有显式依赖的情况下工作。正如您所说,我最终使它工作了。但是提供商有一个很大的性能问题。当测试持续时间过长时,它会缓冲日志(这还不错),并消耗所有内存和cpu。因此,我切换到命名约定-因为它本来就是这样。这是没有问题的。我已经指出了这个问题。这个方法现在已经完全过时了,在surefire插件中进行了改进(参见user1034382答案)。