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


72

使用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,所以我想知道是否可以使用类似的工具?


有关更多详细信息,请参见混合testng和junit。从maven-surefire-plugin版本2.11开始受支持
Andrzej Jozwik'2

它没有直接关系,但是这是一种计算“类别测试”计数器的方法
Bsquare

Answers:


75

此后,Maven已更新,可以使用类别。

Surefire文档中的示例

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

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


8
2.11版不适用于我,因为Surefire一直忽略我指定的组。升级到surefire插件版本2.12.3可以解决问题
Stefan Haberl 2012年

7
但是如何针对不同类别进行多种配置?也就是说,OP希望能够在命令行上指定类别,但是如果在POM中指定了类别,那么如何在命令行上指定类别呢?
亚当·帕金

1
注意!2.11版会忽略组!在maven.apache.org/surefire/maven-surefire-plugin/examples / ...下提供的示例仍然不正确!
Heezer 2013年

1
还有一个excludedGroups选项,请参阅:maven.apache.org/surefire/maven-surefire-plugin/...
dedek

如果要在pom文件中运行特定的测试,是否需要使用groups标记?
2Big2BeSmall

48

根据此博客文章(并简化),将其添加到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版本不适用于我。我收到此错误:尽管我使用的是Junit 4.11,但“组/排除的组在项目测试类路径上需要TestNG或JUnit48 +”。将surefire插件降级到2.12.2可解决该错误。
Taoufik Mohdit 2014年

使用Surefire 2.17版对我有用。我必须将org.apache.maven.surefire:surefire-junit47:2.13依赖项更改为org.apache.maven.surefire:common-junit48:2.17。
Kkkev

真好 与maven-surefire-plugin:2.2.22你不需要surefire-junit47依赖。当然可以运行mvn test -P SlowTests
youri

22

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

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>

您会设置只运行特定组的热点吗?
2Big2BeSmall

1
@Francy只是使用相应的配置文件运行,此示例中:mvn test -P NonSlowTests
Joel

您可以排除多个组吗?
David DeMar

我想你可以,昏迷分居者,给它的命名“excludedGroups”
乔尔

9

您可以使用

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


6

我在此错误上浪费了很多时间,“组/排除的组在项目测试类路径上需要TestNG或JUnit48 +”是因为我以为我使用的是junit的错误版本,surefire插件的错误版本或不合适的组合。

没什么:在我的项目中,我有一个“ config”模块,该模块在我要测试的模块之前构建。该模块没有junit依赖关系->在类路径上没有junit ...

这个错误可能会帮助别人...


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


0

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

我发现没有Test名称的单词的类中的测试将无法运行。在将单词添加Test到班级后,班级中的测试便开始了。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.