SpringBoot 单元测试不执行:maven-surefire-plugin 版本问题

SpringBoot 单元测试不执行:maven-surefire-plugin 版本问题

 

问题现象

Spring Boot 项目,在编写单元测试时,使用了 JUnit 4.13.2 以上的版本。

为了让 Maven 能自动运行单元测试,需要引入 Maven Surefire 或 Maven Failsafe 插件。

项目中使用的 maven-surefire-plugin 版本号为 2.22.2,在通过 mvn clean package 打包编译时,没有执行单元测试。

在经过一系列的测试后,发现只有 2.21 及以下版本的 maven-surefire-plugin 可以正常运行单元测试。

解决方法

根据上面的分析,最直观的解决方法就是降低 maven-surefire-plugin 的版本号。

但作为一个程序开发人员,怎么能止步于此呢?

去看看 maven-surefire-plugin 插件的作用原理,它默认是按照如下逻辑去寻找 JUnit 并执行测试用例的:

if the JUnit version in the project >= 4.7 and the parallel attribute has ANY value
	use junit47 provider
if JUnit >= 4.0 is present
	use junit4 provider
else
	use junit3.8.1

如果不使用默认方式去查找 JUnit 的包,我们可以通过手动置顶内置的依赖,比如:

1、如果是 JUnit4.7 及以上版本,可以明确声明:


<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.2</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.maven.surefire</groupId>
            <artifactId>surefire-junit4</artifactId>
            <version>2.22.2</version>
        </dependency>
      <configuration>
          <skip>false</skip>
          <includes>
             <include>Sample.java</include>
          </includes>
        </configuration>
</dependencies> </plugin>

***同时必须引用 junit4.12以上版本***
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

 

 

2、JUnit 4.0 (含) 到 JUnit4 .7 (不含) 的版本,这样声明:

org.apache.maven.plugins maven-surefire-plugin 2.22.2 org.apache.maven.surefire surefire-junit4 2.22.2 ```

3、JUnit 3.8 (含) 到 JUnit 4.0 (不含) 的版本,这样声明:

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-surefire-plugin</artifactId>
	<version>2.22.2</version>
	<dependencies>
		<dependency>
			<groupId>org.apache.maven.surefire</groupId>
			<artifactId>surefire-junit3</artifactId>
			<version>2.22.2</version>
		</dependency>
	</dependencies>
</plugin>

4、JUnit 3.8 以下的版本,啊哦,surefire 已经不支持这么低版本的 JUnit 了,赶紧升级下 JUnit 的版本吧。

参考资料:

学习Maven之Maven Surefire Plugin(JUnit篇)

 

 

_____________________________________________________________________________________________________________________________

 

 

***Maven2插件surefire配置心得

博客分类:

https://www.iteye.com/blog/zk1878-1425260


1、不运行junit测试。

 

 <project>

  [...]

  <build>

    <plugins>

      <plugin>

        <groupId>org.apache.maven.plugins</groupId>

        <artifactId>maven-surefire-plugin</artifactId>

        <configuration>

          <skip>true</skip>

        </configuration>

      </plugin>

    </plugins>

  </build>

  [...]

</project>

 

2、指定要运行的junit测试。

 

默认时,只要是符合以下三种命名规则的junit测试都要运行:

 

1)命名以Test字符开头的类

 

2)命名以Test字符结尾的类

 

3)命名以TestCase字符结尾的类

 

如果我们只要运行其中的一个或者一组测试代码,需要按照以下方式配置:

 

<project>

  [...]

  <build>

    <plugins>

      <plugin>

        <groupId>org.apache.maven.plugins</groupId>

        <artifactId>maven-surefire-plugin</artifactId>

        <configuration>

          <includes>

            <include>Sample.java</include>

          </includes>

        </configuration>

      </plugin>

    </plugins>

  </build>

  [...]

</project>

3、指定不运行的junit测试。

<project>

  [...]

  <build>

    <plugins>

      <plugin>

        <groupId>org.apache.maven.plugins</groupId>

        <artifactId>maven-surefire-plugin</artifactId>

        <configuration>

          <excludes>

            <exclude>**/TestCircle.java</exclude>

            <exclude>**/TestSquare.java</exclude>

          </excludes>

        </configuration>

      </plugin>

    </plugins>

  </build>

  [...]

</project>

 

一、junit运行结果不影响package或者install。
 maven2打包前会运行junit,但是,有时我们希望即使出现了错误,也要打包。maven2的设计者已经考虑到这种情况了。pom.xml文件配置内容如下:
<project>
 [...]
 <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          <testFailureIgnore>true</testFailureIgnore>
        </configuration>
      </plugin>
    </plugins>
 </build>
 [...]
</project>
 
本文所有的说明均对surefire2.3版本。在pom.xml文件中配置Maven SureFire Plugin插件:
<project>
  [...]
  <build>
    <plugins>
      <plugging>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          ……
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>
可以在<configuration>……</configuration>中配置surefire插件的参数。本文以下内容均对configuration结点进行说明。
 

一、      必须的参数:

basedir

project路径。在测试用例中,可以用System.getProperty(“basedir”)获取basedir值。

testClassesDirectory

保存测试用例编译后的文件的路径。
默认值:target/test-classes

testSourceDirectory

保存测试用例源代码的路径。
默认值:src/test/java

二、      可选的参数

disableXmlReport

标识是否不生成xml格式的测试报告。
默认值:false

excludedGroups

要排除的测试组。任何在这里列出的测试组都不执行。

forkMode

可设置值有:never, once or always
默认:once.

groups

如果指定了,只有在组中的用例才会执行。

jvm

指定可运行的java虚拟机(或者指定可运行的java)。
默认:使用和maven相同的虚拟机。

printSummary

执行出错时是否打印错误信息。
默认:true

reportFormat

选择要生成的测试报告的格式。可设置值有:brief ,plain
默认:brief.

reportsDirectory

测试报告生成路径

skipExec

设置为true时,测试用例被编译,但是不会执行。

threadCount

执行时,指定可分配的线程数量。只和参数parallel配合使用有效。
默认:5.

trimStackTrace

是在测试报告中调整堆栈跟踪信息的行数,还是显示所有的跟踪信息。
默认:true

useFile

生成测试报告还是只输出到控制台。
默认:true.

 

 

1、不运行junit测试。

 

 <project>

  [...]

  <build>

    <plugins>

      <plugin>

        <groupId>org.apache.maven.plugins</groupId>

        <artifactId>maven-surefire-plugin</artifactId>

        <configuration>

          <skip>true</skip>

        </configuration>

      </plugin>

    </plugins>

  </build>

  [...]

</project>

 

2、指定要运行的junit测试。

 

默认时,只要是符合以下三种命名规则的junit测试都要运行:

 

1)命名以Test字符开头的类

 

2)命名以Test字符结尾的类

 

3)命名以TestCase字符结尾的类

 

如果我们只要运行其中的一个或者一组测试代码,需要按照以下方式配置:

 

<project>

  [...]

  <build>

    <plugins>

      <plugin>

        <groupId>org.apache.maven.plugins</groupId>

        <artifactId>maven-surefire-plugin</artifactId>

        <configuration>

          <includes>

            <include>Sample.java</include>

          </includes>

        </configuration>

      </plugin>

    </plugins>

  </build>

  [...]

</project>

3、指定不运行的junit测试。

<project>

  [...]

  <build>

    <plugins>

      <plugin>

        <groupId>org.apache.maven.plugins</groupId>

        <artifactId>maven-surefire-plugin</artifactId>

        <configuration>

          <excludes>

            <exclude>**/TestCircle.java</exclude>

            <exclude>**/TestSquare.java</exclude>

          </excludes>

        </configuration>

      </plugin>

    </plugins>

  </build>

  [...]

</project>

posted @ 2023-08-03 09:38  kelelipeng  阅读(1880)  评论(0编辑  收藏  举报