您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Maven 单元测试

在我们平时开发的过程中,测试环节是永远不能避免的。那我们如何能够的进行单元测试呢,如何更方便的看到测试结果呢?个过程中,Maven 也能够为我们提供帮助,那我们来看看 Maven 如何在测试环节来辅助我们的。

这里面我们在 mall-order 模块中订单的,这个后会 OrderEntity 对象,里面订单编号(orderNuM)和订单所有者(orderOwner)两个字段。(这里我们仅仅是用来模拟单元测试,对业务的具体逻辑不做过多纠结)

首先,我们在 mall-order 模块的 pom.xml 中需要的依赖。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
</dependency>

依赖后,我们在项目中创建 service 目录和 entity 目录,分别用于存放项目的服务层和。

并且在对应的测试目录中,该服务层的测试类 OrderServiceTest

完成后,我们可以执行该测试用例,来调试 OrderService 中的 generateOrder

从调试结果来看,我们的被成功,并且没有异常。

后来,随着我们项目的不断进行,我们开发的也随之不断增多,相应的,不同的测试用例也在不断的增多。这个时候,如果单纯的靠开发人员手工去点击每测试用例,这显然是不合理的。

那么我们就可以借助 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] ------------------------------------------------------------------------

从执行结果,我们可以看出,一共执行了三个测试用例,没有失败,也没有报错的情况出现。

其实每一项新的操作一般都会伴随一些问题产生。例如,我们在实际的开发过程中,有些时候只是改动了一处,但是如果直接执行 mvn test 命令的话,会将整个项目的测试用例全部都执行一遍,这对于我们来说,是有些得不偿失的,没必要因为一处改动,而去测试其他几十个或者几百个测试用例。

那我们应该怎么办呢? 这里我们为了演示,写了两个测试类,OrderServiceTestOrderService2Test,其中第类中,有两个测试用例,第二个类中,只有测试用例。

这时候,我们了第二个类中测试用例对应的,需要重新进行单元测试。我们可以直接执行命令:mvn test -Dtest=OrderService2Test

[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] ------------------------------------------------------------------------

从结构来看,我们这里只执行了第二个测试类中的测试用例。

换到另外场景,构建项目的时候。在平时的开发过程中,我们经常会使用mvn package构建项目,但是如果这个项目比较庞大,测试用例会非常多,那么执行测试用例的过程就会非常耗时。那怎么办呢,test 阶段在 package 阶段之前,如果直接执行 package 阶段,test 阶段势必会被执行到。

这个时候我们可以跳过测试来构建项目。(当然,这样的做法是不被建议的)

在执行构建命令的时候,参数来指定跳过测试即可,mvn package -DskipTests 或者 mvn package -Dmaven.test.skip=true

这两个命令虽然都能够在构建项目的时候跳过测试,但还是有些区别的。

Maven 的认配置中,会在 target\surefire-reports 目录下测试报告。

我们执行 mvn clean test,就可以观察到该目录。

我们可以在 txt 格式的文档中看到的测试报告。这里的测试报告基本上和控制台的是类似的。

大家可能也注意到了,我们在执行测试用例的时候,同时了两种类型的,一种是 txt 格式,另则是 XML 格式。

说了这么多,其实 Maven 之所以可以帮助我们执行测试用例,还是依靠 maven-surefire-plugin 来实现的。在学过 Maven 的生命周期之后,我们知道的都是通过目标来实现的,而不同的目标则会和生命周期中的不同阶段进行绑定。这里,生命周期中的 test 阶段就是和 maven-surefire-plugin 的 test 目标进行绑定的。

对于 Maven 来说,我们可以不指定或者的声明该。

在声明的时候,我可以通过 conuration 的方式来实现刚刚执行命令的。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.17</version>
            <conuration>
            	<skipTests>true</skipTests>
            </conuration>
        </plugin>
    </plugins>
</build>

例如我们在 conuration 中 skipTests 节点,则可以认跳过测试。当我们再次执行mvn package命令构建项目的时候,test 阶段是不会被执行的。

当然,我们也可以在 conuration 中 include 节点和 exclude 节点,来控制执行的测试类。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.17</version>
    <conuration>
        <includes>
        	<include>**/OrderServiceTest.java</include>
        </includes>
        <excludes>
        	<exclude>**/OrderService2Test.java</exclude>
        </excludes>
    </conuration>
</plugin>

此时,我们再次执行mvn test的时候会发现只有OrderServiceTest.java类中的测试用例被执行了。

在本节的学习中,我们简单介绍了如何编写测试用例,Maven 如何的执行测试用例,以及在执行测试用例的过程中的一些技巧,比如跳过测试。最后我们还介绍了 maven-surefire-plugin 的简单使用。通过本节的学习,我们可以使用 Maven 轻松的进行化测试。


联系我
置顶