How to run JUnit tests by category in Maven?

前端 未结 8 1842
说谎
说谎 2020-11-28 21:59

Using JUnit 4.8 and the new @Category annotations, is there a way to choose a subset of categories to run with Maven\'s Surefire plugin?

For example I h

相关标签:
8条回答
  • 2020-11-28 22:10

    I had a similar case where I want to run all test EXCEPT a given category (for instance, because I have hundreds of legacy uncategorized tests, and I can't / don't want to modify each of them)

    The maven surefire plugin allows to exclude categories, for instance:

    <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>
    
    0 讨论(0)
  • 2020-11-28 22:11

    I was having issue running test with categories ex: @Category(com.mycompany.SlowTests.class) when running the test via mvn test -Dgroups=com.mycompany.SlowTests.class

    I discovered that tests in a classes without the word Test in their name would not run. After adding the word Test to the class the the tests in the class ran.

    0 讨论(0)
  • 2020-11-28 22:21

    Not exactly the same thing but using surefire plugin, test classes can be chosen based on file name. You are not using Junit Categories though.

    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

    0 讨论(0)
  • 2020-11-28 22:21

    Junit 5 allows you to use the @Tag annotation. More info about that here: https://www.baeldung.com/junit-filtering-tests

    I find it looks a little cleaner:

    @Tag("SlowTests")
    @Test
    public void b() {
    }
    
    0 讨论(0)
  • 2020-11-28 22:25

    Based on this blog post - and simplifying - add this to your 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>
    

    then at the command line

    mvn install -P SlowTests
    mvn install -P FastTests
    mvn install -P FastTests,SlowTests
    
    0 讨论(0)
  • 2020-11-28 22:26

    I lost lot of time on this error "groups/excludedGroups require TestNG or JUnit48+ on project test classpath" because I thought I was using a bad version of junit, or a bad version of the surefire plugin, or a combination that does not fit.

    It was none of that: in my project I had a "config" module that was built before the module I wanted to test. This module had no junit dependency -> it had no junit on the classpath...

    This mistake may help others...

    0 讨论(0)
提交回复
热议问题