实验四、白盒测试技术(二)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四、白盒测试技术(二)
一、实验类型
实验类型为验证型,2个学时。
二、实验目的
(1)通过简单程序白盒测试,熟悉测试过程,对软件测试行程初步了解,并养成良好的测试习惯;
(2)熟练掌握如何运用基路径测试方法进行测试用例设计,初步熟悉如何利用程序插装技术进行逻辑覆盖率分析;
三、背景知识
基本路径测试
如果把覆盖的路径数压缩到一定限度内,例如,程序中的循环体只执行零次和一次,就成为基本路径测试。它是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例的方法。
设计出的测试用例要保证在测试中,程序的每一个可执行语句至少要执行一次。
① 程序的控制流图
控制流图是描述程序控制流的一种图示方法。基本控制构造的图形符号如图所示。符号○称为控制流图的一个结点,一组顺序处理框可以映射为一个单一的结点。控制流图中的箭头称为边,它表示了控制流的方向,在选择或多分支结构中分支的汇聚处,即使没有执行语句也应该有一个汇聚结点。边和结点圈定的区域叫做区域,当对区域计数时,图形外的区域也应记为一个区域。
图1 控制流图的各种图形符号
如果判定中的条件表达式是复合条件时,即条件表达式是由一个或多个逻辑运算符(OR,AND,NAND,NOR)连接的逻辑表达式,则需要改复合条件的判定为一系列只有单个条件的嵌套的判定。例如对应图3-2. (a) 的复合条件的判定,应该画成如图3-2. (b) 所示的控制流图。条件语句if a OR b 中条件a和条件b各有一个只有单个条件的判定结点。
图2 复合逻辑下的控制流图
② 计算程序环路复杂性
进行程序的基本路径测试时,程序的环路复杂性给出了程序基本路径集合中的独立路径条数,这是确保程序中每个可执行语句至少执行一次所必需的测试用例数目的上界。
所谓独立路径,是指包括一组以前没有处理的语句或条件的一条路径。如在图3-3(b)所示的控制流图中,一组独立的路径是:
path1:1 - 11
path2:1 - 2 - 3 - 4 - 5 - 10 - 1 - 11
path3:1 - 2 - 3 - 6 - 8 - 9 - 10 - 1 - 11
path4:1 - 2 - 3 - 6 - 7 - 9 - 10 - 1 - 11
路径path1,path2,path3,path4组成了图3-3 (b) 所示控制流图的一个基本路径集。只要设计出的测试用例能够确保这些基本路径的执行,就可以使得程序中的每个可执行语句至少执行一次,每个条件的取真分支和取假分支也能得到测试。基本路径集不是唯一的,对于给定的控制流图,可以得到不同的基本路径集。
(a) 程序流程图(b) 控制流图
图3 程序流程图与对应的控制流图
通常环路复杂性可用以下三种方法求得。
▪将环路复杂性定义为控制流图中的区域数。
▪设E为控制流图的边数,N为图的结点数,则定义环路复杂性为V(G)=E-N+2。
▪若设P为控制流图中的判定结点数,则有V(G)=P+1。
因为图5.14(b)所示控制流图有4个区域。其环路复杂性为4。它是构成基本路径集的
独立路径数的上界。可以据此得到应该设计的测试用例的数目。
③ 导出测试用例
利用逻辑覆盖方法生成测试用例,确保基本路径集中每条路径的执行。
四、实验设备
主流PC机一套,要求安装windows操作系统、VC++开发工具和OFFICE工具;
五、实验内容
被测测试程序功能:计算被输入日期是星期几,已知公元1年1月1日是星期一,只要输入年月日,能自动回复当天是星期几。
程序代码,测试对象为while循环内代码:
#include
using namespace std;
int main()
{
int x=1,year,month,day;
while(x){
1 int i,num=0,total,total1,total2;
2 cout<<"请输入年份:";
3 cin>>year;
4 cout<<"请输入月份:";
5 cin>>month;
6 cout<<"请输入日期:";
7 cin>>day;
//求得输入年份之前一年末的总天数
8 for(i=1;i 9 if(((i%4==0)&&(i%100!=0))||(i%400==0)) 10 num++; } 11 total1=365*(year-num-1)+366*num; //求得输入年份的总天数 12 if(((i%4==0)&&(i%100!=0))||(i%400==0)){ //求得输入月份之前一个月末的总天数 13 switch(month){ case 1:total2=0;break; case 2:total2=31;break; case 3:total2=60;break; case 4:total2=91;break; case 5:total2=121;break; case 6:total2=152;break; case 7:total2=182;break; case 8:total2=213;break; case 9:total2=244;break; case 10:total2=274;break; case 11:total2=305;break; case 12:total2=335;break; } }else{ 14 switch(month){ case 1:total2=0;break; case 2:total2=31;break; case 3:total2=59;break; case 4:total2=90;break; case 5:total2=120;break; case 6:total2=151;break; case 7:total2=181;break; case 8:total2=212;break; case 9:total2=243;break; case 10:total2=273;break; case 11:total2=304;break; case 12:total2=334;break; } } //再加上输入的日,求其总和可得到总天数 15 total=total1+total2+day; 16 int week; 17 week=total%7; 18 cout<<"请输入的日期是"; 19 switch(week){ case 0:cout<<"星期天"< case 1:cout<<"星期一"< case 2:cout<<"星期二"< case 3:cout<<"星期三"< case 4:cout<<"星期四"< case 5:cout<<"星期五"< case 6:cout<<"星期六"< } 20 cout<<"********退出程序请输入0,否则任意输入继续********"< 21 cin>>x; } } 程序运行结果