Maven – JaCoCo代码覆盖率示例

Maven – JaCoCo代码覆盖率示例_第1张图片 Maven – JaCoCo代码覆盖率示例_第2张图片

在本文中,我们将向您展示如何使用JaCoCo Maven插件生成Java项目的代码覆盖率报告。

经过测试

  1. Maven 3.5.3
  2. JUnit 5.3.1
  3. jacoco-maven-plugin 0.8.2

注意
JaCoCo是一个积极开发的行覆盖率工具,用于测量要测试的代码行数。

1. JaCoCo Maven插件

1.1在pom.xml文件中声明以下JaCoCo插件。

pom.xml

		org.jacoco
		jacoco-maven-plugin
		0.8.2
		
			
				
					prepare-agent
				
			
			
			
				report
				test
				
					report
				
			
		
	

它将在Maven测试阶段运行JaCoCo“报告”目标。

2.单元测试

2.1一个简单的Java代码返回一条消息,并检查一个空字符串。

MessageBuilder.java
package com.mkyong.examples;

public class MessageBuilder {

    public String getMessage(String name) {

        StringBuilder result = new StringBuilder();

        if (name == null || name.trim().length() == 0) {

            result.append("Please provide a name!");

        } else {

            result.append("Hello " + name);

        }
        return result.toString();
    }

}

2.2上等单元测试。

TestMessageBuilder.java
package com.mkyong.examples;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class TestMessageBuilder {

    @Test
    public void testNameMkyong() {

        MessageBuilder obj = new MessageBuilder();
        assertEquals("Hello mkyong", obj.getMessage("mkyong"));

    }

}

2.3运行mvn test ,将在target/site/jacoco/*处生成JaCoCo代码覆盖率报告

Terminal
$ mvn clean test

[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.mkyong.examples.TestMessageBuilder
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.012 s - in com.mkyong.examples.TestMessageBuilder
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO]
[INFO] --- jacoco-maven-plugin:0.8.2:report (report) @ maven-code-coverage ---
[INFO] Loading execution data file D:\maven-examples\maven-code-coverage\target\jacoco.exec
[INFO] Analyzed bundle 'maven-code-coverage' with 1 classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.164 s
[INFO] Finished at: 2018-11-14T16:48:39+08:00
[INFO] ------------------------------------------------------------------------

2.4打开target/site/jacoco/index.html文件,查看代码覆盖率报告:

Maven – JaCoCo代码覆盖率示例_第3张图片 Maven – JaCoCo代码覆盖率示例_第4张图片
Maven – JaCoCo代码覆盖率示例_第5张图片 Maven – JaCoCo代码覆盖率示例_第6张图片
  1. 绿色–测试或覆盖代码。
  2. 红色–未测试或覆盖代码。
  3. 黄色–代码已部分测试或覆盖。

3.改进单元测试

3.1为红线再添加一个测试。

TestMessageBuilder.java
package com.mkyong.examples;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class TestMessageBuilder {

    @Test
    public void testNameMkyong() {

        MessageBuilder obj = new MessageBuilder();
        assertEquals("Hello mkyong", obj.getMessage("mkyong"));

    }

	@Test
    public void testNameEmpty() {

        MessageBuilder obj = new MessageBuilder();
        assertEquals("Please provide a name!", obj.getMessage(" "));

    }
}

再次查看报告。

Terminal
$ mvn clean test

target/site/jacoco/index.html

Maven – JaCoCo代码覆盖率示例_第7张图片 Maven – JaCoCo代码覆盖率示例_第8张图片

3.2如果条件允许,再对黄线添加一项测试。

TestMessageBuilder.java
package com.mkyong.examples;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class TestMessageBuilder {

    @Test
    public void testNameMkyong() {

        MessageBuilder obj = new MessageBuilder();
        assertEquals("Hello mkyong", obj.getMessage("mkyong"));

    }

    @Test
    public void testNameEmpty() {

        MessageBuilder obj = new MessageBuilder();
        assertEquals("Please provide a name!", obj.getMessage(" "));

    }

    @Test
    public void testNameNull() {

        MessageBuilder obj = new MessageBuilder();
        assertEquals("Please provide a name!", obj.getMessage(null));

    }

}

再次查看报告。

Terminal
$ mvn clean test

target/site/jacoco/index.html

Maven – JaCoCo代码覆盖率示例_第9张图片 Maven – JaCoCo代码覆盖率示例_第10张图片

最后,所有线路均经过测试,覆盖率达到100%。

4.常见问题

4.1确保线路覆盖率必须至少达到90%。

pom.xml

		org.jacoco
		jacoco-maven-plugin
		${jacoco.version}
		
			
				
					prepare-agent
				
			
			
				jacoco-report
				test
				
					report
				
			
			
			
				jacoco-check
				
					check
				
				
					
						
							PACKAGE
							
								
									LINE
									COVEREDRATIO
									0.9
								
							
						
					
				
			
			
		
	

jacoco:check目标已附加到Maven验证阶段。

Terminal
$ mvn clean verify

[INFO] Analyzed bundle 'maven-code-coverage' with 1 classes
[WARNING] Rule violated for package com.mkyong.examples: lines covered ratio is 0.8, but expected minimum is 0.9

注意
更多JaCoCo检查示例:

4.2如何更新默认的JaCoCo输出文件夹?

pom.xml

		org.jacoco
		jacoco-maven-plugin
		${jacoco.version}
		
			
				
					prepare-agent
				
			
			
				jacoco-report
				test
				
					report
				
				
				
					target/jacoco-report
				
			
		
	

下载源代码

$ git clone https://github.com/mkyong/maven-examples.git
$ cd maven代码覆盖率

$ mvn清洁测试
#在'target / site / jacoco / index.html'查看报告

参考文献

  1. Wikipedia:Java代码覆盖工具
  2. JaCoCo Java代码覆盖率库
  3. JaCoCo在Eclipse IDE中

翻译自: https://mkyong.com/maven/maven-jacoco-code-coverage-example/

你可能感兴趣的:(Maven – JaCoCo代码覆盖率示例)