第17章软件测试本章的学习重点◆软件测试模型、分类和流程◆如何分析被测软件◆设计软件测试环境◆设计测试用例◆设计测试脚本◆函数级测试流程◆模块级测试流程17.1软件测试概述简单地说,软件测试就是为了发现程序的错误并改正。在IEEE提出的软件工程标准术语中,软件测试的定义为:使用人工和自动手段来运行或测试某个系统的过程,其目的在于检验它是否满足规定的需求或弄清楚预期结果与实际结果之间的差别。17.1.2软件测试模型、分类和流程1.软件测试模型最典型的测试模型称为V模型,如图所示。2.软件测试分类根据软件的不同开发阶段,可以将软件测试分为单元测试、集成测试、系统测试和验收测试。按照测试技术分类,可以将软件测试分为黑盒测试和白盒测试。按照不同的测试主体,可以将软件测试分为开发方测试、用户测试和第三方测试。功能验证开始软件运行开始软件测试完成测试软件执行测试执行功能验证17.1.2软件测试模型、分类和流程3.软件测试流程通常,软件测试工作主要通过制定测试计划、设计测试用例、分析测试覆盖率、执行测试、分析测试结果、评估测试性能等几个阶段来完成。如图所示为基本测试流程图。是开始达到要求制定测试计划设计测试用例分析测试覆盖率执行测试分析测试结果评估测试性能结束否17.2搭建软件测试环境对于单元测试,通常使用白盒测试,对于系统测试,通常是用黑盒测试。所谓白盒测试,是指把测试对象看做一个打开的盒子,允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。所谓黑盒测试,也称功能测试或数据驱动测试,前提是已知产品所具有的功能,通过测试来检测每个功能是否都正常使用。17.2.1分析被测软件以实训10.2为例,验证每个函数的代码是否正确。1.voidInputInfo(structTable*InputTable,unsignedintn)函数测试对函数作输入参数检查,分配一定内存,对函数进行功能测试。2.voidOutputInfo(structTable*OutputTable,unsignedintn)函数测试对函数作输入参数检查,分配一定内存,对函数进行功能测试。3.structTable结构体类型验证验证structTable结构体类型是否正确。4.测试顺序对测试用例进行排序17.2.1分析被测软件5.设计测试用例根据前面讨论,设计出测试用例,如下表所示。测试用例名测试目标测试过程测试结果*注明testcase01验证结构体structTable类型定义是否符合软件需求1.定义structTable结构体类型变量TestStruTable;2.为TestStruTable中每个元素赋值;3.查看内存中数据存储是否正确;4.结束正确无testcase02验证函数InputInfo输入参数检查1.调用函数InputInfo();2.函数中参数InputTable实参值设为NULL或0;3.结束打印参数错误信息无testcase03验证函数InputInfo的功能1.定义structTable结构体指针;2.动态分配n个structTable结构体内存块;3.调用函数InputInfo,输入n个structTable类型结构体数据;4.释放分配的内存;5.结束输入人员数据信息动态分配内存之后一定要释放testcase04验证函数OutputInfo输入参数检查1.调用函数OutputInfo();2.函数中参数OutputTable实参值设为NULL或0;3.结束打印参数错误信息无testcase05验证函数OutputInfo功能1.定义structTable结构体指针;2.动态分配n个structTable结构体内存块;3.输入n个structTable类型结构体数据;4.调用函数OutputInfo();4.释放分配的内存;5.结束输出人员数据信息无17.2.2搭建软件测试环境以测试实训10.2为例,搭建测试环境。1.设计测试文件测试环境中应包含如下测试文件,用以测试的执行,如表所示。文件名功能说明test_10_2.c测试控制文件test_case_01.c测试用例testcase01文件test_case_02.c测试用例testcase02文件test_case_03.c测试用例testcase03文件test_case_04.c测试用例testcase04文件test_10_2.h测试环境头文件TeacherStudentInfo.c被测文件(部分代码屏蔽)17.2.2搭建软件测试环境2.搭建测试环境测试环境应在代码编写和调试工程环境下搭建,选择VisualC++6.0工程环境。工程命名为test_10_2。将代码文件test_case_01.c,test_case_02.c,test_case_03.c,test_case_04.c和TeacherStudentInfo.c放于目录SourceFiles文件夹下,test_10_2.h放于HeaderFiles文件夹下。如图所示为测试环境搭建完毕后的工程工作空间。17.3软件测试过程软件测试过程是伴随着软件的开发和测试环境的搭建一起进行的,测试环境要根据代码的开发进程不断改进,测试过程也随着开发的流程而不断变化,同时,软件的测试过程也很大程度上影响着测试环境的调整。软件测试过程中的具体测试方法也根据测试目标的不同而各有差异。17.3.1函数级软件测试1.测试用例testcase01测试用例testcase01主要用于验证开发代码中定义的structTable结构体类型是否可以及是否正确,通过设计合理的测试脚本,实现对结构体structTable定义的测试。范例17.1Test_case_01.c设计测试structTable定义类型的代码,验证所定义的结构体类型能够满足需求,定义一个结构体变量,并对该变量赋初值,查看内存数据结构,并输出各元素的值。2.测试用例testcase01内存检查要查看structTable结构体类型变量TestStruTable在内存中的数据,可以在文件test_case_01.c第6行中设置断点,如图所示。17.3.1函数级软件测试3.测试用例testcase02测试用例testcase02用于检查函数InputInfo()的输入参数,由于要对函数InputInfo()作检查,因此在测试之前,应先将函数InputInfo()所在文件加入测试工程中,并屏蔽结构体类型structTable定义代码和主函数代码,并添加下面代码:#includetest_10_2.hexternstructTable;设计测试脚本,用以测试用例testcase02的测试。范例17.2Test_case_02.c测试用例testcase02脚本,调用函数InputInfo(),并且将实参设置为NULL和1,验证函数InputInfo()是否具有对输入参数的检测功能。17.3.1函数级软件测试4.测试用例testcase03测试用例testcase03用于验证函数InputInfo()的功能。函数InputInfo()的功能是输入数据信息,用于后续设计。范例17.3Test_case_03.c测试用例testcase02脚本,调用函数InputInfo(),首先定义structTable结构体类型指针TestInfoFunc,动态分配两个structTable结构体内存数据区域,以TestInfoFunc和2为实参,调用被测函数InputInfo,验证被测函数是否能够正常工作。5.测试用例testcase04先将函数OutputInfo()所在文件加入测试工程中,屏蔽结构体类型structTable定义代码和主函数代码,并添加下面代码:#includetest_10_2.hexternstructTable;设计测试脚本,用以测试用例testcase04的测试。17.3.1函数级软件测试范例17.4Test_case_04.c测试用例testcase04脚本,调用函数OutputInfo(),并且将实参设置为NULL和1,验证函数OutputInfo()是否具有对输入参数的检测功能。6.测试用例testcase05测试用例testcase05用于验证函数OutputInfo()的功能。函数OutputInfo()的功能是输出数据信息,用于后续设计。范例17.5Test_case_05.c测试用例testcase05脚本,调用函数OutputInfo(),首先定义structTable结构体类型指针TestOutFunc,动态分配两个structTable结构体内存数据区域,并输入以TestOutFunc和2为实参,调用被测函数OutputInfo,验证被测函数是否能够正常工作。17.3.1函数级软件测试7.测试环境头文件测试环境头文件test_10_2.h用于定义结构体类型structTable以及部分子函数的声明。头文件中不应包含除说明代码以外的代码信息。范例17.5Test_10_2.h测试环境头文件代码,包含了标准输入输出头文件和标准库文件。对测试脚本函数的声明以及被测函数声明。此外,还包含了structTable结构体类型定义。17.3.2模块级软件测试模块级软件测试又成为senario测试或者阶段测试,是一种典型的黑盒测试。范例17.5Test_case_senario.c模块级测试脚本,用于测试人员输入与输出的过程是否正确。测试脚本中调用函数InputInfo和函数OutputInfo,验证两个函数在开发代码中联合运行的可行性。