使用JUnit 4.8和新@Category注释,有没有办法选择与Maven的Surefire插件一起运行的类别子集?
例如,我有:
@Test
public void a() {
}
@Category(SlowTests.class)
@Test
public void b() {
}
Run Code Online (Sandbox Code Playgroud)
我想按照以下方式运行所有非慢速测试:(注意-Dtest.categories由我组成......).
mvn test -Dtest.categories=!SlowTests // run non-slow tests
mvn test -Dtest.categories=SlowTests // run only slow tests
mvn test -Dtest.categories=SlowTests,FastTests // run only slow tests and fast tests
mvn test // run all tests, including non-categorized
Run Code Online (Sandbox Code Playgroud)
所以重点是我不想创建测试套件(Maven只是在项目中选择了非常方便的所有单元测试)并且我希望Maven能够按类别选择测试.我想我刚编了-Dtest.categories,所以我想知道是否有类似的设施我可以使用?
我在类似于本答案中描述的设置中使用JUnit Categories和ClassPathSuite .回顾一下:
public interface FastTests {
}
@RunWith(Categories.class)
@Categories.IncludeCategory(FastTests.class)
@Suite.SuiteClasses(AllTests.class)
public class FastTestSuite {
}
@RunWith(ClasspathSuite.class)
public class AllTests {
}
Run Code Online (Sandbox Code Playgroud)
... AllTests使用ClasspathSuite库.
属于FastTests类别的测试类如下所示:
@Category(FastTests.class)
public class StringUtilsTest {
// ...
}
Run Code Online (Sandbox Code Playgroud)
当我在IDE中运行"FastTestSuite"时,所有使用FastTests注释的测试都会执行,非常流畅:

现在,我想用Ant做同样的事情.(令我惊讶的是,我无法在SO上轻松找到相关说明.)换句话说,我需要一个使用FastTests注释运行所有测试的Ant目标.
我试过一些简单的方法使用<test>或<batchtest>...
<junit showoutput="true" printsummary="yes">
<test name="fi.foobar.FastTestSuite"/>
<formatter type="xml"/>
<classpath refid="test.classpath"/>
</junit>
Run Code Online (Sandbox Code Playgroud)
......但到目前为止没有运气.
编辑:除了IDE,它在命令行上与JUnitCore一起正常工作:
$ java -classpath "classes:WebContent/WEB-INF/lib/*" org.junit.runner.JUnitCore fi.foobar.FastTestSuite
.............
Time: 0.189
OK (13 tests)
Run Code Online (Sandbox Code Playgroud) 我需要进行一些套件初始化(启动Web服务器).它运行正常,除了当我在eclipse中运行我的项目中的所有测试时,我的测试运行了两次.我的测试套件看起来有点像这样:
@RunWith(Suite.class)
@Suite.SuiteClasses({
SubtestOne.class,
SubtestTwo.class
})
public class TestSuite
{
[...]
}
public class SubtestOne
{
@Test public void testOne() { [...] }
}
public class SubtestTwo
{
@Test public void testTwo() { [...] }
}
Run Code Online (Sandbox Code Playgroud)
当我在eclipse中运行项目中的所有测试时,这导致junit插件运行测试两次,如下所示:
是否可以使"在项目中运行所有测试"不进行两次子测试?我希望我的子测试只能作为套件的一部分运行.
在具有多个@Test注释的JUnit测试用例中,如何有选择地运行测试?
例如,从以下代码中,如何运行一个测试方法?
@Test
public void testHelloEmpty()
{
assertEquals(h.getName(),"");
assertEquals(h.getMessage(),"Hello!");
}
@Test
public void testHelloWorld()
{
// h.setName("World");
assertEquals(h.getName(),"World");
assertEquals(h.getMessage(),"Hello World!");
}
Run Code Online (Sandbox Code Playgroud)
我试图突出显示一个@Test方法并尝试运行它,但它不能那样工作.
给出问题'如何运行属于某个类别的所有测试?' 答案是以下方法对测试组织更好吗?
例:
我的问题更像是征求这种方法与经典测试套件方法的批准率.一个无与伦比的好处是每个新测试都立即被相关套房包含,没有套件维护.一个问题是每个测试的正确分类.
我想知道是否可以在gradle测试任务中指定@category.所以,我可以单独运行集成junits和正常的junit测试.
我知道目前在gradle中没有对@category的明确支持,我正在寻找这种限制的解决方法.
直接的方法是为不同的测试类别定义测试套件,例如,如何在JUnit 4中运行属于某个类别的所有测试.我更愿意在我的gradle脚本中指定@category.
我使用Java,Selenium,Junit,Maven开发了一整套自动化测试.
对于每个测试,它们都有一个或多个@Category注释,描述每个测试涵盖的软件区域.例如:
@Test
@Category({com.example.core.categories.Priority1.class,
com.example.core.categories.Export.class,
com.example.core.categories.MemberData.class})
@Test
@Category({com.example.core.categories.Priority1.class,
com.example.core.categories.Import.class,
com.example.core.categories.MemberData.class})
@Test
@Ignore
@Category({com.example.core.categories.Priority2.class,
com.example.core.categories.Import.class,
com.example.core.categories.MemberData.class})
Run Code Online (Sandbox Code Playgroud)
我正在尝试做的是找到一种方法来计算包含任何给定类别的测试数量.所有可能的类别都是文件//com/example/core/categories夹中的文件名作为源列表.
我已经尝试构建一个shell脚本来进行单词计数,这似乎工作正常,但我认为会有更多"内置"来处理@Category.
我最大的问题是,即使我得到正确的计数,很可能一个或多个测试被标记为@Ignore,这应该使测试@ Category的无效但没有大量使用标志并逐行读取每个文件为了它丢掉正确的计数.
是否有一个很好的方法来逐项列出@Ignore中的@ Category?
示例输出
| Category | Count |
|----------------------------------------------|------:|
| com.example.core.categories.Export.class | 1 |
| com.example.core.categories.Import.class | 1 |
| com.example.core.categories.MemberData.class | 2 |
| com.example.core.categories.Priority1.class | 2 |
| com.example.core.categories.Priority2.class | 0 |
| com.example.core.categories.Priority3.class | 0 |
Run Code Online (Sandbox Code Playgroud) 在我们的项目中,我们目前有大量(junit)测试,分为三类:单元,集成,检票口.
我现在想要对这些测试进行分组,以便我只能运行其中一个(或两个)类别.我发现的唯一的东西是junit测试套件和类别,如下所述:http://www.wakaleo.com/component/content/article/267
我的问题是,我不想用@SuiteClasses在Test Suits中声明每一个测试.
有没有办法添加带有通配符/模式的套件类?
如何从命令行运行Junit 4.8.1测试套件?另外我想使用JUnit 4.8引入的类别,有没有一种方法可以从命令行指定我想要运行的类别.
我想只运行我的单元测试的一个子集,由特定的测试定义@Category.
所以我读了几个SO问题,比如这个(这正是我要找的),还有这个问题.
我的问题的解决方案似乎是由ClasspathSuite项目提供的.所以我开始编写定义我的测试类别的接口NewTest和OldTest接口.然后,我创建了AllTests套件:
@RunWith(ClasspathSuite.class)
public class AllTests { }
Run Code Online (Sandbox Code Playgroud)
之后,我创建了一个AllNewTests套件:
@RunWith(Categories.class)
@IncludeCategory(NewTest.class)
@SuiteClasses( { AllTests.class })
public class AllNewTests { }
Run Code Online (Sandbox Code Playgroud)
最后,我创建了两个JUnit类,每个类别一个:
@Category(NewTest.class)
public class SomeNewTests {
// some tests...
}
@Category(OldTest.class)
public class SomeOldTests {
// some tests...
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我运行AllTests,Eclipse会启动我项目的所有测试,而Maven会因为没有找到测试而失败:
mvn test -Dtest=AllTests
...
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running my.company.AllTests
Tests run: 0, Failures: 0, Errors: 0, Skipped: …Run Code Online (Sandbox Code Playgroud) junit ×10
java ×8
junit4 ×4
categories ×3
eclipse ×2
maven ×2
ant ×1
command-line ×1
gradle ×1
surefire ×1
test-suite ×1
unit-testing ×1