Skip to content

wangbo15/Code-Coverage

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

24 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Java Code Coverage

Jacoco Analyse



1. Introduction

代码覆盖(code coverage):为了全面地覆盖测试,必须测试程序的状态以及程序流程,设法进入和退出每一个模块,执行每一行代码,进入软件每一条逻辑和决策分支。——[Software Testing]

Code coverage is An information on what source code is exercised in execution.——Alexandre Iline

其要求通过完全访问代码以查看运行测试用例时经过了哪些部分。

  • 语句覆盖(statement coverage)

    这是代码覆盖最直接的表现形式,进行语句覆盖目的是保证程序中每一条语句至少执行一次。

  • 分支覆盖(branch coverage)

    试图覆盖软件中所有的路径称为路径覆盖,路径覆盖中最简单的形式则是分支覆盖。但是语句100%覆盖不等于分支100%

  • 方法覆盖(method coverage)

    软件中方法被测试执行的情况

    代码覆盖率

2. Tools

Java代码覆盖工具有两类:第一种添加语句到源码并要求重新编译;第二种是在执行中或执行前修改(instrument)字节码。

2.1 JCov

JCov是Java开始之初由Sun JDk(更早之前是Oracle JDK)开发和使用的。从1.1版本开始,Jcov就可以对Java代码覆盖进行测试和报告。2014年开始作为OpenJDK codetools项目的一部分开始开放源码。其主页https://wiki.openjdk.java.net/display/CodeTools/jcov

2.1.1 JCov for Ant

项目结构:

lib folder:相关的jar
src folder:业务代码
test folder:测试代码

主要在Command line上运行ant(当然,Eclipse也是可以的),build.xml配置步骤如下(大多工具步骤也是如此):

  • 编译业务代码以及测试代码
 <javac encoding="iso-8859-1" debug="true" target="1.5" source="1.5"
               srcdir="src"
               destdir="classes">
        </javac>
  • 在业务代码class文件中插入instrumentation。
<instrument productdir="classes" destdir="instr_classes" outtemplate="template.xml">
        	<!-- 需要的jar-->
            <implantTo path="." implantRT="lib/jcov.network.saver.jar"/>
        </instrument>
  • 打开Jcov的grabber,再次运行测试代码的class文件(以此收集覆盖信息),关闭grabber,最后打印报告(指定地址以及各式)
   <!--start grabber-->
        <grabber output="result.xml" template="template.xml"/>
        <!--运行测试用例字节码(此时运行,测试用例调用的是被插入instrutation的业务class文件)-->
        <java classname="HelloTest" fork="true" failonerror="true">
            <classpath>
                <pathelement location="lib/jcov.network.saver.jar"/>
                <pathelement location="test_classes"/>
                <pathelement location="instr_classes"/>
            </classpath>
        </java>
        <!--stop grabber-->
        <!-- 生成报告-->
        <grabber-manager command="kill"/>
        <report output="report" jcovfile="result.xml"/>

报告:

2.2 JaCoCo

JaCoco是开放源码的工具包,作为EMMA的替代品被开发出来(同一个开发团队)。项目主页http://www.eclemma.org/jacoco/。它可以集成到ANT、Maven中,也可以使用Java Agent技术监控Java程序,并提供了Eclipse插件EclEmama。以下工具可以使用或者包含了Jacoco:

  • EclEmma Eclipse Code Coverage Plugin

  • Jenkins JaCoCo Plugin

  • SonarQube JaCoCo plugin

  • Netbeans JaCoCo support

  • IntelliJ IDEA since v11

  • Gradle JaCoCo Plugin

  • Visual Studio Team Services

  • TeamCity

2.2.1 JaCoCo for Eclipse

使用EcliEmama插件测试,步骤指导:http://www.eclemma.org/installation.html

  • 下载EclEmma,在Eclipse软件市场搜索EclEmma,点击安装

  • 出现表示安装完成

  • 点击上述按钮进行测试

    该插件支持的启动类型:

    • Local Java application
    • Eclipse/RCP application
    • Equinox OSGi framework
    • JUnit test
    • TestNG test
    • JUnit plug-in test
    • JUnit RAP test
    • SWTBot test
    • Scala application
  1. Local Java Application

测试demo:

public class Test {
	public static void main(String []args){
		int rand=(int)(Math.random()*100);
		if(rand%2==0){
			System.out.println("Hi,0");
		}else{
			System.out.println("Hi,1");
		}
		System.out.println("End");
	}
}

测试结果:

  • 红色:测试未覆盖
  • 绿色:测试已覆盖
  • 黄色:测试部分覆盖(if、switch)

查看测试率:Window->Show View->Other->Java->Coverage

  1. JUnit

下面使用JUnit Test覆盖测试 测试类:

  • 测试结果查看(Window显示,步骤如上):
  • 测试报告的导出:结果处右键,选择Export Session,选择报告类型以及目标地址

2.22 Jacoco for Ant

项目结构:

  • 插入instructation部分:
<target name="instrument" depends="compile">
		<!-- Step 2: Instrument class files -->
		<jacoco:instrument destdir="${result.classes.instr.dir}">
			<fileset dir="${result.classes.dir}" />
		</jacoco:instrument>
	</target>
  • 运行字节码部分:
<target name="test" depends="instrument">
		<!-- Step 3: Run tests with instrumented classes -->
		<java classname="HelloTest" fork="true">
			<!-- jacocoagent.jar must be on the classpath --> 
			<classpath>
				<pathelement path="./lib/jacocoagent.jar"/>
				<pathelement path="${result.classes.instr.dir}" />
			</classpath>
			<!-- Agent is configured with system properties -->
			<sysproperty key="jacoco-agent.destfile" file="${result.exec.file}"/>
			<arg value="2 * 3 + 4"/>
			<arg value="2 + 3 * 4"/>
			<arg value="(2 + 3) * 4"/>
			<arg value="2 * 2 * 2 * 2"/>
			<arg value="1 + 2 + 3 + 4"/>
			<arg value="2 * 3 + 2 * 5"/>
		</java>
	</target>
  • 报告部分
	<!-- Step 4: Create coverage report -->
		<jacoco:report>

			<!-- This task needs the collected execution data and ... -->
			<executiondata>
				<file file="${result.exec.file}" />
			</executiondata>

			<!-- the class files and optional source files ... -->
			<structure name="JaCoCo Ant Example">
				<classfiles>
					<fileset dir="${result.classes.dir}" />
				</classfiles>
				<sourcefiles encoding="UTF-8">
					<fileset dir="${src.dir}" />
				</sourcefiles>
			</structure>

			<!-- to produce reports in different formats. -->
			<html destdir="${result.report.dir}" />
			<csv destfile="${result.report.dir}/report.csv" />
			<xml destfile="${result.report.dir}/report.xml" />
		</jacoco:report>
	</target>

2.3 Clover

Clover最早由Atlassian公司开发,是商业产品,但在2017年开源。下载可试用30天,支持环境:

  • Ant
  • Eclipse
  • Maven
  • IDEA
  • Grails
  • Bamboo

2.3.1 Clover for Eclipse

  • 安装插件"http://update.atlassian.com/eclipse/clover"
  • 项目右击,选择 "Clover > Enable on this Project"
  • 然后运行,出现以下窗口,可查看代码覆盖情况
    • Coverage Explorer
    • Test Run Explorer
    • Clover Dashboard
    • Test Contributions
  • 也可以在Coverage Explorer窗口导出报告

2.4 EMMA

EMMA是开源工具,但很久之前便停更了,上一个稳定版本在2005年,Jacoco则是它的进化版。它通过对编译后的Java字节码进行插装,之后在执行过程中收集覆盖率信息,并通过多种报表格式对覆盖率结果进行展示。项目主页http://emma.sourceforge.net/。EMMA的工具具体有:

  • Intellij Idea Plugin
  • SonarQube EMMA Plugin
  • Google CodePro AnalytiX
  • Jenkins Emma Plugin

2.4.1 EMMA for Ant

它的步骤与JCov类似,区别在于它没有将测试代码与业务代码分开装入instrumentati,而是整体操作,在最后的运行字节码时指定它的启始类(即测试类)即可。

  • 编译(同JCov)
  • 插入instrumentation
  <instr instrpathref="run.classpath"
             destdir="${out.instr.dir}"	       
             metadatafile="${coverage.dir}/metadata.emma"
             merge="true"
      >
  • 运行字节码以及导出报告

这里插入instrumentation以及导出报告时,包含在标签下,所以在命令行运行ant时不再是以往的ant命令或者ant -f name.xml,而是运行ant emma run。 报告:

2.5 Cobertura

Cobertura是开源的工具,可以与Junit集成。项目主页http://cobertura.github.io/cobertura/。 可以通过以下方式执行:

  • Ant
  • Command line(Shell,CMD)
  • Gradle
  • Maven

2.5.1 Ant+JUnit+Cobertura

Ant是一个基于Java的自动化脚本引擎,Eclipse中提供了对它的支持,因此不用再次安装。 关于使用ant进行cobertura测试,主要是脚本语言的编写,分为以下几个部分:

  • 向已经编译好的class文件中添加instrumentation
<cobertura-instrument todir="${instrumented.dir}">
			<!--
				The following line causes instrument to ignore any
				source line containing a reference to slf4j/logback, for the
				purposes of coverage reporting.
			-->
			<ignore regex="org.slf4j.*" />

			<fileset dir="${classes.dir}">
				<!--
					Instrument all the application classes, but
					don't instrument the test classes.
				-->
				<include name="**/*.class" />
				<exclude name="**/*Test.class" />
			</fileset>
		</cobertura-instrument>
  • 执行测试用例,此时cobertura会统计代码的执行情况,也就是正常的Junit测试,不同的就是使用刚刚被注入instrumentation的class文件。
<junit fork="yes" dir="${basedir}" failureProperty="test.failed">
			<!--
				Note the classpath order: instrumented classes are before the
				original (uninstrumented) classes.  This is important.
			-->
			<classpath location="${instrumented.dir}" />
			<classpath location="${classes.dir}" />

			<!--
				The instrumented classes reference classes used by the
				Cobertura runtime, so Cobertura and its dependencies
				must be on your classpath.
			-->
			<classpath refid="cobertura.classpath" />

			<formatter type="xml" />
			<test name="${testcase}" todir="${reports.xml.dir}" if="testcase" />
			<batchtest todir="${reports.xml.dir}" unless="testcase">
				<fileset dir="${src.dir}">
					<include name="**/*Test.java" />
				</fileset>
			</batchtest>
		</junit>
  • 生成测试报告
<target name="coverage-report">
		<!--
			Generate an XML file containing the coverage data using
			the "srcdir" attribute.
		-->
		<cobertura-report srcdir="${src.dir}" destdir="${coverage.xml.dir}" format="xml" />
	</target>

2.5.2 Command Line

使用命令行进行测试需要安装ant, 进入官网 http://ant.apache.org/下载后解压,之后配置环境变量: ANT_HOME:E:/ apache-ant path:E:/apache-ant/bin classpath:E:/apache-ant/lib

进入cmd输入ant验证是否配置成功 下面进行测试报告的生成:

  1. srclib文件夹放入bin中,复制出来(我放在了C根目录),同时将下载的cobertura文件解压也放到bin文件夹中
  2. 执行c:\bin\cobertura-2.1.1\cobertura-instrument.bat --destination instrumented code 此时bin文件夹中会出现instrumented文件夹和cobertura.ser文件 这里主要是在编译好的class文件中添加日志文件,并放入instrumented文件夹中
  3. 进行代码测试的工作,
java -cp lib/cobertura.jar;lib/hamcrest-core-1.3.jar;lib/junit-4.12.jar;lib/slf4j-api-1.7.25.jar;instrumented;.;-Dnet.sourceforge.cobertura.datafile=cobertura.ser org.junit.runner.JUnitCore code.CalculatorTest
  1. 生成测试报告
c:\bin\cobertura-2.1.1\cobertura-report.bat --format html -datafile=cobertura.ser --destination report src

下面会出现一个report文件夹,打开查看该报告

Reference

[求助] 请问主流白盒测试工具是哪些 代码覆盖率,CSDN,包含Emma和jacoo Atlassian上关于工具的介绍

wiki Java Code Coverage Tools介绍

Jacoco

csdn,介绍Jacoco,并用Java Local Application和JUnit Test启动该覆盖测试 IBM文章;集成到ANT

TMQ腾讯 Jacoco原理篇

Cobertura

Jcov

项目主页

jcov资源下载

作者介绍该项目的PPT

作者介绍该项目视频

综合

java测试综合

介绍工具,覆盖代码覆盖率工具介绍

Ant相关命令

ant命令,更全些

About

Java Code Coverage Tools

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 93.9%
  • JavaScript 4.1%
  • HTML 1.5%
  • Other 0.5%