白盒测试实验报告

实 验 报 告

一、实验目的

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)

//输入日期有效性检查中其他模块实现,此处假设输入日期都是合法数据

{

int days_month[13]={0,31,0,31,30,31,30,31,31,30,31,30,31}; MyDate yesterday; yesterday.month = date.month; // initialization yesterday.day = date.day; yesterday.year = date.year;

//初始化每月天数,其中2月不确定,初始化为0

if(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; a[0]=count(); yesterday.day=date.day-1;

}

{ a[3]=count(); } if(Leapyear(date.year)) { } else { } a[5]=count(); yesterday.month=2; yesterday.day=28; a[4]=count(); yesterday.month=2; yesterday.day=29; } 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)

{

}

int count()

{

}

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");

//----------- 执行测试用例,记录测试结果----------- return 1; printf("%d--%d--%d\n",date.year,date.month,date.day);

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

{ } printf("覆盖率=%d", sum*100/7); printf("%%\n"); sum=sum+a[i];

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 ( );// 调用测试驱动程序

}

……

三、总结与体会

实验中对于路径测试有了更深的理解,可以更好、更迅速的去划分路径,设计测试用例,只是对插桩技术不太理解,不知道怎样去较好的设计插桩用例,也不知道怎样去计算插桩测试的覆盖率,通过实验过程对其有了进一步的理解,可是感觉还有点模糊,课后好好复习!

还有,就是插桩测试的结果和预期的结果有所差异,没找到错误所在,希望老师能指出。

实 验 报 告

一、实验目的

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)

//输入日期有效性检查中其他模块实现,此处假设输入日期都是合法数据

{

int days_month[13]={0,31,0,31,30,31,30,31,31,30,31,30,31}; MyDate yesterday; yesterday.month = date.month; // initialization yesterday.day = date.day; yesterday.year = date.year;

//初始化每月天数,其中2月不确定,初始化为0

if(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; a[0]=count(); yesterday.day=date.day-1;

}

{ a[3]=count(); } if(Leapyear(date.year)) { } else { } a[5]=count(); yesterday.month=2; yesterday.day=28; a[4]=count(); yesterday.month=2; yesterday.day=29; } 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)

{

}

int count()

{

}

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");

//----------- 执行测试用例,记录测试结果----------- return 1; printf("%d--%d--%d\n",date.year,date.month,date.day);

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

{ } printf("覆盖率=%d", sum*100/7); printf("%%\n"); sum=sum+a[i];

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 ( );// 调用测试驱动程序

}

……

三、总结与体会

实验中对于路径测试有了更深的理解,可以更好、更迅速的去划分路径,设计测试用例,只是对插桩技术不太理解,不知道怎样去较好的设计插桩用例,也不知道怎样去计算插桩测试的覆盖率,通过实验过程对其有了进一步的理解,可是感觉还有点模糊,课后好好复习!

还有,就是插桩测试的结果和预期的结果有所差异,没找到错误所在,希望老师能指出。


相关内容

  • 大学网络实验室方案论证报告
  • 网络实验室测试实验方案论证报告 目 录 前 言 .................................................................. 1 一.计算机网络教育现状 ............................................. ...

  • 实验室检测方法管理标准
  • QB 实验室检测方法管理标准 攀枝花钢铁有限责任公司 发布 QG/YX0137-2004 前 言 为规范冶金产品理化检测实验室取样.样品制备/加工.校准及检测方法的选择和确定.试验和确认.审批和应用,特制订本标准. 本标准由攀枝花钢铁有限责任公司提出. 本标准由攀枝花钢铁有限责任公司委托质量计量管理 ...

  • 中心实验室程序文件
  • 河北中原金属材料及制品检测中心实验室标准 测试工作日常管理程序 ZYJZ102-2000 1 范围 本程序规定了中心实验室日常工作内容方面的管理. 本程序适用于中心实验室日常管理. 本程序的目的:通过科学.严谨.务实的内务管理,创造一个良好的检测环境,为检测工作顺利有效进行服务. 2 定义 本程序引 ...

  • 实验报告实验心得
  • 实验心得体会 在做测试技术的实验前,我以为不会难做,就像以前做物理实验一样,做完实验,然后两下 子就将实验报告做完.直到做完测试实验时,我才知道其实并不容易做,但学到的知识与难度 成正比,使我受益匪浅. 在做实验前,一定要将课本上的知识吃透,因为这是做实验的基础,否则,在老师讲解时就 会听不懂,这将 ...

  • 实验实训报告1
  • 纤维鉴别实验 实验实训任务书 课程名称:服装材料 任课老师:杨陈 实验实训项目名称:纤维鉴别实验 实验实训目的及内容:用手感目测法.显微镜观察法.燃烧法和化学溶解法对 服装面料的纤维进行正确鉴别. 实验实训要求:使用普通生物显微镜观察和认识各种纤维的表面形态及其特征, 同时了解普通生物显微镜的构造并 ...

  • 木材实验报告
  • 篇一:木材实验报告 木 材 实 验 报 告 班级:08020241 学号:39 姓名:符日雄 林木宏观特征实验报告 实验目的:客观的了解和学习木材宏观特征 实验仪器:放大镜.木材标本.实验桌 实验内容:用放大镜观察木材标本,记录观察内容. 木材的宏观特征记录林木微观构造实验报告 1.实验目的:客观的 ...

  • 微机保护实验报告
  • 实验七 一.实验目的 微机线路相间方向距离保护实验 1.掌握微机相间方向距离保护特性的检验方法. 2.掌握微机相间方向距离保护一.二.三段定值的检验方法. 3.掌握微机保护综合测试仪的使用方法. 4.熟悉微机型相间方向距离保护的构成方法. 二.实验项目 1.微机相间方向距离保护特性实验 2.微机相间 ...

  • CTA认证
  • 手机CTA 认证测试流程 一.摸底测试 摸底机构:中心实验室及其它检测中心 摸底目的:保证入网检测顺利通过. 摸底周期:无委2天.EMC/泰尔3天.现网1天摸底项目: EMC :射频杂散骚扰(需要合作方提供摸底检测报告).辐射连续骚(需要合作方提供摸底检测报告).静电放电抗扰度(ESD ): 无委: ...

  • 授权签字人评价
  • 授权签字人考核 1.授权签字人是如何产生的? 上级任命,通过评审组考核 吉林省技术监督局确认 2.授权签子人的岗位职责和权利? 职责:对检测报告有最终技术审查职责 ,对检测结果的完整性和准确性负责: 权利:对于不符合认可要求(若所用的方法.设备.不合适)的结果和报告具有否决权 3.批准报告应注意什么 ...

  • 电力电子技术实验大纲
  • 电力电子技术实验大纲 电气信息学院专业中心实验室 2015版 我们需要什么样的专业课实验报告书? 进入大三以后,我们会面对很多专业课程实验项目,如何让这些实验的报告体现出它应该有的"专业"性? 撇开具体的实验内容不谈,实验报告应该具有以下共同的特质: 1. 报告具有尽可能丰富的实 ...