脚本宝典收集整理的这篇文章主要介绍了精准测试系列分享之一:JaCoCo 企业级应用的优缺点分析,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
一、JaCoCo简介
JaCoCo是Eclipse平台下的开源产品,以小型,轻量化著称,常见集成在Eclipse Workbench中,除此之外的启动方式包括对接Ant和Maven,或是命令行的方式进行。Jacoco近两年在软件测试行业的被关注度比较高,其主要原因是:在新一代精准测试技术流的影响中,各大型单位对覆盖率的追求越来越迫切。作为一款开源产品,它主机面向Java语言,能够在字节码层面给出覆盖率,同时也能将字节码关联到对应的源代码。这种半精准的测试方式,在小型团队中,对于某些场景的覆盖率诉求,起到了一定的响应。但它也有很强的局限性,尤其在支撑大型系统应用中,其表现能力弱,准确率不够达标。这是它致命的缺点,也为它在大型系统中应用的 失败埋下了伏笔。如何下此结论?本文作者将从应用者的角度,并参照国外用户的总结文献做一综合分析罗列。因本人的学识所限,归纳的肯定不够全面,如有不准确之处,还请同行拍砖、指正。
二、JaCoCo的技术内核
JaCoCo覆盖率的采集,主要是通过插装及装点的执行来收集程序运行的特征数据。JaCoCo的插装,是通过agent在字节码中插入boolean[]数组,来标记每句可执行代码,只要执行过相应语句,boolean[]数组会产生相应标记(True or False),这个boolean数组连同产生的标记称之为探针(PRobe)。
当源码被编译为字节码时,源码的逻辑指令,例如条件判定,循环等,会被编译为特殊指令,JaCoCo在动态插装的过程中,当处理到这些指令时,会根据不同的逻辑进行不同的插装方式。
图表 1 Java源代码(左)和对应字节码 (右)
图1中IFEQ和G0T0都是JUMP(跳转)指令,通过JUMP指令直接能从一个节点,跳转到另一个节点。针对JUMP指令的插装方式,有多种选择。有些是在指令前插入探针,有些是在指令后插入探针(见表格1)。类似的,在面对其他特殊指令时,例如ENTRY(程序启动), SEQUENCE(序列执行),或者EXIT(程序终止)等,均有不同的插装操作。图2以面对JUMP类型指令的插装作为示例,其中左图为未插装的字节码,右图为装点位置的示意图。
图表 2针对JUMP类型指令的插装示意
表格 1面对不同类型指令的插装方式
JaCoCo的这种插装方式,特别需要指出的是:
三、JaCoCo的覆盖率实现
比较常见的覆盖率标准,按粒度从粗到细依次是:语句覆盖,分支覆盖,条件覆盖,路径覆盖。JaCoCo可以实现语句覆盖,以及部分情况下的分支覆盖。一些研究表明,JaCoCo在分支覆盖层级,对结构控制只研究了if-else的情况,因此该层级的评估无法保证所有可执行语句的正确执行[1]。同时,JaCoCo所谓支持的条件覆盖结果其实不适合商用,由于字节码和源码之间的信息差,它只能衡量条件真假是否覆盖的比率,但无法有效确定某个具体条件执行的精确结果。而在企业级应用场景下,实现精确的条件覆盖是刚性需求,JaCoCo因为没有代码静态分析辅助永远无法纯粹通过字节码获取精确的条件和分支覆盖。
因此,JaCoCo优点是,可以进行粗粒度的覆盖率度量,比较适用于对于项目的整体初步评估。
在真正的精准测试的体系中,对于覆盖率的计算和展示,其实现基础是测试信息到源码,再从源码到测试用例的精准关联和信息映射。与其相比,Jacoco最大的弱点是:易产生覆盖率的计算偏差。
图表 3 JaCoCo覆盖率展示界面
图表 4 JaCoCo在源码端的覆盖率展示
四、应用局限性
JaCoCo天生缺陷的内核设计和定位,带来了应用的局限。作为一款热门开源工具,虽然被爱好者们在小范围及初步信息判断中使用较多,但是却因为大量的误差,不能被应用更大、更复杂的大型核心系统上,否则用户可能将面临着很大的技术风险。
覆盖率误差:JaCoCo的插装过程具有一定的技术局限性,其装点并非明文可见,存在大量的信息差。发表在IEEE上的文章:“Negative effects of bytecode instrumentation on Java source code coverage”,对JaCoCo的误差情况以及可能原因进行了详尽的评估与分析[2]。
JaCoCo与标准基线对比结果显示:针对不同的项目,在类(Method)层级,JaCoCo的覆盖率评估就已产生了0.2%-8.5%左右的绝对误差和0.7%-23.859%的相对误差。在更细化的语句行和分支层级,其误差将会被指数级放大。
表格 2 JaCoCo覆盖率评估的相对误差[2]
误差产生的具体成因:
误差引发的后果:
五、对接能力分析
JaCoCo对于Ant和Maven有较完整的插件支持启动方案,但是只能和Eclipse或者SonarCube集成,无法实现和测试管理软件,或是上下游测试工具的完整对接。
对于开发流程,JaCoCo依然是传统白盒测试的思维,即瀑布式的开发模式,需要在代码更新后重新进行测试,每次版本迭代的工作量都十分庞大。
自动化层面,JaCoCo支持与Jenkins的对接。
六、结语
JaCoCo能够有效的在字节码层级提供覆盖率的初步评估和计算,并且有实现从字节码关联到源码的能力。但是,JaCoCo只是一款提供粗略评估工具,无法自动关联用例、无法有效提升测试效率,没有作为测试中台的对接和支持能力。JaCoCo的定位和实践,表明其更适用于偏向辅助个人开发者和小型项目组对项目覆盖率进行非常基础的评估,对于支撑大型企业级应用的精准测试需求,依然路途漫长。
参考文献:
[1] N. Li, X. Meng, J. Offutt, and L. Deng, “Is bytecode instrumentation as good as source code instrumentation: An empirical study with industrial tools (Experience Report),” 2013 IEEE 24th Int. Symp. Softw. Reliab. Eng. ISSRE 2013, pp. 380–389, 2013, doi: 10.1109/ISSRE.2013.6698891.
[2] D. Tengeri, F. Horváth, Á. Beszédes, T. Gergely, and T. Gyimóthy, “Negative effects of bytecode instrumentation on Java source code coverage,” 2016 IEEE 23rd Int. Conf. Softw. Anal. Evol. Reengineering, SANER 2016, vol. 1, pp. 225–235, 2016, doi: 10.1109/SANER.2016.61.
以上是脚本宝典为你收集整理的精准测试系列分享之一:JaCoCo 企业级应用的优缺点分析全部内容,希望文章能够帮你解决精准测试系列分享之一:JaCoCo 企业级应用的优缺点分析所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。