第2.4节 Android生成报告时排除指定的类

2.4.1 简介

      Jacoco生成覆盖率报告的时候,会按源码的类生成相应的覆盖率数据,然后根据类文件,源码文件和覆盖率数据生成对应类的覆盖率数据。在日常测试过程中,存在这样的情况:
(1)一个项目有废弃的功能,但是只从应用层面屏蔽了对应的入口,代码依然存在;
(2)某此极端的兜里代码,正常情况下无法测试,生成报告时依然会统计进覆盖率报告。
(3)多个需求混合开发,只希望看到本需求的增量报告,当然此种情况后面还有其他优化方案。
还有一些其他的情况,就是项目中有些代码不需要统计到覆盖率报告中,全量报告或是增量报告中却存这类数据,影响问题分析和数据度量,业务同学反馈能否去掉此类数据?

2.4.2 排除指定数据的方案

覆盖率报告数据的来源无非三处:覆盖率数据,应用类,项目源码,能否从这三处入手,排除指定的类呢?
1,覆盖率数据排除
       要从覆盖率数据层面排除,可以从插桩入手,在引入jacoco插件的时候对相关的类进行排除,方案可以参考增量插桩,不过这次是反向来的。另一种方法是,读取覆盖率数据文件ec, 将要排除的类相关数据剔除,然后把符合要求的数据保存成新文件,再生成报告。此方案的无论哪种方法都比较底层,实现要求较高,不建议采纳。
2,应用类文件排除
     JacocoCli生成报告的时候,要指定类文件路径,能否把要排除的类文件去掉,保留需要的类文件,再生成报告呢?经过测试,确实可以将指定的类排除,因为生成报告的时候,找不到相应类的编译后的类文件,便无法生成报告,自然也能将相关类的覆盖率数据去掉,此方案可行。
3,源码层排除
       JacocoCli生成报告的时候,也指定的源码路径,尤其是类多的时候,需要多个参数来指定路径。那生成报告的时候,能否把要去掉的类对应的源码路径去掉,再生成报告呢?经过测试发现,去掉了源码路径,生成报告后报告中依然存在要排除的类的覆盖数据,但是查看报告源码渲染页的时候,就找不到源码文件,无法渲染代码页面,此方案达不到要求。

2.4.3 生成报告排除指定的类

      在正常的覆盖率测试中,不会直接手动操作所有步骤的,比如说下载覆盖率数据文件,jacococli命令行生成报告,手动查找源码和类文件路径等等。在精准测试平台中,是使用一个Python服务作为Agent来处理生成报告,过滤数据等相关操作,此处不展开Agent的相关功能,后续有相应的章节介绍,此处介绍一下,如何通过python来过滤指定的类。
对应的python函数如下:
def getBuildClassPath(self,propath):
    """动态查找build_class路径,去掉class中相应的包即可。
    """
    folder=Path(propath)
    result=list(folder.rglob("build_classes_*"))
    classlist=[]
    for ckfile in result:
        ckpath=str(ckfile.resolve())
        if ckpath.find("zip")==-1:
            classlist.append(ckpath)
    #降序排列
    classlist.sort(reverse=True)
    #去掉指定的包
    refolder=Path(classlist[0])
    #要去掉的包列表
    removeres=list(refolder.rglob("com/testw/user"))
    for remove in removeres:
        print(remove)
        ckpath=str(remove.resolve())
        shutil.rmtree(ckpath)
    return classlist[0]
代码解析:
  • 先通过python的path包,找到所有需要的类文件路径,此项目类文件较多;
  • 对类文件路径进行排序;
  • 遍历要去掉的类路径列表,从类路径列表中去掉指定的类;
  • 返回所有符合条件的类文件路径。
   通过上面代码,获取到了符合条件的类路径集合,就可以通过下面的命令生成覆盖率报告:
java -jar ${jacococli.jar的路径} report ${exec文件路径} 
--classfiles ${类文件路径} 
--sourcefiles ${源码文件路径,要到/src/main/java} 
--encoding utf-8 --html ${报告路径}
生成的覆盖率报告文件中,没有任何关于在排除的类文件的数据,达到了排除的要求。

2.4.4 总结

      到目前为止,对Android的覆盖率测试,都是使用jacoco原生的方案,虽然也改写了jacococli工具,但是基本上没有改动其核心功能。网上也不少其他的方案,如:
1,利用Jacoco核心功能,改变其插桩方案,获取更多信息,后面我们会开发记录用例执行顺序的插件,就是采用的此方案。
2,增量插桩方案,获取增量覆盖率。增量插桩除了无法同时获取全量覆盖率信息外,还是有可取之处的,插桩内容少,处理的数据量也小,效果相对来说比较高。
3,重新生成覆盖率报告,将jacoco的覆盖率报告数据进行解析,然后重新设计覆盖率报告样式,让报告更加好看。
4,重新渲染代码覆盖页,增加需要的信息,如用例覆盖信息,调用关系数据,引入AI解析未覆盖的代码(前端精准测试中就有引入)等等。
当你拿到了覆盖率数据,就可以根据自己业务需求进行各种开发,炫技时刻到了!!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值