软件工程概论实验报告

第一层DFD图KTV管理系统的事务型划分

ATM操作模块程序流程图

ATM操作模块PDA图

ATM操作模块PDL语言

IF验证成功THEN验证成功ELSE退出系统ENDIF

IF选择取款THEN取款ENDIF

IF选择查询THEN查询ENDIF

IF选择转帐THEN转帐ENDIF

ELSE退出系统

 

第二篇:软件工程概论实验报告

  南昌大学实验报告

学生姓名:             学    号:  011910300056      专业班级:  软件工程  

实验类型:□ 验证 □ 综合 □ 设计 □ 创新   实验日期: 20##-4-20  实验成绩:            

一、实验项目名称

软件工程白盒测试

二、实验目的

1、掌握白盒测试策略的选择方法

2、白盒测试用例的设计方法

3、自动白盒测试的方法及实施步骤

三、实验基本原理

白盒测试也称结构测试或逻辑驱动测试,它是按照程序内部的结构测试程序,通过测试来检测产品内部动作是否按照设计规格说明书的规定正常进行,检验程序中的每条通路是否都能按预定要求正确工作。 这一方法是把测试对象看作一个打开的盒子,测试人员依据程序内部逻辑结构相关信息,设计或选择测试用例,对程序所有逻辑路径进行测试,通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。

四、主要仪器设备及耗材

测试平台:windows XP SP2

测试工具:白盒测试工具Dev c++

测试语言:C++

五、实验步骤

1.自动化测试方案

   根据已经编写好的文件检索软件的测试计划、测试用例等编写自动化测试方案,

   测试目标函数为MatchPattern;

2.自动化测试脚本

2.1测试驱动程序和用例的设计和实现

根据已有的函数编写测试程序,从而驱动被测试的函数。再通过画出程序的流程图设计插桩函数,分析路径覆盖情况,从而设计用例,尽量覆盖所有路径。

2.1.1测试用例谓词表

2.1.2测试用例路径覆盖表

2.2全部测试脚本

*源代码如下:

#include <cstdlib>

#include <iostream>

using namespace std;

#define MAXPATTERN 20

#define MAXFILELEN 128     //定义最长文件名

#define FALSE 0

#define TRUE 1

void printpre(char file[MAXFILELEN+1],char pattern[MAXPATTERN+1]);

void printaft(int a);

int FindSubString ( const char* source, const char* dest );

bool MatchPattern(char* file, char* pattern);

int main()

{

    char file[MAXFILELEN+1]= {0};

    char pattern[MAXPATTERN+1]= {0};

    char* pfile;

    char* ppattern;

    int result = 0;

    printpre(file,pattern);

    pfile = &file[0];

    ppattern = &pattern[0];

    result = MatchPattern(pfile,ppattern);

    printaft(result);

    system("PAUSE");

    return 0;

}

void printpre(char file[MAXFILELEN+1],char pattern[MAXPATTERN+1]){

    cout<<"Please type in the file name :";

    cin>>file;

    //cout<<endl;

    cout<<"Please type in the pattern :";

    cin>>pattern;

    cout<<"。。。测试进行中。。。"<<endl;

    cout<<endl;

    cout<<"----------------------自动测试分析如下----------------------" <<endl;

    ///*

    cout<<"一、测试输入信息:"<<endl;

    cout<<"File:   "<<file<<" "<<endl;

    cout<<"Pattern:"<<pattern<<endl;

    cout<<endl;

    cout<<"二、测试过程信息:"<<endl;

    cout<<"被测试函数共有条17分支,分别是:"<<endl;

    cout<<"  ⑴S,1,E "<<endl;

    cout<<"⑵S,2,4,6,7,E  "<<endl;

    cout<<"⑶S,2,4,6,8,10,E  "<<endl;

    cout<<"⑷S,2,4,6,8,9,11,10,E  "<<endl;

    cout<<"⑸S,2,4,6,8,9,12,E  "<<endl;

    cout<<"⑹S,2,3,4,6,7,E   "<<endl;

    cout<<"⑺S,2,3,4,6,8,10,E  "<<endl;

    cout<<"⑻S,2,3,4,6,8,9,11,10,E "<<endl;

    cout<<"⑼S,2,3,4,6,8,9,12,E  "<<endl;

    cout<<"⑽S,2,4,5,6,7,E   "<<endl;

    cout<<"⑾S,2,4,5,6,8,10,E   "<<endl;

    cout<<"⑿S,2,4,5,6,8,9,11,10,E  "<<endl;

    cout<<"⒀S,2,4,5,6,8,9,12,E "<<endl;

    cout<<"⒁S,2,3,4,5,6,7,E   "<<endl;

    cout<<"⒂S,2,3,4,5,6,8,10,E  "<<endl;

    cout<<"⒃S,2,3,4,5,6,8,9,11,10,E  "<<endl;

    cout<<"⒄S,2,3,4,5,6,8,9,12,E  "<<endl;

    cout<<endl;

    cout<<"本测试数据经过分支:            ";

    //*/

 }

 void printaft(int match){

    cout<<endl;

    cout<<endl;

    cout<<"三、测试输出信息:"<<endl;

    if(match == 1){

         cout<<"Succeed in Pattern-Match !"<<endl;         

                  }

    else{

         cout<<"Failure in Pattern-Match !"<<endl;

        }

}

int FindSubString ( const char* source, const char* dest )

{

   char l_Source[MAXFILELEN+1];

   char l_Dest[MAXFILELEN+1];

   int i=0 , j=0;

   if( (source == NULL) || (dest == NULL) )

   {

      return -1;

   }

   strcpy(l_Source, source);

   _strupr(l_Source);

   strcpy(l_Dest, dest);

   _strupr(l_Dest);

   while( l_Source[i] != '\0')

   {

      j = 0;

      while((l_Dest[j] != '\0') && (l_Source[i + j] != '\0')

                 && ((l_Dest[j] == '?') || (l_Dest[j] == l_Source[i + j])))

      {

          j++;

      }

      if( l_Dest[j] == '\0' )

      {

          break ;

      }

      else

      {

          i++;

      }

   }

   if( l_Source[i] != '\0' )

   {

       /*

      cout<<endl;

      cout<<"i="<<i<<endl;

      */

      return i;

   }

   else

   {

      return -1;

   }

}

bool MatchPattern(char* file, char* pattern)

{

   char l_Pat[MAXPATTERN+1][MAXFILELEN+1];

   int i,j,k;

   char* l_Ptr;

    cout<<"S,";

   memset(l_Pat, 0, MAXPATTERN*(MAXFILELEN+1));

   i = j = k = 0;

   l_Ptr = NULL;

    //cout<<"pass1"<<endl;

   if((file == NULL) || (pattern == NULL))

   {

        cout<<"1,";

      //ASSERT(FALSE);//该段代码不应该被执行到 如果不能编译可以注释掉

      return FALSE;

   }

    //cout<<"pass2"<<endl;

    cout<<"2,";

   while(pattern[i] != '\0')

   {

       //cout<<"pass3"<<endl;

        if(i == 0){

             cout<<"3,";

        }

      if( pattern[i] == '*' )

      {

          if( k != 0)

          {

             k = 0;

             if( j >= (MAXPATTERN - 1) )

             {

                 return FALSE;

             }

             else

             {

                 j++;

             }

          }

      }

      else

      {

          l_Pat[j][k++] = pattern[i];

      }

      i++;

   }

    cout<<"4,";

   i = 0;

   l_Ptr = file;

    //cout<<"pass4"<<endl;

   while(l_Pat[i][0] != '\0')

   {

        if(i == 0){

             cout<<"5,"; 

        }

      j = FindSubString(l_Ptr, l_Pat[i]);

      /*

      cout<<endl;

      cout<<"j="<<j<<endl;

      */

        if((j == -1) || ((i == 0) && (pattern[0] != '*') && (j != 0)))

      {

          break;

      }

      else

      {

          l_Ptr = l_Ptr + j + strlen(l_Pat[i]);

          i++;

           /*

      cout<<endl;

      cout<<"i="<<i<<endl;

      */

      }

   }

      /*

      cout<<endl;

      cout<<"i="<<i<<endl;

      */

   cout<<"6,";

    //cout<<"pass5"<<endl;

   if(l_Pat[i][0] != '\0')

   {

        cout<<"7,E";

      return FALSE;

   }

   else

   {

      if(pattern[strlen(pattern) - 1] != '*')

      {

            cout<<"8,";

          while(strlen(l_Ptr) != 0)

          {

                cout<<"9,";

             j = FindSubString(l_Ptr, l_Pat[i-1]);

             if( j == -1 )

             {

                    cout<<"12,E";

                 return FALSE;

             }

             cout<<"11,";

             l_Ptr = l_Ptr + j + strlen(l_Pat[i-1]);

          }

      }

      cout<<"10,E";

      return TRUE;

   }

}

六、实验数据及处理结果

通过路径覆盖测试,得到结果为覆盖6/17,覆盖率为35.3%,覆盖经过的路径都满足输入输出的需求分析,能够较好的完成函数的功能。没有发现问题。17条路径中有11条是不合逻辑路径,无法通过改变输入变量覆盖路径,从而需要利用语句覆盖测试辅助测试,利用语句覆盖测试,得到结果为205/236,覆盖率为86.86%,基本达到标准,并且与路径覆盖测试结合后,能够检测路径覆盖测试不能达到的路径,使得测试更加完整。

自动化测试生成结果和报告

测试用例1:

测试用例2:

七、思考讨论题或体会或对改进实验的建议

通过本次试验,我了解到了一个软件测试的基本过程,并且将我学习到的知识具体化,用作我编程的工具之中,也通过这样方法论的东西提升了我对软件的认识和对整个软件工程体系的了解。与此同时,也对软件测试这堂课更加萌发了极度的热情。各种不同编程语言对计算机环境的要求以及对软件部署过程的测试必要性方面,通过此次实验的编程和测试,使我更加了解到多语言的掌握对于现今软件工程师的重要性,各个编程语言对计算机的要求不同,有的语言需要特殊的编程工具,有的则需要更好的虚拟平台。而从中我也懂得软件部署过程的测试也是十分必要的。

八、参考资料

1、《软件工程》           钟珞编著             清华大学出版社

2、《软件工程概论》            郑人杰编著             清华大学出版社

3、《实用软件工程》          郑人杰等编著             清华大学出版社

4、《软件测试技术》            李庆义、王爱乐等编著       中国铁道出版社

相关推荐