第1关:逻辑覆盖
任务描述
本关任务:设计测试用例,填写代码,完成白盒测试。
相关知识
为了完成本关任务,你需要掌握: 1.语句覆盖; 2.判定覆盖; 3.条件覆盖; 4.判定/条件覆盖; 5.条件组合覆盖; 6.路径覆盖。
什么是逻辑覆盖
逻辑覆盖是非常典型的一种测试方案设计方法,属于白盒测试的一种。所谓逻辑覆盖是对一系列测试过程的总称,这组测试过程逐渐进行越来越完善的通路测试。
测试数据执行(或者叫覆盖)程序逻辑的程序可以划分成不同的等级,等级从低到高分别为:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖、路径覆盖。
语句覆盖
为了暴露程序中的错误,每个语句至少应该执行一次。语句覆盖的含义是,选择足够多的测试数据,使被测程序中的每个语句至少执行一次。
假设需要测试这样的代码:
int foo(int a, int b)
{
return a / b;
}
假如测试人员编写如下测试用例: TeseCase: a = 10, b = 5, result=2
很明显,这样的测试用例是满足语句覆盖的,因为foo
函数中的代码至少执行了一次。但是这样的测试用例找不出b
不能是0
的bug
。
从这个例子不难看出,语句覆盖无法发现程序中逻辑运算的错误。
判定覆盖
顾名思义,判定覆盖是设计足够多的测试用例,使得程序中的每一个判断至少获得一次“真”和一次“假”,即使程序流程图中的每一个真假分支至少被执行一次。
假设需要使用判定覆盖来测试这样的代码:
int a, b;
if(a || b)
result = a + b;
else
result = a * b;
则测试用例可以如下所示:
TeseCase1: a = 1 , b = 0, result=1
TeseCase2: a = 0 , b = 0, result=0
条件覆盖
条件覆盖是指选择足够的测试用例,使得运行这些测试用例时,判定中每个条件的所有可能结果至少出现一次。
还是以刚刚的代码为例,由于a
和b
在if
判断中的作用是表示真假,所以a
和b
在判断分支中都分别有两种结果,即true
和false
。因此只需要两个测试用例,就能满足条件覆盖。测试用例如下:
TeseCase1: a = 1 , b = 0, result=1
TeseCase2: a = 0 , b = 1, result=1
当然,测试用例也可以是这样的。
TeseCase1: a = 1 , b = 1, result=1
TeseCase2: a = 0 , b = 0, result=0
你会发现,即使满足条件覆盖,也不一定能够覆盖全部判断分支。例如例子中第一种测试用例就没有覆盖到else
。
判定/条件覆盖
从覆盖的名字上看就应该能猜到,判定/条件覆盖的意思是即满足判定覆盖又满足条件覆盖。也就是说,上面例子中的第二种测试用例满足判定/条件覆盖。
条件组合覆盖
选择足够的测试用例,使得每个判定中条件的各种可能组合都至少出现一次。显然,满足“条件组合覆盖”的测试用例是一定满足“判定覆盖”、“条件覆盖”和“判定/条件覆盖”的。
由于程序中有两个判定(if else
),每个判定中的每个条件都有两种结果,所以测试用例应该是这样的。
TeseCase1: a = 1 , b = 1, result=1
TeseCase2: a = 0 , b = 0, result=0
TeseCase1: a = 1 , b = 0, result=1
TeseCase2: a = 0 , b = 1, result=1
路径覆盖
路径覆盖是选取足够多的的测试数据,使程序的每条可能路径都至少执行一次。
例子中的程序有总共有两条路径,即if
和else
。所以测试用例可以是:
TeseCase1: a = 1 , b = 1, result=1
TeseCase2: a = 0 , b = 0, result=0
编程要求
设计满足路径覆盖的多个测试用例,用于对IsNarcissisticNumber
函数进行白盒测试。在右侧编辑器 Begin-End 区间补充代码,完成白盒测试。
IsNarcissisticNumber
函数是用来判断一个三位数是否为水仙花数,若是水仙花数则会返回1
,否则返回0
。函数代码如下:
//判断一个数是否为水仙花数,若是水仙花数则返回1,否则返回0
int IsNarcissisticNumber(int number)
{
if(number <= 99 || number >= 1000)
{
return 0;
}
int a = number%10;
int b = number/10%10;
int c = number/100%10;
if(number == a*a*a+b*b*b+c*c*c)
return 1;
return 0;
}
测试说明
平台会对你编写的代码进行测试。
测试输入: 预期输出: 总共3条路径,已覆盖3条路径
开始你的任务吧,祝你成功!
代码如下
#include"func.h"
#include<stdio.h>
//输入测试用例进行测试,其中number表示测试输入,result表示预期输出
//该函数内部会调用IsNarcissisticNumber函数,若实际输出与预期输出不一致,会给予提示
void RunTestCase(int number, int result);
void WhiteTest()
{
/*请按要求设计测试用例,并调用RunTestCase*/
/*********Begin********/
RunTestCase(1000, 0); //四位数,不是水仙花数
RunTestCase(153, 1); //是水仙花数
RunTestCase(100, 0); //是三位数,但不是水仙花数
/*********End*********/
}