开发者学堂课程【高校精品课-厦门大学 -JavaEE 平台技术:测试的例子】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/80/detail/15917
测试的例子
内容介绍:
一、Pom文件
二、Build部分
三、运行
一、Pom文件
先来看例子运行后的结果,该例子与之前 AutowiredDemo 例子相比更复杂,不仅包括了之前讲解的 SpringMVC 的内容,更重要的是包含了各种测试方法即单元测试、集成测试和切片测试,还包含了如何生成项目文档以及将项目文档部署到服务
器上的过程。
结合代码查看例子如何实现这些特性:
先来看 RestfulDemo 的 pom文件,该 pom 文件比之前的 AutowiredDemo 的pom 文件更复杂,因为在该功能中加入了合法性检查以及测试的内容,还需要在测试完成后生成各种各样的测试报告然后将测试结果包括工程整个结果发布到set服务
器上即项目工程的服务器上。
所以该 pom 文件与 AutowiredDemo 相比,可以看到首先增加了一个 validation的 starter
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</ dependency>
该 validation 的 starter 是在交换 validation 的标签,使用需要 starter
第二个是引入了一个 lombok 的 dependency
<dependency>
<groupId>org.projectlombok</ groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
因为代码中有 vo 对象,也有 model 对象,在 vo 对象与 model 对象中间并没有写入 set、get 方法,而是引入了一系列的 number 标签去自动生成这些代码,就是之前讲解的在 maven 生命周期的阶段会调用 project 的 lombok 库生成所需要的get、set 方法,包括 tostring 的方法和 equals 方法,所以这是引入 project lombok 的 maven 的依赖。在代码中没有 get、set、tostring 方法,所以在 idea中使用这些方法会发现有编译红线警告,但是编译和打包的过程依赖于 maven,所以有 maven 的依赖就不会在编译打包时出错。
为了去除代码中使用 get、set 方法产生的红线,可以在I DEA 中安装 Plugin,安装后就会消失。
因为要将结果产生 jackson,此处使用到 fasterxml 的 jackson 库:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.11.8</ version>
</ dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jdk8</artifactId>
<version>2.11.8</version>
</ dependency>
其中引入的 datatype-jsr310、datatype-jdk8是因为在 fasterxml 库中对于日期型的处理有问题,所以之后做了一个补丁,需要额外引入 fasterxml 的 jsr310和 jdk8使日期型能够写到 jackson 中。
之后是两个与 swagger 有关的 api 的文档
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</ artifactId>
<version>2.18.2</version>
</dependency>
在代码 GoodsController 文件中写有大量的文件注解,这些注解用来生成 swagger的文档 api,所以需要引入上述的两个 dependency 去生成 API
之后的两个 dependency 与日志有关
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</ dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</ dependency>
该工程其实引入了日志的机制,在合法性检查出错时会写一个日志,日志不是使用默认的日志,使用 logback 日志,是目前各种日志中最快的一种。所以在 depend中间引入了 logback 的 dependency,然后在 resources 目录下可以看到存在一个logback.xml 文件,就是 logback 日志的配置文件,配置文件的详细内容不做细解,配置文件中配置了两项,一项是在标准输出上看到的日志,另外也可以将日志写入文件中,因为在服务器上 sql 不可能时刻注意服务器去查看输出的日志,所以需要将日志写入文件中,在服务器调试时以及之后运行出错时都需要查看在服务器
上生成的日志文件。可以自行网上查询 logback.xml 的日志如何配置。
另外可以控制输出的级别,正常输出的级别在 INFO 甚至更高的级别例如可以控制到 WARNING 输出或者 ERROR 输出,这样级别越高输出的内容就越少。如果是在出错的情况下,会将级别降低到 INFO,因为级别降的越低,输出的日志越多。输出的日志对整个系统的性能存在影响,所以正常情况下会将日志的输出级别调到高
的档次使得输出的日志较少。
以上就是在该工程中引入的一些新的依赖包,在之后这些依赖包都是标配,此处先做了一个简要的介绍。继续查看 build 部分。
二、build部分
Build 部分加入了一个新的部分 jacoco:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>8.8.5</version>
<executions>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>post-unit-test</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</ goals>
<configuration>
<dataFile>target/jacoco.exec</dataFile>
<outputDirectory>target/site/jacoco-ut</outputDirectory>
</ configuration>
</execution>
</ executions>
</plugin>
jacoco 的 plugin 的主要作用是用来产生测试时代码覆盖率的报告,可以看到引入了jacoco 的 plugin 后定义了一个 execution,execution 指引入的 plugin 在生命周期的哪一个阶段去运行。第一个定义的 execution 是指运行的阶段 prepare-agent一定要运行,在运行前需要做该准备。第二个定义了一个 post-unit-test,定义了运行的阶段在 test阶段,所以当 default的 test阶段在运行时,除了默认的t est外还需要运行此处在 jacoco中所定义的 report目标。所以在阶段运行完后,在测试运行完后会运行 jacoco的 test,之后定义了会运行j acoco的 report,之后定
义了 report产生的东西代码,将所有数据放到 jacoco.exec文件中。
该数据无法看到,但实际上我们要看的是数据产生的html报告,将所有报告放在target/site/jacoco-ut 的目录下,当测试完成后就可以看到在 target/site/jacoco-ut下有测试覆盖率的 html报告。之后要将site目录中的所有内容发布到项目文档的服务器上即 set服务器上。
第三个可以看到在 build中加入了一个 site的 plugin:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>-maven-site-plugin</artifactId>
<version>3.9.1</version>
<configuration>
<locales>zh_CN</locales>
<outputEncoding>UTF-8</outputEncoding>
</configuration>
<dependencies>
<dependency>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>magon-webdav-jackrabbit</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.38</version>
</ dependency>
</dependencies>
</plugin>
</plugins>
</build>
使用 site-plugin发布文档,此处定义了字符语言类型中文 UTF-8字节码。因为要将工程发布到 niginx的 webdav的方式提供出的一个文件共享的服务上,所以上述使用到了 webdav-jackrabbit包,以及该包所依赖的 slf4j日志的输出。因为工程中我们使用的日志是 logback,但是此处使用的是 slf4j,所以要引入 slf4j在该 pom文件中使用。
在 build中可以看到除了正常的build外,需要做代码的覆盖率测试以及将最后的site 类定义成生成报告后要发到 nginx的 webdav服务器上,所以此处加入了两个plugin 的定义。
最后可以看到新加入了 reporting的定义:
<reporting>
<plugins>
<plugin>
<groupId>org.apache .maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.1.1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.2.8</version>
<configuration>
<encoding>
${project.reporting.outputEncoding}
</encoding>
</configuration>
<reportSets>
<reportSet><!-- by default,id = "default”- -->
<reports><!-- select non-aggregate reports -->
<report>javadocc/report>
</reports>
</reportSet>c/reportSets></plugin>
<plugin>
<groupId>org.apache.maven.plugiins</groupId>
<artifactId>maven-surefire-report-plugin</artifactId>
<version>3.0.0-M5</version>
<reportSets>
<reportSet>
<reports>
<report>report-only</report>
</reports>
</reportSet>
</reportSets>
</plugin>
</plugins>
</reporting>
reporting 定义在 site 中间定义一些更细的报告生成内容,除了 maven-site自己所提供的内容外,可以看到定义了 project-info-reports-plugin 的版本,不定义也可以,因为 plugin有默认在 site中的版本,但是会出 warning,所以此处进行定义版本号。
定义时要生成 javadoc,javadoc 是之前代码的注释,注释了每一个类和方法的定义。使用了 maven-javadoc-plugin去生成 javadoc的文档,该文档默认在site中的API的doc目录下,同样该文档生成后也需要发布到项目工程中。
此处定义了输出使用 project.reporting.outputEncoding,该定义写到了前面的属性中,在前面属性中定义了 reporting的outputEncoding是 UTF-8。
最后单元测试内容依靠 maven-surefire的 plugin,虽然在 build中没有进行定义,但是会进行默认,但是产生的是一系列 test文件和 xml文件,在网上不便于查看,因为要将最终结果发布到 webdav的服务器上,所以需要引入一个新的 plugin:
maven-surefire-report-plugin,该 plugin的作用是将前面 plugin所生成的数据文件生成一个html放到site目录下,所以定义了 plugin运行的目标和方式。其实可以代替测试,但是测试使用了之前的 surefire的 plugin,所以此处的 plugin只由数据产生报告,所以为 report-only。加入了一系列的 reporting,reporting 是一个新的部分,定义仅在 site 的阶段中才会使用。
其实在 reporting中间的所有的 plugin都可以放在 build中,当全部放入前面的build中会发现plugin多出一项。所以若想知道在 site中会产生什么样的结果,其实可以先放 到build中单独运行。运行成功后再放入 reporting中,这样在做site时就会运行在 reporting中所定义的 plugin生成所需要的项目文档。
最后新加入的部分是 distributionHanagement
<
distributionHanagement>
<site>
<id>siteserver</id>
<url>dav:http://172.16.4.192/webdav/RestFulDemo</url>
</site>
</distributionNanagenent>
定义要发布的项目文档的服务器,此处定义了一个 site,即一个服务器的 id、siteserver以及url(Url表明协议使用的是 dav协议在 http基础上)以及ip地址以及发过去的路径。注意site中间定义的 id需要最后在 maven的配置中定义的服务器的用户名和密码一致,在发布时才能使用 maven配置中的用户名和密码进行发布到此
处定义的 url的服务器上。
三、运行
以上是 pom的文件,有了 pom文件后运行工程。分成几个阶段进行运行,可以先进行 clear,将 maven之前的内容删除,使用 clear后可以看到上节所使用的整个目录被清空。不需要打包,因为该阶段只需做测试,运行测试时可以看到在前面内容中所使用的单元测试、集成测试以及切片测试都会运行,因为定义了多个测试,分别是在 Controller下 vo的单元测试以及对于 service的测试代码以及对于 Controller 的集成测试和切片测试。
单元测试可以看到前面没有启动一个 Spring Boot的标志,说明它不依赖于 Spring Boot 容器来完成测试。而切片测试和集成测试可以看到启动了一个 Spring Boot,然后才进行测试。
这是两种测试的差别,最后的测试结果会生成一个 surefile的 report文件来运行site阶段。Site 阶段会生成所有项目的文档,生成在 target目录下,如果是第一次运行会比较慢,因为需要从服务器上下载很多包。最后生成整个项目的文档,在前面测试时产生的结果生成一个 html文件放到 site目录下 surefile report文件。
Jacoco文件在之前已经生成,因为在定义了test阶段,所以test阶段完成后在site目录下查看 jacoco目录已经产生。这时就是产生的项目文档以及根据 surefile的单元测试所产生的单元测试的文档。
最后将例子使用 Spring boot运行,运行起来后在 local的8080端口 swagger打开api文档:
在网址中输入 Swagger UI -localhost:8080/swagger-ui.html
就可以看到使用 swagger的标签所产生的 api接口文档: