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

Posted

技术标签:

【中文标题】如何在 Maven 中按类别运行 JUnit 测试?【英文标题】:How to run JUnit tests by category in Maven? 【发布时间】:2011-03-07 06:25:20 【问题描述】:

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

例如我有:

@Test
public void a() 


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

我想运行所有非慢速测试,如下所示:(请注意,-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

所以重点是我不想创建测试套件(Maven 只选择项目中的所有单元测试,这非常方便),我希望 Maven 能够按类别选择测试. 我想我只是编造了 -Dtest.categories,所以我想知道是否有类似的工具可以使用?

【问题讨论】:

请参阅Mixing testng and junit 了解更多详情。从 maven-surefire-plugin 版本 2.11 开始支持类别 没有直接关系,但这是compute 'Tests by Category' counter的一种方式。 【参考方案1】:

不完全一样,但使用surefire插件,可以根据文件名选择测试类。不过,您没有使用 Junit 类别。

仅运行 DAO 测试的示例。

<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

【讨论】:

【参考方案2】:

Maven 已经更新并且可以使用类别。

来自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) 的任何类

【讨论】:

2.11 版对我不起作用,因为 Surefire 一直忽略我指定的组。升级到 surefire 插件版本 2.12.3 成功了 如何为不同的类别进行多种配置?即OP希望能够在命令行中指定一个类别,但是如果在POM中指定了该类别,那么如何在命令行中指定一个呢? 注意! 2.11 版忽略组!在maven.apache.org/surefire/maven-surefire-plugin/examples/… 下提供的示例仍然不正确! 还有excludedGroups选项,见:maven.apache.org/surefire/maven-surefire-plugin/… 我是否必须使用组标签 - 如果我想在我的 pom 文件中运行特定的测试?【参考方案3】:

基于此blog post - 并简化 - 将其添加到您的 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

【讨论】:

surefire 插件的 2.13 版对我不起作用。我收到此错误:“组/排除组在项目测试类路径上需要 TestNG 或 JUnit48+”,尽管我使用的是 Junit 4.11。将surefire插件降级到2.12.2解决了这个错误。 这对我有用,使用的是 2.17 版的 Surefire。我不得不将 org.apache.maven.surefire:surefire-junit47:2.13 依赖项更改为 org.apache.maven.surefire:common-junit48:2.17。 不错。使用 maven-surefire-plugin:2.2.22 您不需要 surefire-junit47 依赖项。当然可以运行mvn test -P SlowTests【参考方案4】:

你可以使用

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

但请确保您正确配置了 maven surefire 插件

<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

【讨论】:

【参考方案5】:

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

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>

【讨论】:

热你会设置为只运行一个特定的组吗? @Francy 只需使用相应的配置文件运行,来自此示例: mvn test -P NonSlowTests 可以排除多个组吗? 我猜你可以,逗号分隔,因为它被命名为“excludedGroups”【参考方案6】:

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

并非如此:在我的项目中,我有一个“配置”模块,它是在我想要测试的模块之前构建的。这个模块没有junit依赖->它在类路径上没有junit...

这个错误可能对其他人有所帮助...

【讨论】:

【参考方案7】:

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

我发现名称中没有单词Test 的类中的测试将无法运行。将单词Test 添加到类后,类中的测试运行。

【讨论】:

【参考方案8】:

Junit 5 允许您使用 @Tag 注释。关于这里的更多信息: https://www.baeldung.com/junit-filtering-tests

我觉得它看起来更干净一点:

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

【讨论】:

【参考方案9】:

对于您想要默认忽略某些测试然后有条件地从命令行运行所有测试的用例,此设置将适用于JUnit 4.9

首先创建标记界面:

public interface IntegrationTest 

注释要排除的测试:

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

将插件和配置文件添加到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

【讨论】:

以上是关于如何在 Maven 中按类别运行 JUnit 测试?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JUnit4 中按特定顺序运行测试方法?

在Maven项目中运行JUnit 5测试用例

如何使用 JVM 参数在终端中通过 maven 运行 junit 测试

如何在没有 Maven 的情况下同时运行 Eclipse Java 项目的所有 JUnit 测试?

如何在ScalaTest中按顺序运行类中的测试?

如何同时使用 maven 和 jUnit 测试?