头歌实践教学平台:白盒测试用例

第1关:逻辑覆盖

任务描述

本关任务:设计测试用例,填写代码,完成白盒测试。

相关知识

为了完成本关任务,你需要掌握: 1.语句覆盖; 2.判定覆盖; 3.条件覆盖; 4.判定/条件覆盖; 5.条件组合覆盖; 6.路径覆盖。

什么是逻辑覆盖

逻辑覆盖是非常典型的一种测试方案设计方法,属于白盒测试的一种。所谓逻辑覆盖是对一系列测试过程的总称,这组测试过程逐渐进行越来越完善的通路测试。

测试数据执行(或者叫覆盖)程序逻辑的程序可以划分成不同的等级,等级从低到高分别为:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖、路径覆盖。

语句覆盖

为了暴露程序中的错误,每个语句至少应该执行一次。语句覆盖的含义是,选择足够多的测试数据,使被测程序中的每个语句至少执行一次。

假设需要测试这样的代码:

 
  1. int foo(int a, int b)
  2. {
  3. return a / b;
  4. }

假如测试人员编写如下测试用例: TeseCase: a = 10, b = 5, result=2

很明显,这样的测试用例是满足语句覆盖的,因为foo函数中的代码至少执行了一次。但是这样的测试用例找不出b不能是0bug

从这个例子不难看出,语句覆盖无法发现程序中逻辑运算的错误。

判定覆盖

顾名思义,判定覆盖是设计足够多的测试用例,使得程序中的每一个判断至少获得一次“真”和一次“假”,即使程序流程图中的每一个真假分支至少被执行一次。

假设需要使用判定覆盖来测试这样的代码:

 
  1. int a, b;
  2. if(a || b)
  3. result = a + b;
  4. else
  5. result = a * b;

则测试用例可以如下所示:

 
  1. TeseCase1: a = 1 , b = 0, result=1
  2. TeseCase2: a = 0 , b = 0, result=0
条件覆盖

条件覆盖是指选择足够的测试用例,使得运行这些测试用例时,判定中每个条件的所有可能结果至少出现一次。

还是以刚刚的代码为例,由于abif判断中的作用是表示真假,所以ab在判断分支中都分别有两种结果,即truefalse。因此只需要两个测试用例,就能满足条件覆盖。测试用例如下:

 
  1. TeseCase1: a = 1 , b = 0, result=1
  2. TeseCase2: a = 0 , b = 1, result=1

当然,测试用例也可以是这样的。

 
  1. TeseCase1: a = 1 , b = 1, result=1
  2. TeseCase2: a = 0 , b = 0, result=0

你会发现,即使满足条件覆盖,也不一定能够覆盖全部判断分支。例如例子中第一种测试用例就没有覆盖到else

判定/条件覆盖

从覆盖的名字上看就应该能猜到,判定/条件覆盖的意思是即满足判定覆盖又满足条件覆盖。也就是说,上面例子中的第二种测试用例满足判定/条件覆盖。

条件组合覆盖

选择足够的测试用例,使得每个判定中条件的各种可能组合都至少出现一次。显然,满足“条件组合覆盖”的测试用例是一定满足“判定覆盖”、“条件覆盖”和“判定/条件覆盖”的。

由于程序中有两个判定(if else),每个判定中的每个条件都有两种结果,所以测试用例应该是这样的。

 
  1. TeseCase1: a = 1 , b = 1, result=1
  2. TeseCase2: a = 0 , b = 0, result=0
  3. TeseCase1: a = 1 , b = 0, result=1
  4. TeseCase2: a = 0 , b = 1, result=1
路径覆盖

路径覆盖是选取足够多的的测试数据,使程序的每条可能路径都至少执行一次。

例子中的程序有总共有两条路径,即ifelse。所以测试用例可以是:

 
  1. TeseCase1: a = 1 , b = 1, result=1
  2. TeseCase2: a = 0 , b = 0, result=0
编程要求

设计满足路径覆盖的多个测试用例,用于对IsNarcissisticNumber函数进行白盒测试。在右侧编辑器 Begin-End 区间补充代码,完成白盒测试。

IsNarcissisticNumber函数是用来判断一个三位数是否为水仙花数,若是水仙花数则会返回1,否则返回0。函数代码如下:

 
  1. //判断一个数是否为水仙花数,若是水仙花数则返回1,否则返回0
  2. int IsNarcissisticNumber(int number)
  3. {
  4. if(number <= 99 || number >= 1000)
  5. {
  6. return 0;
  7. }
  8. int a = number%10;
  9. int b = number/10%10;
  10. int c = number/100%10;
  11. if(number == a*a*a+b*b*b+c*c*c)
  12. return 1;
  13. return 0;
  14. }
测试说明

平台会对你编写的代码进行测试。

测试输入: 预期输出: 总共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*********/
}

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。在编写C程序时,需要注意变量的声明和定义、指针的使用、内存的分配与释放等问题。C语言中常用的数据结构包括: 1. 数组:一种存储同类型数据的结构,可以进行索引访问和修改。 2. 链表:一种存储不同类型数据的结构,每个节点包含数据和指向下一个节点的指针。 3. 栈:一种后进先出(LIFO)的数据结构,可以通过压入(push)和弹出(pop)操作进行数据的存储和取出。 4. 队列:一种先进先出(FIFO)的数据结构,可以通过入队(enqueue)和出队(dequeue)操作进行数据的存储和取出。 5. 树:一种存储具有父子关系的数据结构,可以通过中序遍历、前序遍历和后序遍历等方式进行数据的访问和修改。 6. 图:一种存储具有节点和边关系的数据结构,可以通过广度优先搜索、深度优先搜索等方式进行数据的访问和修改。 这些数据结构在C语言中都有相应的实现方式,可以应用于各种不同的场景。C语言中的各种数据结构都有其优缺点,下面列举一些常见的数据结构的优缺点: 数组: 优点:访问和修改元素的速度非常快,适用于需要频繁读取和修改数据的场合。 缺点:数组的长度是固定的,不适合存储大小不固定的动态数据,另外数组在内存中是连续分配的,当数组较大时可能会导致内存碎片化。 链表: 优点:可以方便地插入和删除元素,适用于需要频繁插入和删除数据的场合。 缺点:访问和修改元素的速度相对较慢,因为需要遍历链表找到指定的节点。 栈: 优点:后进先出(LIFO)的特性使得栈在处理递归和括号匹配等问题时非常方便。 缺点:栈的空间有限,当数据量较大时可能会导致栈溢出。 队列: 优点:先进先出(FIFO)的特性使得

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值