如何在 Maven 中按类别运行 JUnit 测试?

使用 JUnit 4.8和新的 @Category注释,有没有一种方法可以选择一个类别子集来使用 Maven 的 Surefire 插件运行?

例如:

@Test
public void a() {
}


@Category(SlowTests.class)
@Test
public void b() {
}

并且我想运行所有非慢速测试,比如: (注意-Dtest.Category 是由我自己创建的...)。

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

So the point is that I don't want to have to create test suites (Maven just picks up all unit tests in the project which is very convenient) and I'd like Maven to be able to pick the tests by category. 我想我刚刚创建了-Dtest. 分类,所以我想知道是否有一个类似的工具,我可以使用?

64098 次浏览

虽然不完全相同,但是使用了 surefire 插件,可以根据文件名选择测试类。但是您并没有使用 Junit 类别。

An example for running just DAO tests.

<executions>
<execution>
<id>test-dao</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<excludes>
<exclude>none</exclude>
</excludes>
<includes>
<include>**/com/proy/core/dao/**/*Test.java</include>
</includes>
</configuration>
</execution>

Http://maven.apache.org/plugins/maven-surefire-plugin/examples/inclusion-exclusion.html

Maven has since been updated and can use categories.

一个来自 Surefire documentation:的例子

<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.11</version>
<configuration>
<groups>com.mycompany.SlowTests</groups>
</configuration>
</plugin>

这将运行带有注释 @Category(com.mycompany.SlowTests.class)的任何类

根据这个 博客文章-并简化-将它添加到 pom.xml:

<profiles>
<profile>
<id>SlowTests</id>
<properties>
<testcase.groups>com.example.SlowTests</testcase.groups>
</properties>
</profile>
<profile>
<id>FastTests</id>
<properties>
<testcase.groups>com.example.FastTests</testcase.groups>
</properties>
</profile>
</profiles>


<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.13</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>2.13</version>
</dependency>
</dependencies>
<configuration>
<groups>${testcase.groups}</groups>
</configuration>
</plugin>
</plugins>
</build>

然后在命令行

mvn install -P SlowTests
mvn install -P FastTests
mvn install -P FastTests,SlowTests

你可以用

mvn test -Dgroups="com.myapp.FastTests, com.myapp.SlowTests"

But ensure that you configure properly the maven surefire plugin

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.11</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>2.12.2</version>
</dependency>
</dependencies>
</plugin>

参见文档: https://maven.apache.org/surefire/maven-surefire-plugin/examples/junit.html

我有一个类似的例子,我想运行所有的测试,除了一个给定的类别(例如,因为我有数百个遗留的未分类测试,我不能/不想修改它们中的每一个)

Maven SureFire插件允许排除类别,例如:

<profiles>
<profile>
<id>NonSlowTests</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<excludedGroups>my.category.SlowTest</excludedGroups>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>

我在这个错误上浪费了很多时间,“ groups/excludedGroups need TestNG or JUnit48 + on project test classspath”,因为我认为我使用的是一个糟糕版本的 junit,或者一个糟糕版本的 surefire 插件,或者一个不适合的组合。

这些都不是: 在我的项目中,我有一个“ config”模块,它是在我想要测试的模块之前构建的。这个模块没有 junit 依赖项-> 它在类路径上没有 junit..。

这个错误可以帮助别人。

当通过 mvn test -Dgroups=com.mycompany.SlowTests.class运行测试时,我遇到了运行测试的问题,类别为: @Category(com.mycompany.SlowTests.class)

我发现,如果类的名称中没有 Test这个词,那么这个类中的测试就不会运行。在将单词 Test添加到类中之后,该类中的测试运行。

Junit 5允许你使用@Tag 注释: Https://www.baeldung.com/junit-filtering-tests

我发现它看起来更干净一点:

@Tag("SlowTests")
@Test
public void b() {
}

对于希望忽略某些测试 默认情况下,然后从命令行有条件地运行所有测试的用例,此设置将在 JUnit 4.9上运行。

首先创建标记界面:

public interface IntegrationTest {}

对要排除的测试进行注释:

@Category(IntegrationTest.class)
public class MyIntegrationTest() {}

Add plugins and profiles to pom.xml:

<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<!-- Read JUnit categories to be excluded from Maven property -->
<configuration>
<excludedGroups>${test.excluded.groups}</excludedGroups>
</configuration>
</plugin>
</plugins>
  

<profiles>
<profile>
<id>Default</id>
<!-- Set profile to be active by default -->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<test.excluded.groups>com.example.IntegrationTest</test.excluded.groups>
</properties>
</profile>
<profile>
<id>AllTest</id>
<!-- Set groups property to blank value which will match nothing -->
<properties>
<test.excluded.groups></test.excluded.groups>
</properties>
</profile>
</profiles>

当通常从命令行运行测试时,集成测试将被排除在外:

mvn test

包括集成测试在内的所有测试都可以通过相应的配置文件激活:

mvn test -P AllTest