JACOCO检测Java单元测试代码覆盖率

1、单元测试,一个跟测试相关的领域,我们知道项目的整个流程,测试流程有一个环节就是单元测试,然后才是集成测试\系统测试\验收测试,然,我们需要清楚下面几件事:

  • 什么是单元测试?
  • 由谁来做单元测试?
  • 为什么要做单元测试?
  • 分析单元测试的利与弊?
  • 如何选择合适的单元测试框架?
  • 如何检查单元测试的效果:覆盖率?
  • 如何选择适合项目代码的覆盖率工具?

2、针对上面问题进行一系列的解答,

  • 单元测试本质上也是代码,与普通代码的区别在于它是验证代码正确性的代码。
  • 单元测试更多时候是开发人员编写的、用于检测在特定条件下目标代码正确性的代码。
  • 便于后期重构。单元测试可以为代码重构提供保障,只要重构后单元测试全部通过,那么在很大程度上表示这次重构没有引入新的BUG,当然这是建立在完整、有效的单元测试覆盖率的基础上。
  • 优化设计。编写单元测试将使用户从调用者的角度观察、思考,特别是使用TDD驱动开发的开发方式,会让使用者把程序设计成易于调用和可测试,并且解除软件中的耦合。
  • 文档记录。单元测试就是一种无价的文档,它是展示函数或类如何使用的最佳文档,这份文档是可编译、可运行的、并且它保持最新,永远与代码同步。
  • 具有回归性。自动化的单元测试避免了代码出现bug,编写完成之后,可以随时随地快速运行测试,而不是将代码部署到设备之后,然后再手动地覆盖各种执行路径,这样的行为效率低,费时间。
  • 总结一句话:无非就是良好的接口设计、正确性、可回归、可测试、完善的调用文档、高内聚、低耦合.唯一考虑的是单元测试的覆盖率,如果过于频繁维护,那么就是开发成本上升.
  • 主要流行的Junit4和TestNG单元测试框架,作为java单元测试热门选择,个人觉得工具无所谓,按需选择即可,个人习惯使用TestNG功能更强大\方便.
  • 单元测试不是集成测试,单元测试只是测试一个方法单元,不是测试一整个流程。集成测试是一种End To End的系统测试,测试相关模块集成在一起是否能够按照预期工作,一般都是接口或者功能层面的测试,可能会依赖很多系统因素,测试的代码逻辑一般比较复杂,运行时间会比较长,出错之后的修复成本高。单元测试则是开发者在集成测试之前就已经进行自测过,同时呢,进行单元测试之后,对于某个方法的执行路径组合进行了一一验证,它只关注三个目标:
  • 有明确的返回值。比如对某个函数进行单元测试,验证其返回值是否符合预期结果。
  • 这个函数只改变其对象内部的一些属性或者状态,函数本身没有返回值,就验证它所改变的属性和状态。
  • 一些函数没有返回值,也没有直接改变哪个值的状态,这就需要验证其行为,比如点击事件。
  • 不得不说一下单元测试的用例设计:单元测试还需要从另一个角度来设计测试数据,即针对程序的逻辑结构来设计测试用例,就是所谓的白盒测试,
    • 完成功能测试后统计语句覆盖率,如果语句覆盖未完成,很可能是未覆盖的语句所对应的功能点未测试。
    • 白盒测试针对程序的逻辑结构设计测试用例,用逻辑覆盖率来衡量测试的完整性。逻辑单位主要有:语句、分支、条件、条件值、条件值组合,路径
  • 检查代码覆盖率的工具也有多个选择,如Jcoco/cobertura,ta的选择或是eclipse中的插件安装,也可以通过配置maven的pom文件引入插件,执行单元测试或mvn时生成对应的报告.也可集成jenkins
    • 進入eclipse的help--marketplace超市.搜索EclEmma Java code coverage,即Jcoco
      • 有一個缺點,不能生成html報告需要在eclipse中查看,當然可以配置pom生成報告到指定目錄(报告生成已解决)
    • 再有一個工具是在pom配置依賴:cobertura-maven-plugin, 執行mvn cobertura:cobertura,就可以在target/site目錄下查看報告

3、jacoco支持多种覆盖率的统计,包括如下覆盖率统计:

  1. 行覆盖率:度量被测程序的每行代码是否被执行,判断标准行中是否至少有一个指令被执行。
  2. 类覆盖率:度量计算class类文件是否被执行。
  3. 分支覆盖率:度量if和switch语句的分支覆盖情况,计算一个方法里面的总分支数,确定执行和不执行的 分支数量。
  4. 方法覆盖率:度量被测程序的方法执行情况,是否执行取决于方法中是否有至少一个指令被执行。
  5. 指令覆盖:计数单元是单个java二进制代码指令,指令覆盖率提供了代码是否被执行的信息,度量完全 独立源码格式。
  6. 圈复杂度:在(线性)组合中,计算在一个方法里面所有可能路径的最小数目,缺失的复杂度同样表示测 试案例没有完全覆盖到这个模块。

tips:执行命令:mvn clean jacoco:prepare-agent install jacoco:report -Dmaven.test.failure.ignore=true

4、cobertura官方比较建议采用cobertura-maven-plugin插件来做代码覆盖率统计,因为配置简单,命令:mvn cobertura:cobertura即可在targer对应目录下生成html报告.

       <dependency>
			<groupId>org.codehaus.mojo</groupId>
			<artifactId>cobertura-maven-plugin</artifactId>
			<version>2.7</version>
		</dependency>

5、踩坑,在pom配置jacoco生成报告,总是出现生成了jacoco.exec二进制报告文件,但是一直没有生成target/site/jacoco路径下的报告文件;百度了一堆博客不断尝试.终于解决了.

	         <plugin>
				<groupId>org.jacoco</groupId>
					<artifactId>jacoco-maven-plugin</artifactId>
					<version>0.8.3</version>
					<configuration>
						<!--指定生成 .exec 文件的存放位置 -->
						<destFile>target/coverage-reports/jacoco-unit.exec</destFile>
						<!--Jacoco 是根据 .exec 文件生成最终的报告,所以需指定 .exec 的存放路径 -->
						<dataFile>target/coverage-reports/jacoco-unit.exec</dataFile>
					</configuration>
					<executions>
						<execution>
							<id>jacoco-initialize</id>
							<goals>
								<goal>prepare-agent</goal>
							</goals>
						</execution>
						<execution>
							<id>jacoco-site</id>
							<phase>package</phase>
							<goals>
								<goal>report</goal>
							</goals>
						</execution>
					</executions>
				</plugin>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

职说测试

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值