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