实 验 报 告
课 程
软件测试
实验项目
白盒测试用例设计与执行
专业年级
计科07级
姓 名
李专
学 号
0705010136
指导教师
实验时间
2010-6-4
实验成绩
一、实验目的1.熟练掌握如何运用基路径测试方法进行测试用例设计。
2.初步熟悉如何利用程序插装技术进行逻辑覆盖率分析。
二、实验内容
1、题目
前一日函数PreDate是NextDate的逆函数(代码实现见下),实现功能为:输入1800 年到2050 年之间的某个日期,函数返回这一天的前一天的日期。(此处不考虑无效输入)
请采用基路径方法对前一日函数进行测试用例设计,并利用程序插装技术对测试用例的判定覆盖率进行检查分析。
代码:(被测函数为PreDate)
#include"stdio.h"
typedef struct MyDate{
int month;
int day;
int year;
}MyDate;
MyDate PreDate(MyDate date);
int Leapyear(int year);
void Print(MyDate date);
MyDate PreDate(MyDate date)
//输入日期有效性检查中其他模块实现,此处假设输入日期都是合法数据
{
1.MyDate yesterday;
2.yesterday.month = date.month; // initialization
3.yesterday.day = date.day;
4.yesterday.year = date.year;
5.int days_month[13]={0,31,0,31,30,31,30,31,31,30,31,30,31};
//初始化每月天数,其中2月不确定,初始化为0
6.if(date.day>1)
7.yesterday.day=date.day-1;
else
{
8.if(date.month==1)
{
9.yesterday.year=date.year-1;
10.yesterday.month=12;
11.yesterday.day=31;
}
12.else if(date.month==3)
{
13.if(Leapyear(date.year))
{
14.yesterday.month=2;
15.yesterday.day=29;
}
else
{
16.yesterday.month=2;
17.yesterday.day=28;
}
}
else
{
18.yesterday.month=date.month-1;
19.yesterday.day=days_month[date.month-1];
}
}
20.return yesterday;
}
21.int Leapyear(int year)
{
22.if((year%4==0&&year%100!=0) || (year%400==0))
23.return 1;
24.else return 0;
}
void Print(MyDate date)
{
25.printf("%d--%d--%d\n",date.year,date.month,date.day);
}
2、测试用例设计
1)控制流图
2)环路复杂度计算
由图可知,图中的环路有五条,故环路复杂度为五。
3)基本路径集设计
基本路径集为:
A.1、2、3、4、5、6、8、12、13、14、15、20、25
B.1、2、3、4、5、6、8、12、16、17、20、25
C.1、2、3、4、5、6、8、12、18、19、20、25
D.1、2、3、4、5、6、8、9、10、11、20、25
E.1、2、3、4、5、6、7、20、25
4)测试用例集设计
测试用例集为:
2000-1-2 2000-1-1 2000-3-1
1999-3-1 1980-5-1
3、插装后源程序清单与判定覆盖率分析结果(要求截取插装后程序运行界面)
#include"stdio.h"
typedef struct MyDate{
int month;
int day;
int year;
}MyDate;
int a[6];
MyDate PreDate(MyDate date);
int Leapyear(int year);
void Print(MyDate date);
int count();
MyDate PreDate(MyDate date)
//输入日期有效性检查中其他模块实现,此处假设输入日期都是合法数据
{
MyDate yesterday;
yesterday.month = date.month; // initialization
yesterday.day = date.day;
yesterday.year = date.year;
int days_month[13]={0,31,0,31,30,31,30,31,31,30,31,30,31};
//初始化每月天数,其中2月不确定,初始化为0
if(date.day>1)
{
a[0]=count();
yesterday.day=date.day-1;
}
else
{
a[1]= count();
if(date.month==1)
{
a[2]= count();
yesterday.year=date.year-1;
yesterday.month=12;
yesterday.day=31;
}
else if(date.month==3)
{
a[3]=count();
if(Leapyear(date.year))
{
a[4]=count();
yesterday.month=2;
yesterday.day=29;
}
else
{
a[5]=count();
yesterday.month=2;
yesterday.day=28;
}
}
else
{
a[6]=count();
yesterday.month=date.month-1;
yesterday.day=days_month[date.month-1];
}
}
return yesterday;
}
int Leapyear(int year)
{
if((year%4==0&&year%100!=0) || (year%400==0))
return 1;
else return 0;
}
void Print(MyDate date)
{
printf("%d--%d--%d\n",date.year,date.month,date.day);
}
int count()
{
return 1;
}
void DriverofPreDate()
{
int tcPassNum = 0;
int tcFailNum = 0; // 存储通过和失败的测试用例总数
FILE *pFpFrom=NULL;
FILE *pFpTo=NULL;
//----------- 打开数据文件,准备读取测试用例的数据-----------
char *DataFileName="test.txt";
pFpFrom=fopen(DataFileName,"r");
if(!pFpFrom){
printf("读取数据失败,返回\n");
return; }
//----------- 打开数据文件,准备记录测试用例执行结果-----------
char *DataFileTestResultName="DivedeTestResult.txt";
pFpTo=fopen(DataFileTestResultName,"w");
if(!pFpTo){
printf("打开文件失败,返回\n");
return; }
fprintf(pFpTo,"----------对函数PreDate的单元测试结果------------\n");
//----------- 执行测试用例,记录测试结果-----------
int TCID = 0;
int sum=0;
MyDate date ; // 测试用例的输入
MyDate expectedOut,actualOut; // 测试用例的预期、实际输出
printf("对函数PreDate展开单元测试\n");
while(!feof(pFpFrom)){ // 不断读取每个测试用例的数据
fscanf(pFpFrom, "%d ", &TCID); // 读入测试用例的ID
fscanf(pFpFrom, "%d %d %d", &date.month,&date.day,&date.year); //读测试用例输入
fscanf(pFpFrom,"%d %d %d", &expectedOut.year,&expectedOut.month,&expectedOut.day); // 读入测试用例的预期输出
actualOut = PreDate(date); // 执行测试用例
printf( "测试用例%d: 输入%d,%d,%d, 预期输出%d,%d,%d,,实际输出%d,%d,%d, ",
TCID, date.month,date.day,date.year,expectedOut.year, expectedOut.month,expectedOut.day,actualOut.year,actualOut.month,actualOut.day); // 输出测试用例的信息
if( actualOut.day==expectedOut.day&&actualOut.month==expectedOut.month&&actualOut.year==expectedOut.year){// 若测试用例通过,则记录通过用例总数
tcPassNum ++; printf( "通过\n" );
fprintf(pFpTo,"测试用例%d:Pass",TCID); //将测试结果存入结果文件
}
else{
tcFailNum ++; printf( "失败\n" );
fprintf(pFpTo,"测试用例%d:Fail",TCID); //将测试结果存入结果文件
}
}
//----------- 统计测试结果-----------
for(int i=0;i<=6;i++)
{
sum=sum+a[i];
}
printf("覆盖率=%d", sum*100/7);
printf("%%\n");
printf( "共执行%d 个测试用例,其中%d 个通过,%d 个失败\n", tcPassNum+tcFailNum, tcPassNum, tcFailNum );
fprintf(pFpTo,"共执行%d 个测试用例,其中%d 个通过,%d 个失败\n", tcPassNum+tcFailNum, tcPassNum, tcFailNum );
fclose(pFpFrom);
fclose(pFpTo);
}
void main()
{
DriverofPreDate ( );// 调用测试驱动程序
}
……
三、总结与体会
实验中对于路径测试有了更深的理解,可以更好、更迅速的去划分路径,设计测试用例,只是对插桩技术不太理解,不知道怎样去较好的设计插桩用例,也不知道怎样去计算插桩测试的覆盖率,通过实验过程对其有了进一步的理解,可是感觉还有点模糊,课后好好复习!
还有,就是插桩测试的结果和预期的结果有所差异,没找到错误所在,希望老师能指出。
相关热词搜索: 实验 测试 报告