在实际的项目过程当中,我们对java项目的测试工作往往存在反复、漏测的情况,导致项目会出现一些意想不到的情况。所以Junit单元测试可以作为项目执行过程当中一个不错的单元测试方案。
如果项目中使用Junit做单元测试,那么测试的覆盖率就变得尤为重要。之前使用了很多其他的测试覆盖率的插件,但是亲测发现,jacoco绝对算得上是一个很不错的选择。
那么jacoco具体在测试覆盖率上有哪些优势呢?我认为,jacoco有以下优势:
1.完美兼容Junit,针对Junit的测试用例,可以准确的检测覆盖率。
2.使用简单方便,只需少量配置和一条命令,就可以生成测试覆盖率的文档。
3.文档形式多样,有xml、csv、和html格式的报告。
4.测试报告详尽,可以明确的标记具体代码的执行轨迹。便于开发补充和修改用例。
这里,我简单的介绍下jacoco的使用:
首先,我们需要在maven的配置文件中配置如下:
org.jacoco
jacoco-maven-plugin
0.8.3
default-prepare-agent
prepare-agent
default-report
prepare-package
report
default-check
check
BUNDLE
implementation is needed only for Maven 2
COMPLEXITY
COVEREDRATIO
0.60
上述配置完成后,如果需要生成测试文档,只需要执行如下命令:
mvn clean install jacoco:prepare-agent jacoco:report
生成出来的html文件效果下:
附上测试的源代码(JacocoTest.java):
package com.yin.test;
public class JacocoTest {
public int maxNum(int... nums) {
if (nums.length == 0) {
throw new IllegalArgumentException("参数异常!");
}
int maxval = nums[0];
for (int i : nums) {
if (maxval >= i) {
continue;
}
maxval = i;
}
return maxval;
}
public String print(int val) {
if (val < 10) {
return "0" + val;
}
return String.valueOf(val);
}
}
测试代码(JacocoJunitTest.java):
package com.yin.test;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
public class JacocoJunitTest {
private JacocoTest test = new JacocoTest();
/**
* 测试最大值函数(正常情况)
*/
@Test
public void testMaxNumNormal() {
Assert.assertEquals(3, test.maxNum(2, 1, 3));
}
@Rule
public ExpectedException exc = ExpectedException.none();
/**
* 测试最大值函数(正常情况)
*/
@Test
public void testMaxNumException() {
exc.expect(IllegalArgumentException.class);
exc.expectMessage("参数异常!");
test.maxNum();
}
@Test
public void testPrint() {
Assert.assertEquals("09", test.print(9));
Assert.assertEquals("11", test.print(11));
}
}
如果测试过程中,发现有覆盖不全的场景,也会明确标注出来: