覆盖率的意义
1、分析未覆盖部分的代码,从而反推在前期测试设计是否充分,没有覆盖到的代码是否是测试设计的盲点
2、检测出程序中的废代码,可以逆向反推在代码设计中思维混乱点,提醒设计/开发人员理清代码逻辑关系,提升代码质量。
3、代码覆盖率高不能说明代码质量高,但是反过来看,代码覆盖率低,代码质量不会高到哪里去,可以作为测试自我审视的重要工具之一。
工作流程
1、对 Java 字节码进行插桩,On-The-Fly 和 Offine 两种方式
On-The-Fly
1、代理模式,无需修改源代码
2、不停机获取覆盖率
Offine
1、不需要代理,但需要修改源码
2、停机获取覆盖率
两者比较
On-The-Fly 模式更加方便的获取代码覆盖率,无需提前进行字节码插桩,可以实时获取代码覆盖率信息
Offline 模式适用于以下场景
部署环境不允许设置 JVM 参数
字节码需要被转换成其他虚拟机字节码,如 Android Dalvik VM
动态修改字节码过程中和其他 agent 冲突
无法自定义用户加载类
2、执行测试用例,收集程序执行轨迹信息,将其 dump 到内存
3、数据处理器结合程序执行轨迹信息和代码结构信息分析生成代码覆盖率报告。
4、将代码覆盖率报告图形化展示出来,如 html、xml 等文件格式
名词解释
javaagent: 指定 jacocoagent 的路径
includes: 表示只对指定包下的类进行覆盖率注入分析,默认为 *,示例中只分析 com.test 包的类。
output: 表示覆盖率的输出方式。在 tcpserver 模式下,Jacoco 会在客户端执行 dump 操作时将目前收集获取到的覆盖率数据统一写到指定的ip和端口。在 file 模式下,Jacoco 只会在JVM 终止的时候才将收集到的覆盖率数据写入到指定的 exec 文件里去。注意,不管是任何模式,应用运行过程中的临时覆盖率数据都是保存在服务端的内存中的,<b><font color="#f44336">因此对于 tcpserver 模式来说,如果 JVM 不小心终止了,那么在这个覆盖率统计周期内的覆盖率数据都会丢失。</font></b><br>
address: 只限 tcpserver 与 tcpclient 使用,表示监听的应用服务器IP地址或主机名。可根据实际情况自由选
port: 只限 tcpserver 与 tcpclient 使用,表示监听的应用服务器的端口号,一般用默认6300即可
append: 表示覆盖率数据的追加方式,默认为true。客户端在执行 dump 操作时,如果该 exec 覆盖率文件已存在,那么该轮的覆盖率数据会直接在文本末尾进行追加,因此会导致覆盖率数据文件越来越大。如果改为false,则客户端执行 dump 操作时会直接清空原覆盖率文件的内容,保证该覆盖率文件只有该轮的覆盖率数据