代码覆盖率是什么
代码覆盖率是评估系统化软件测试完成度的方式,是白盒测试的一种方式,可以发现测试用例无法覆盖到的程序,它可以评估测试效率、定量测试手段、了解源代码测试程度。为了度量测试工具对项目程序的测试程度,会使用一种或多种覆盖率准则:
- 函式覆盖率(Function coverage):有呼叫到程式中的每一个函式(或副程式)吗?体现为一个函数定义后被调用。
- 指令覆盖率(Statement coverage):若用控制流图表示程式,有执行到控制流图中的每一个节点吗?体现为函数中所有被条件判断包括的指定都被执行过(或说所有判断都成立过)。
- 判断覆盖率(Decision coverage):若用控制流图表示程式,有执行到控制流图中的每一个边吗?例如控制结构中所有IF指令都有执行到逻辑运算式成立及不成立的情形吗?体现为覆盖所有条件判断都各为True和False的情况。
- 条件覆盖率(Condition coverage):每一个逻辑运算式中的每一个条件(逻辑运算式)是否都有执行到成立及不成立的情形?体现为覆盖条件判断内逻辑运算符两侧的每个分式都各为True和False的情况。
其他覆盖率准则有:
- JCSAJ覆盖率:是否执行过每一个JCSAJ(线性代码序列和跳转)?
- JJ路径覆盖率(JJ-Path coverage):是否执行过每一个JJ路径(从跳转到跳转之间的路径,也就是JCSAJ)?
- 路径(分支)覆盖率(Path coverage):是否执行过程式中所有可能的路径?
- 进入点/结束点覆盖率(Entry/exit coverage)是否执行过函式中所有可能的进入点及结束点?**
- 循环覆盖率(Loop coverage):所有循环是否都有执行过零次、一次及一次以上的测试?
- 参数值覆盖率(Parameter Value Coverage):对于一个方法的所有参,数,是否有执行过其中最常见的数值?
有些覆盖之间有相关性:例如路径覆盖就包括了判断覆盖、指令覆盖及进入点/结束点覆盖,而判断覆盖也包括了指令覆盖。完整的路径覆盖测试多半难以实现甚至不可能实现。实务上路径覆盖测试的软件只会试图找出随着循环执行次数不同时,有变动的路径,设法找到“基本路径”,并要求对基本路径需达到路径覆盖的要求。
一些代码覆盖率测试工具有:Jacoco、Cobertura、JTest
代码覆盖率能够发现无效代码,例如无用代码(发现于编译时)、冗余代码(发现于运行时):
- 无用代码(Dead Code):编译时静态分析出的对执行无影响的代码,例如无用的变量定义、必定为True or False的判断。
- 冗余代码:强调运行时冗余,与无用代码的区别在于无用代码可以在编译时发现和剔除,冗余代码主要指某个业务逻辑不会设计的模块被加载。
总结
代码覆盖率是一种度量,描述程序源代码经过测试的程度。它可以帮助你评估测试执行的效率。代码覆盖率无法帮助您确定我们是否测试了功能的所有可能值,但可以用于参照来创建额外的测试用例以增加覆盖率。