当前位置:范文大全 > 调查报告 > 白盒测试实验报告33441|黑盒测试实验报告

白盒测试实验报告33441|黑盒测试实验报告

时间:2022-01-10 13:22:01 浏览次数:

  实 验 报 告

 课 程

 软件测试

 实验项目

 白盒测试用例设计与执行

 专业年级

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

 }

 ……

 三、总结与体会

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

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