笔者踩了很多坑,然后总结以下的研究结果。转载请注明出处,谢谢啦!
install new soft 安装插件 eclemma java code coverage
运行
结果
插件导出单元测试报告
pom.xml文件中加入对应的部分,plugin部分
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>cn.whxgroupId>
<artifactId>jacoco-testartifactId>
<version>0.0.1-SNAPSHOTversion>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.11version>
<scope>compilescope>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.jacocogroupId>
<artifactId>jacoco-maven-pluginartifactId>
<version>0.7.1.201405082137version>
<executions>
<execution>
<goals>
<goal>prepare-agentgoal>
goals>
execution>
<execution>
<id>reportid>
<phase>prepare-packagephase>
<goals>
<goal>reportgoal>
goals>
execution>
executions>
plugin>
plugins>
build>
project>
maven clean package 即可有报告 在target文件中 site index.html
结果
注:有时候你会发现会爆出这个问题Skipping JaCoCo execution due to missing execution data file,大多数原因是因为没有编译测试类,可以使用 clean package -Dmaven.test.skip=false
(可大概理解其意思,英文网址附上)
http://www.eclemma.org/jacoco/trunk/doc/counters.html
Instructions (C0 Coverage)
Branches (C1 Coverage)
Cyclomatic Complexity
关于圈复杂度的理解,可以看以下链接。
http://blog.csdn.net/lg707415323/article/details/7790660
http://www.ibm.com/developerworks/cn/java/j-cq03316/
以及一个图
Lines
Methods
**先贴上代码
被测试类:**
package utils;
import java.math.BigDecimal;
/**
* 安全转换钱的单位
*
* @author rutine
* @time Apr 28, 2015 3:52:18 PM
*/
public class MoneyUtil {
/**
*
* 功能说明 : 安全转换double类型, 将单位元的钱转为分
* 如: 19.9(元), 最终结果: 1990(分)
*
*
* @param money 金额(元)
* @return
*/
public static int getFenMoney(String money) {
BigDecimal hundred = new BigDecimal(100);
BigDecimal decimalMoney = new BigDecimal(money);
return decimalMoney.multiply(hundred).intValue();
}
/**
* 功能说明 : 获取单价, 保留小数点两位数
*
* @param money 总金额(元)
* @param quantity 数量
* @return
*/
public static double getUnitMoney(String money, int quantity) {
if ("50".equals(money)) {
System.out.println("branch1");
}else if ("60".equals(money)) {
System.out.println("branch2");
}else if ("70".equals(money)) {
System.out.println("branch3");
}else {
System.out.println("other branch");
}
BigDecimal decimalMoney = new BigDecimal(money);
BigDecimal unitMoney = decimalMoney.divide(new BigDecimal(quantity), 2, BigDecimal.ROUND_HALF_UP);
return unitMoney.doubleValue();
}
}
测试类:
package test;
import org.junit.Test;
import utils.MoneyUtil;
public class TestMoney {
@Test
public void testGetUnitMoney(){
MoneyUtil.getUnitMoney("50", 2);
MoneyUtil.getUnitMoney("60", 2);
MoneyUtil.getUnitMoney("70", 2);
MoneyUtil.getUnitMoney("75", 2);
}
}
测试结果,指标分析
这一项指标instructions,指的是字节码文件的行数。18/62的意思是 18为未执行的指令行数,62为总指令行数。
这一项指标branches,指的是分支的覆盖情况。0/6中0为未执行的分支行数,6为总分支行数。这里else不会计入到分支行数中。但是如果你不写else,则覆盖率不会为100%。
这一项指标,为圈复杂度。missed 为未测试的数量,cxty为总数。
我们来看看这个圈复杂度为啥是4
简单的画个控制流图
v=e-n+2 8条边 - 6个节点 + 2 = 4
这一项指标,为行的覆盖情况。missed 为未测试的数量,lines为总数。
同样的,看看这个例子
正好是10行。未检测的是0行。
这一项指标,为方法的覆盖情况。missed 为未测试的数量,methods为总数。
最后,请注意,覆盖率达到100%,不代表你的程序就ok了!