6.8.1 逻辑覆盖

更新于 2026年10月10日 版权声明
6.8.1 逻辑覆盖

测试覆盖率用于确定测试所执行到的覆盖项的百分比。其中的覆盖项是指作为测试基础的一个入口或属性,比如语句、分支、条件等。测试覆盖率可以表示出测试的充分性,在测试分析报告中可以作为量化指标的依据,测试覆盖率越高效果越好。但覆盖率不是目标,只是一种手段。测试覆盖率包括功能点覆盖率和结构覆盖率,功能点覆盖率大致用于表示软件已经实现的功能与软件需要实现的功能之间的比例关系。结构覆盖率包括语句覆盖率、分支覆盖率、循环覆盖率、路径覆盖率等。

逻辑覆盖法是以程序内部的逻辑结构为基础的用例设计方法,它通过对程序逻辑结构的遍历实现程序的覆盖。根据覆盖目标的不同,逻辑覆盖分为语句覆盖、判定覆盖(分支覆盖)、条件覆盖、判定-条件覆盖(分支-条件覆盖)、条件组合覆盖、路径覆盖6种覆盖测试方法。下面举例说明6种覆盖测试方法。

例6.9 示例程序源代码。

图示

一般逻辑覆盖测试不会直接根据源代码,而是根据流程图来设计测试用例,根据例6.9示例程序源代码画出流程图,如图6.14所示。

图示

图6.14 示例程序流程图

(1)语句覆盖。语句覆盖要求设计足够多的测试用例,运行被测程序,使得程序中每条语句至少被执行一次。在本例中,可执行语句是指语句块1到语句块4中的语句。

例6.9的语句覆盖测试用例如表6.17所示。

表6.17 语句覆盖测试用例

图示

通过这两个测试用例即达到语句覆盖的标准。(测试用例组不是唯一的)

我们可以直观地从流程图得到测试用例,测试所有的执行语句。但语句覆盖不能准确地判断运算中的逻辑关系错误。假设第一个判断语句if(x>0&&y>0)中的“&&”被错误地写成了“‖”,即if(x>0‖y>0),使用上面设计出来的一组测试用例来进行测试,仍然可以达到100%的语句覆盖。在六种逻辑覆盖标准中,语句覆盖标准最弱的。

(2)判定覆盖。判定覆盖,又称分支覆盖,要求设计足够多的测试用例,运行被测程序,使得程序中的每个判断的“真”和“假”分支都至少被执行一次。在本例中共有两个判断if(x>0&&y>0)和if(magic<0)。

例6.9的判定覆盖测试用例如表6.18所示。

表6.18 判定覆盖测试用例

图示

通过这两个测试用例,两个判断的真、假分支都已经被执行过,所以满足了判断覆盖的标准。

由于可执行语句要不就在判定的真分支,要不就在假分支上,判定覆盖比语句覆盖要多几乎一倍的测试路径,所以,只要满足了判定覆盖标准就一定满足语句覆盖标准。因此,判定覆盖比语句覆盖强。但判定覆盖会忽略条件中取或的情况。假设第一个判断语句if(x>0&&y>0)中的“&&”被程序员错误地写成了“‖”,使用上面设计出来的一组测试用例,仍然可以达到100%的判定覆盖,所以判定覆盖也无法发现上述的逻辑错误。

(3)条件覆盖。条件覆盖要求设计足够多的测试用例,运行被测程序,使得判定中的每个条件获得各种可能的结果,即每个条件至少有一次为真值,有一次为假值。在本例中有两个判断if(x>0&&y>0)和if(magic<0),共计三个条件x>0、y>0和magic<0。

例6.9的条件覆盖测试用例如表6.19所示。

表6.19 条件覆盖测试用例

图示

通过这两个测试用例,三个条件的各种可能取值都满足了一次,达到了100%条件覆盖的标准。(https://www.daowen.com)

显然条件覆盖比判定覆盖,增加了对符合判定情况的测试,增加了测试路径。但是条件覆盖只能保证每个条件至少有一次为真,而不考虑所有的判定结果。因此,条件覆盖并不能保证判定覆盖。

(4)判定-条件覆盖。判定-条件覆盖要求设计足够多的测试用例运行被测程序,使得被测试程序中的每个判断本身的判定结果(真/假)至少满足一次,同时,每个逻辑条件的可能值也至少被满足一次。即同时满足100%判定覆盖和100%条件覆盖的标准。

例6.9的判定-条件覆盖测试用例如表6.20所示。

表6.20 判定-条件覆盖测试用例

图示

通过这两个测试用例,所有条件的可能取值都满足了一次,而且所有的判断本身的判定结果也都满足了一次。

达到100%判定-条件覆盖标准一定能够达到100%条件覆盖、100%判定覆盖和100%语句覆盖。判定-条件覆盖满足判定覆盖准则和条件覆盖准则,弥补了二者的不足。但未考虑条件的组合情况。

(5)条件组合覆盖。条件组合覆盖要求设计足够多的测试用例,运行被测程序,使得被测试程序中每个判定中条件结果的所有可能组合至少执行一次。应该注意如下三点:

①条件组合只针对同一个判断语句内存在多个条件的情况,让这些条件的取值进行笛卡尔乘积组合;

②不同的判断语句内的条件取值之间无须组合;

③对于单条件的判断语句,只需要满足自己的所有取值即可。

例6.9的条件组合覆盖测试用例如表6.21所示。

表6.21 条件组合覆盖测试用例

图示

通过这四个测试用例,程序中所有条件取值的组合都被满足了一次。

条件组合覆盖准则满足判定覆盖、条件覆盖、判定-条件覆盖准则,线性地增加了测试用例的数量。本例的程序存在三条路径,条件组合覆盖不能保证所有的路径被执行。

(6)路径覆盖。路径覆盖要求设计足够的测试用例,运行被测程序,覆盖程序中所有可能的路径。

例6.9的路径覆盖测试用例如表6.22所示。

表6.22 路径覆盖测试用例

图示

本例中共有四条路径,其中路径a→c→e不可能实现,通过这三个测试用例,所有可能的路径都满足过一次。

路径覆盖测试方法可以对程序进行彻底的测试,比前面5种覆盖面都广。100%满足路径覆盖,一定能100%满足判定覆盖标准,但并不一定能100%满足条件覆盖,也就不能100%满足条件组合覆盖。

从上例可知,单独采用任何一种逻辑覆盖方法都不能完全覆盖所有的测试用例,任何一个高效的测试用例,都是针对具体测试场景的。逻辑测试不是片面的测试正确的结果或是测试错误的结果,而是尽可能全面地覆盖每一个逻辑路径。所以在实际测试用例设计中,就要先从代码分析入手,根据不同的代码逻辑规则、语句执行情况,选用适合的覆盖方法。要根据不同需要和不同测试用例设计特征,将不同的设计方法组合起来,交叉使用,以实现最佳的测试用例输出。

↑上一章 ↓下一章
关注公众号获取验证码
复制内容需要验证码(7.99元/天)