cobertura是测试java代码中代码覆盖率的自动化工具
我以前未接触过这个东西,以为直接测试就可以了,但经过试验和阅读文档,明白了,必须经过测试,也就是必须配合xUnit测试才能产生出覆盖率结果,否则结果都是零。下面讲解我做的例子:
目录结构:
src
------main
-------------HelloWorld.java
-------------Calculator.java
-------test
--------------CalculatorTest.java
-------pom.xml
//CalculatorTest.java为jUnit框架Calculator.java对应的测试类,HelloWorld.java没有测试类,最后生成结果会发现HelloWorld的覆盖率为0
HelloWorld.java:
public class HelloWorld
{
public static void main(String args[ ])
{
System.out.println("HelloWorld!");
}
}
Calculator.java
package andycpp;
public class Calculator{
private static int result; // 静态变量,用于存储运行结果
public void add(int n){
result = result + n;
}
public void substract(int n){
result = result - 1; //Bug: 正确的应该是 result =result-n
}
public void multiply(int n){
} // 此方法尚未写好
public void divide(int n){
result = result / n;
}
public void square(int n){
result = n * n;
}
public void squareRoot(int n) {
for (; ;) ; //Bug : 死循环
}
public void clear() { // 将结果清零
result = 0;
}
public int getResult(){
return result;
}
}
CalculatorTest.java
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
public class CalculatorTest {
private static Calculator calculator = new Calculator();
@Before
public void setUp() throws Exception {
calculator.clear();
}
@Test
public void testAdd() {
calculator.add(2);
calculator.add(3);
assertEquals(5, calculator.getResult());
}
@Test
public void testSubstract() {
calculator.add(10);
calculator.substract(2);
assertEquals(8, calculator.getResult());
}
@Ignore("Multiply() Not yet implemented")
@Test
public void testMultiply() {
}
@Test
public void testDivide() {
calculator.add(8);
calculator.divide(2);
assertEquals(4, calculator.getResult());
}
}
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xxxcom.helloworld</groupId>
<artifactId>helloworld</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<url>${HUDSON_URL}</url>
<build>
<sourceDirectory>src/main</sourceDirectory>
<testSourceDirectory>src/test</testSourceDirectory>
<outputDirectory>target/classes</outputDirectory>
<testOutputDirectory>target/test-classes</testOutputDirectory>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12</version>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.4</version>
<configuration>
<formats>
<format>html</format>
<format>xml</format>
</formats>
<check>
<branchRate>85</branchRate>
<lineRate>85</lineRate>
<haltOnFailure>true</haltOnFailure>
<totalBranchRate>85</totalBranchRate>
<totalLineRate>85</totalLineRate>
<packageLineRate>85</packageLineRate>
<packageBranchRate>85</packageBranchRate>
</check>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit-dep</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
</dependencies>
<reporting>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.4</version>
<configuration>
<formats>
<format>xml</format>
<format>html</format>
</formats>
</configuration>
</plugin>
</plugins>
</reporting>
</project>
说明:
1.
<sourceDirectory>src/main</sourceDirectory>
<testSourceDirectory>src/test</testSourceDirectory>
<outputDirectory>target/classes</outputDirectory>
<testOutputDirectory>target/test-classes</testOutputDirectory>
这些定义环境
2. maven-surefire-plugin执行Junit测试
3. cobertura-maven-plugin的check标签网上抄的,没明白什么意思,目前
4. <dependencies>中定义了junit
5. <reporting>中指明生成报告的工具cobertura