Java代码覆盖率的原理是什么?


Java代码覆盖率的原理是什么?成熟的框架有 clover emma,它们的原理是什么呢?具体怎么实现呢?
先说一下我的想法,我自己目前的实现方式是:根据LineNumberAttribute属性修改class文件,在每一行代码的前后插一个标志代码,如果运行到这行代码,插入的代码就会被执行,并且生成统计信息。参见下图

请输入图片描述
但是,如果遇到下面的代码就没有办法了

   
  return a>b?(a-b):(b-a)
 

上面的代码等效于

   
  if(a>b)
  
return a-b;
else
return b-a;

其实是两个语句,对于emma,它可以统计到是执行了a>b?(a-b):(b-a)的前半部分还是后半部分,而我的方案则不行。

PS:不知道为什么问题被投反对票,至少这个问题对我而言还是比较难的,如果反对该问题的话,麻烦在评论里说一下原因。

java jvm

narya 12 years, 1 month ago

emma 有行统计,也有块统计,你的方案对于统计行覆盖有效

へ.水景樣 answered 12 years, 1 month ago

Your Answer