周立功新书解读:使用逻辑覆盖设计单元测试用例

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

使用逻辑覆盖设计单元测试用例

摘要:周立功教授新书发布系列连载篇:逻辑覆盖是单元测试中常用的测试用例设计方法,本文截取《软件单元测试入门与实践》中逻辑覆盖部分内容,帮助读者理解逻辑覆盖的用法。

本文摘自《软件单元测试入门与实践》第4章。

在单元测试开展过程中,首先需要设计测试用例。逻辑覆盖是以程序内部的逻辑结构为基础的测试用例设计方法,其目的是为了尽可能的覆盖程序的语句以及不同的判定条件。逻辑覆盖有语句覆盖(SC)、判定覆盖(DC)、条件覆盖(CC)、条件组合覆盖(MCC)、修正条件判定覆盖(MC/DC)几种方法。为了便于理解各种方法的不同之处,本文将以闰年判断函数为例进行说明。闰年判断函数代码如下:

bool IsLeapYear(int year)

{

bool flag = false;

if ((0 == year % 400) || (0 != year %100) && (0 == year % 4))

{

flag = true;

}

return flag;

}

假定该函数在书写过程中可能会出现以下几种错误:

1) “||”被误写为“&&”;

2) “&&”被误写为“||”;

3) “0 == year % 400”被误写为“0 != year % 400”;

4) “0 != year % 100”被误写为“0 == year % 100”;

5) “0 == year % 4”被误写为“0 != year % 4”;

6) 判断条件被误写为“if (0 == year % 4)”。

1. 语句覆盖

语句覆盖的含义是,选择足够多的测试数据,使得程序中的每条语句都至少被执行一次。

为了满足语句覆盖,只需要设计一个测试数据使得第4行的判定语句为真即可,那么使用2000作为输入数据即可满足要求。使用该数据测试发现问题的情况表1。

表1 语句覆盖发现问题情况

由此可见,测试数据虽然满足了语句覆盖,但是也只能发现少量的问题。在实际测试过程中,语句覆盖被认为是最弱的一种逻辑覆盖。

2. 判定覆盖

判定覆盖的含义为,选择足够多的测试数据,使得程序中的每个判断语句至少出现一次真值和一次假值。

为了满足判定覆盖,需要第4行的判定语句出现一次真值和一次假值。当输入值为2000时,该语句的判定结果为真;当输入值为1999时,该语句的判定结果为假。使用这两个数据进行测试发现问题的情况详见表2。

表2 判定覆盖发现问题情况

由此可见,判定语句虽然比语句覆盖能够发现更多的问题,但还是无法发现所有可能的问题。

3. 条件覆盖

条件覆盖的定义为,当一个判定语句由多个条件组合而成时,选择足够多的测试数据,使得每一判定语句中的每个逻辑条件的可能的值至少出现一次。符合条件覆盖的测试数据详见下表。

表3 条件覆盖发现问题情况

现所有可能的问题。

4. 条件组合覆盖

条件组合覆盖的含义是,当一个判定语句由多个条件组合而成时,选择足够多的测试数据,使得各个条件的各种可能的组合都出现一次。三个条件的各种组合情况详见下表。

表4 条件组合

情况如下。

表5 条件组合覆盖发现问题情况

盖方法。

条件组合覆盖的缺点是测试数据的数量会很多,在本例中由于三个条件有相互制约的关系,所以只有4个数据。在实际情况下可能各个条件并没有相互制约的关系,那么用例数量就有8个了。当条件数量增多时,测试数据的数量也是成指数增长的,会导致测试效率低下。所以条件组合覆盖也不是最好的逻辑覆盖方法。

5. 修正条件判定覆盖

修正条件判定覆盖的含义是,画出程序的控制流,选择足够多的测试数据,使得程序控制流中的每一条路径都执行一次。

第一步,将代码中每一条语句都进行编号,如果一条判断语句中有多个条件,则每一个条件单独编号。编号后的闰年判断函数如下。

bool IsLeapYear(int year)

{

bool flag = false; // 1

if ((0 == year % 400) || (0 != year %100) && (0 == year % 4)) // 2, 3, 4

{

flag = true; // 5 }

return flag; // 6 }

第二步,画出程序的控制流图。

图1 程序控制流图

第三步,找到所有的路径,并为每条路径选取测试数据。

表6 线性无关路径

在本例中,修正判定条件覆盖得到的用例和条件组合覆盖得到的用例是一致的,那是因为本例中各个条件之间的制约关系,实际测试过程中修正判定条件覆盖得到的用例会比条件组合覆盖得到的用例少。由于修正判定条件覆盖方法中保证每条路径都执行了一次,所以是相对覆盖比较全面的方法。

通过前面的描述可知,逻辑覆盖能够有效的发现问题,然而逻辑覆盖自身的缺点也是显而易见的。在使用逻辑覆盖设计测试用例时,对实现的依赖性太高,以至于开发者很难考虑到代码本身没有考虑到的地方。所以在进行单元测试的过程中,除了使用逻辑覆盖之外,还需要使用数据覆盖。两种方法同时使用,相互补充,才能最大限度的提高测试的覆盖率。

若读者想要了解更多测试用例设计的内容,可阅读《软件单元测试入门与实践》第4章。

相关文档
最新文档