1. 黑盒代码覆盖率

白盒测试一般是写junit单元测试,然后在IDE中跑下单元测试,即可统计出代码覆盖率。该功能由IDE提供,IDEA和eclipse最近版本均有该功能。

黑盒测试则是统计一个正在运行的java程序,并统计其运行时间范围内,执行过的代码比例。它和白盒明显的不同是,它执行的代码都是正式的代码,并且由用户使用该系统的过程中动态触发,而不是像单元测试已经编排好。

1. 单次运行模式

本地模式指的一次完整的启动运行终止后,生成代码覆盖率报告。以下以一个常规的spring boot应用为例。

  1. 在本地编译打包my-spring-boot应用并启动起来。在my-spring-boot
    目录下执行mvn clean package -DskipTests,编译出target/my-spring-boot.jar文件。执行java -jar target/my-spring-boot.jar即可跑起项目。

  2. JaCoCo下载jacoco-0.8.2.zip文件,解压,将其中的lib/jacocoagent.jar复制到任意目录下,例如放在target目录下,然后执行:

    java -javaagent:target/jacocoagent.jar -jar target/my-spring-boot.jar

    没有异常的话,项目会和第1步启动一样,启动后正常进行访问。

  3. 当黑盒测试跑完后,就可以将项目java程序结束掉。结束后,会在项目启动目录下,生产一个jacoco.exec文件。该文件记录了执行的代码记录,还需要将该文件转换成html格式的报告。这时要用到jacoco压缩包中的jacococli.jar工具,将该jar包放到任意目录下,例如target目录下,然后执行:

    java -jar target/jacococli.jar report jacoco.exec --classfiles target/classes --html myreport --sourcefiles src/main/java/

    执行成功的话会输出大致如下信息:

     [INFO] Analyzing 16 classes.

    然后可以在目录下看到myreport目录,浏览器打开该目录的index.html文件。这个目录就是黑盒代码覆盖率报告。

2. 运行模式

上面的操作过程是使用jacoco默认的文件输出形式输出jacoco.exec文件。这种方式需要停止程序,同时在容器环境内一旦程序停止了,容器会自动被删除,jacoco.exec文件就难以拿到了。

因此,适合使用另外一种方式,tcpserver方式,可以在代码运行进行过程中,随时导出覆盖率报告。在java程序启动时指定输出方式:

java -javaagent:target/jacocoagent.jar=output=tcpserver -jar target/hello-world.jar

启动后,可以正常访问应用,可以看到多监听了一个6300端口。

java -jar jacococli.jar dump --address 127.0.0.1 --port 6300 --destfile jacoco.exec

拿到jacoco.exec之后,下面生成报告的过程就都一样了。

文档更新时间: 2019-02-19 16:42   作者:nick