Java 代码覆盖率注入方式

来源:互联网 发布:王者荣耀延迟高4g网络 编辑:程序博客网 时间:2024/06/08 16:08

得到代码覆盖率大致需要三步:

1. 注入(instrumentation

2.运行Tests,得到Coverage data

3.生成报表

所以注入这一步是得到代码覆盖率的基础。注入的目的是给被测试的代码加一些额外的代码用于在测试运行Test时统计及保存那些语句被Test执行了。反编译了一个Cobertura注入的方法就能够大致了解注入是怎么一回事了:

原方法:

public HashMap<String, String> handleRequest() {HashMap<String, String> model = new HashMap<String, String>();String helloRaptor = "Say hello to Raptor!" ;model.put("greeting", helloRaptor);return model;}  


注入后的方法:


 public HashMap<String, String> handleRequest()  {    __cobertura_counters[2] += 1; HashMap model = new HashMap();    __cobertura_counters[3] += 1; String helloRaptor = "Say hello to Raptor!";    __cobertura_counters[4] += 1; model.put("greeting", helloRaptor);    __cobertura_counters[5] += 1; return model;  }

由此可见运行测试用例时就可以通过注入好的代码统计每一行代码是否被执行。

业界做代码覆盖率的 注入主要有三种方式:

1. 直接源代码注入

2. 注入到编译好的Class

3. 注入到JVM运行时字节码中

我们来看一下业界常用的代码覆盖率工具是如何做的。商用的Clover的注入方式是1,源代码注入。 Cobertura和Emma采用的是第2种,注入到编译好的Class文件中,也被称为Offline 字节码注入。Jacoco采用第三种方式,采用JVM Tool Interface将Agent加入到JVM后启动,注入到JVM中的Class,即On-The-Fly字节码注入。

当然不同的注入方式和统计方式势必导致代码覆盖率统计结果的差别。另外这种为得到代码覆盖率进行的注入也会导致测试运行的时间增长。



0 0