一、前言
代码测试覆盖率是一种度量,它描述了对程序源代码的测试程度,是白盒测试的一种手段,能够直观暴露测试用例无法覆盖到的代码块。作为提升代码质量的利器,爱奇艺开发团队和QA团队在如何接入、使用等方面做了一些探索性的尝试与实践。
目前代码覆盖率大多停留在整体层面,没有细化到更小的粒度。在协同开发过程中,如果能精细到需求粒度级别覆盖率,关联到具体的负责人,将能有效提高测试效率和精度。
本文将从代码覆盖率接入和使用的角度,叙述了如何结合代码管理、项目管理等DevOps工具进行精细化代码覆盖率统计以帮助提高代码质量。
二、背景
互联网公司软件开发模式多为敏捷式或者迭代式开发模型,弥补了传统开发模式的一些弱点,具有更高的成功率和开发效率,能够先尽快地将产品投向市场,再通过用户的广泛参与,不断修改优化产品,实现产品的快速迭代,更好地适应用户市场变化。
不过随着项目的迭代,功能场景变多,代码工程会愈加庞大复杂,代码质量也因此至关重要。如何在开发测试周期提升代码质量,代码测试覆盖率作为一个可以衡量代码质量的标准,如何接入使用覆盖率数据,是一个值得深入探索实践的方向。
· 定义
> 代码覆盖(英语:Codecoverage)是软件测试中的一种度量,描述程序中源代码被测试的比例和程度,所得比例称为代码覆盖率。
· 代码覆盖率的意义
1. 完善测试用例:从代码覆盖率报告可以明确,哪些代码是执行过的,哪些代码是没有执行过的。对于没有执行过的代码,测试人员需要思考下是代码逻辑设计问题还是测试用例问题。如果是代码逻辑问题,那么需要与开发人员和产品人员沟通,达成需求的一致性理解。如果是测试用例问题,那么需要补足缺失的测试场景,尽可能保证所有重要的场景都覆盖到了,避免未测试的代码上线造成服务故障。
2. 提升代码质量:开发人员从覆盖率报告可以获得代码的执行流程走向,帮助理解代码逻辑。分析生产环境的代码覆盖率报告,还可以区分出真实的用户请求执行覆盖情况,区分“有用/无用”代码,有利于优化简化代码逻辑。
3. 代码质量标准:代码覆盖率是一个确切的数值,将模糊定义的代码质量用精准的数据来量化,是白盒测试和代码质量的衡量指标。
从代码覆盖率报告可以明确,哪些代码是执行过的,哪些代码是没有执行过的,从未执行过的代码可以推算出测试用例是否充足,帮助测试人员理清代码逻辑和完善测试用例。代码测试覆盖率作为一项衡量代码质量的重要标准,可以在测试阶段发现隐藏问题,将隐性问题消灭在萌芽状态,减少线上问题发生。
· 现状
开源的覆盖率实现工具有很多,但是在实际使用中,还需要做比较多的准备工作,经常遇到以下问题:
· 无法区分增量代码
增量代码是指新修改的代码,从全量代码中区分出增量代码的好处是,让使用者只关注于自己负责的代码,去除干扰,减少人工筛选成本。而覆盖率工具只是用于生成代码覆盖率(全量)的工具,没有区分增量代码。
· 使用成本高
覆盖率报告只是一份综合的报告,使用者通常只会关心自己的代码覆盖率,在多人协同开发过程中,如何将某一处代码覆盖率与具体的需求(开发人员、测试人员)关联是一个问题。
· 测试环境多人协同多次修改变化性大,维护成本高
在实际的开发测试周期中,可能会出现修改代码再测试,测试后再修改代码的现象,代码覆盖情况是一个变化的过程。考虑到覆盖率工具只能对固定的代码进行收集,如何减少此变化过程的维护成本是需要解决的。
三、目标和功能
基于以上问题,爱奇艺开发团队在覆盖率生成工具基础上,整合DevOps工具,以相对较小的成本快速接入生成代码覆盖率,并支持计算生成代码分支级别、需求级别的精细粒度增量代码覆盖率报告。以下以Java为例,简单阐述实现方案和原理。
业务架构
· 简化接入流程
使用方仅关心如何将生产出来的java文件、class文件和exec文件推送到指定位置,即可自动化生成详细的覆盖率报告。
· 增量代码报告
利用diff算法,区分出增量代码,生成单独的增量报告和全量报告。
[增量&全量代码报告]
· 代码分支级别代码覆盖率
计算测试分支中(某一个代码分支所占的)代码覆盖率。
[代码分支级别报告]
· 需求级别代码覆盖率
计算Jira中某一个需求(issue涉及到的)代码覆盖率。
[需求级别报告]
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理