Maven 单元测试
在我们平时开发的过程中,测试环节是永远不能避免的。那我们如何能够快速的进行单元测试呢,如何更方便的看到测试结果呢?在这个过程中,Maven 也能够为我们提供帮助,那我们来看看 Maven 如何在测试环节来辅助我们的。
1. 使用 Maven 进行单元测试
这里面我们在 mall-order 模块中增加生成订单的方法,这个方法调用后会生成一个 OrderEntity 对象,里面包括订单编号(orderNuM)和订单所有者(orderOwner)两个字段。(这里我们仅仅是用来模拟单元测试,对业务的具体逻辑不做过多纠结)
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
完成后,我们可以执行该测试用例,来调试 OrderService
中的 generateOrder
方法。
1.2 借助 Maven 进行单元测试
那么我们就可以借助 Maven 来帮助我们做这件事情,来进行自动化的单元测试。
例如在 mall-order 模块下, 我们想要执行所有的单元测试用例,那么我们只需要进入到该模块的根目录下,执行 mvn test
命令即可。
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------< com.mic.tech:mall-order >-----------------------
[INFO] Building mall-order .-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] ...
[INFO] --- maven-surefire-plugin:.:test (default-test) @ mall-order ---
[INFO] Surefire report directory: D:\code\mall-aggregate\mall-order\target\surefire-reports
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.mic.tech.OrderServiceTest
...
Results :
Tests run: , Failures: , Errors: , Skipped:
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: s
[INFO] Finished at: --20T23::+:
[INFO] ------------------------------------------------------------------------
从执行结果,我们可以看出,一共执行了三个测试用例,没有失败,也没有报错的情况出现。
2. 跳过测试
2.1 指定测试用例进行测试
其实每一项新的操作一般都会伴随一些问题产生。例如,我们在实际的开发过程中,有些时候只是改动了一处代码,但是如果直接执行 mvn test
命令的话,会将整个项目的测试用例全部都执行一遍,这对于我们来说,是有些得不偿失的,没必要因为一处改动,而去测试其他几十个或者几百个测试用例。
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------< com.mic.tech:mall-order >-----------------------
[INFO] Building mall-order .-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] ...
[INFO] --- maven-surefire-plugin:.:test (default-test) @ mall-order ---
[INFO] Surefire report directory: D:\code\mall-aggregate\mall-order\target\surefire-reports
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.mic.tech.OrderService2Test
...
Results :
Tests run: , Failures: , Errors: , Skipped:
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: s
[INFO] Finished at: --21T22::+:
[INFO] ------------------------------------------------------------------------
从结构来看,我们这里只执行了第二个测试类中的测试用例。
2.2 跳过测试
换到另外一个场景,构建项目的时候。在平时的开发过程中,我们经常会使用mvn package
构建项目,但是如果这个项目比较庞大,测试用例会非常多,那么执行测试用例的过程就会非常耗时。那怎么办呢,test 阶段在 package 阶段之前,如果直接执行 package 阶段,test 阶段势必会被执行到。
这个时候我们可以跳过测试来构建项目。(当然,这样的做法是不被建议的)
在执行构建命令的时候,添加参数来指定跳过测试即可,mvn package -DskipTests
或者 mvn package -Dmaven.test.skip=true
。
这两个命令虽然都能够在构建项目的时候跳过测试,但还是有些区别的。
- -DskipTests: 会编译测试类;
- -Dmaven.test.skip=true: 不会编译测试类。
我们执行 mvn clean test
,就可以观察到该目录生成。
- txt 格式: 为了让执行测试用例的开发者更加直观的看到测试用例的运行结果;
- XML格式: 更多的是为了支持其他工具的解析。
4. maven-surefire-plugin
说了这么多,其实 Maven 之所以可以帮助我们自动执行测试用例,还是依靠 maven-surefire-plugin 插件来实现的。在学过 Maven 的生命周期之后,我们知道一个插件的功能都是通过目标来实现的,而不同的目标则会和生命周期中的不同阶段进行绑定。这里,生命周期中的 test 阶段就是和 maven-surefire-plugin 插件的 test 目标进行绑定的。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.17</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.17</version>
<configuration>
<includes>
<include>**/OrderServiceTest.java</include>
</includes>
<excludes>
<exclude>**/OrderService2Test.java</exclude>
</excludes>
</configuration>
</plugin>
此时,我们再次执行mvn test
的时候会发现只有OrderServiceTest.java
类中的测试用例被执行了。