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

时间:2010-06-23 10:48:00

标签: java maven junit categories maven-surefire-plugin

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

9 个答案:

答案 0 :(得分:73)

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)

的任何类

答案 1 :(得分:43)

基于此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

答案 2 :(得分:20)

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

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>

答案 3 :(得分: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

中的文档

答案 4 :(得分:4)

我在这个错误上浪费了很多时间&#34; groups / excludedGroups在项目测试类路径上需要TestNG或JUnit48 +&#34;因为我以为我使用的是junit的坏版本,或者是版本不合适的插件,或者是不合适的组合。

没有那个:在我的项目中,我有一个&#34; config&#34;在我想测试的模块之前构建的模块。该模块没有junit依赖 - &gt;它在类路径上没有任何关键...

这个错误可能有助于其他人......

答案 5 :(得分: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

答案 6 :(得分:0)

通过UseOpenIdConnectAuthentication进行测试时,我在运行类别为Startup.cs的测试时遇到问题

我发现在名称中没有单词public void ConfigureKeyCloak(IAppBuilder app) { JwtSecurityTokenHandler.DefaultInboundClaimTypeMap = new Dictionary<string, string>(); app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = "Cookies" }); app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions { ClientId = clientid, Authority = url, RedirectUri = redirect, PostLogoutRedirectUri = redirect, ClientSecret = "20a0b258-b908-4ba4-846b-2b23a6c4a009", SignInAsAuthenticationType = "Cookies", RequireHttpsMetadata = false, Notifications = new OpenIdConnectAuthenticationNotifications { AuthorizationCodeReceived = async (context) => { string authorizationCode = context.Code; } } }); } 的类中的测试无法运行。在将- (void)Visual02Menu:(id)sender { if (!visual02Window) { visual02Window = [[Visual02 alloc] initWithWindowNibName:@"Visual02"]; } [visual01Window close]; [visual02Window showWindow:self]; 一词添加到该类后,该类中的测试便开始运行。

答案 7 :(得分:0)

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

我发现它看起来更干净:

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

答案 8 :(得分:0)

对于您希望在默认情况下忽略某些测试然后有条件地从命令行运行所有测试的用例,此设置将适用于 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