1、2022-7-30白盒测试白盒测试White-box testing任课老师:黄武任课老师:黄武2022-7-30提纲提纲白盒测试概述白盒测试概述静态白盒测试静态白盒测试动态白盒测试动态白盒测试2022-7-301.白盒测试概述白盒测试概述白盒测试概念白盒测试概念白盒测试过程白盒测试过程白盒测试的应用范围白盒测试的应用范围白盒测试的优点白盒测试的优点白盒测试的缺点白盒测试的缺点白盒测试的发展历程白盒测试的发展历程2022-7-301.1 白盒测试概念白盒测试概念白盒测试白盒测试是一种基于软件内部路径,结是一种基于软件内部路径,结构和代码实现基础上的软件测试策略,构和代码实现基础上的软件测试策略
2、,该测试方法通常需要详细的编程技巧该测试方法通常需要详细的编程技巧例:请找出下面代码的错误例:请找出下面代码的错误void main()int x;if(x display buffer start position.iNum-the data number to fill displaying buf.*p-Temporary data buffer pointer.RETURN:None.*/void CTM_WAVEDoc:Fill_Scan_Disp_Data(DWORD dwStart,int iNum,short*p)2022-7-302.4 通用代码审查清单通用代码审查清单数据引
3、用错误数据引用错误数据声明错误数据声明错误计算错误计算错误比较错误比较错误控制流错误控制流错误子程序参数错误子程序参数错误输入输入/输出错误输出错误其他错误其他错误2022-7-302.4.1 数据引用错误数据引用错误数据引用错误数据引用错误是指使用未经正确初始化和引是指使用未经正确初始化和引用方式的变量、常量、数据、字符串等导致用方式的变量、常量、数据、字符串等导致的软件缺陷,包括:的软件缺陷,包括:是否引用了未初始化的变量是否引用了未初始化的变量数组和字符串的下标是否为整数,是否未访数组和字符串的下标是否为整数,是否未访问边界或越界问边界或越界是否在使用常量的地方使用了变量是否在使用常量的
4、地方使用了变量变量是否被赋予不同类型的值变量是否被赋予不同类型的值1.使用了未分配内存指针吗等使用了未分配内存指针吗等2022-7-302.4.1.1 数据引用错误举例数据引用错误举例变量被赋于不同数据类型的值变量被赋于不同数据类型的值2022-7-302.4.2 数据声明错误数据声明错误数据声明错误数据声明错误的原因是不正确地声明或的原因是不正确地声明或使用变量和常量,包括:使用变量和常量,包括:所有变量都赋予了正确的长度、类型吗?所有变量都赋予了正确的长度、类型吗?变量是否在声明的同时进行了初始化变量是否在声明的同时进行了初始化存在声明过但从未引用过的变量吗存在声明过但从未引用过的变量吗在
5、特定模块中所有变量都显示声明了吗?在特定模块中所有变量都显示声明了吗?如果没有,是否可以理解为该变量与更如果没有,是否可以理解为该变量与更高级别的模块共享(全局变量)高级别的模块共享(全局变量)2022-7-302.4.2.1 数据声明错误举例数据声明错误举例int Get_Max_Value(int start,int iNum,short*p)shortmax,min;max=*(p+start);/The first value evaluate to maxfor(int i=start+1;istart+iNum;i+)if(max *(p+i)max=*(p+i);return(m
6、ax);min变量申明后从未使用过变量申明后从未使用过2022-7-302.4.3 计算错误计算错误计算错误计算错误是基本的数据逻辑问题,即不能得是基本的数据逻辑问题,即不能得到正确的计算结果,包括:到正确的计算结果,包括:计算中是否使用了不同数据类型的变量计算中是否使用了不同数据类型的变量赋值的目的变量是否小于赋值的源变量赋值的目的变量是否小于赋值的源变量在数值计算中是否可能出现溢出在数值计算中是否可能出现溢出除数除数/模是否可能为模是否可能为0对于整形运算,是否会丢失精度对于整形运算,是否会丢失精度变量的值是否超过有意义的范围变量的值是否超过有意义的范围1.对于包含多个操作数据求值表达式是
7、否不清对于包含多个操作数据求值表达式是否不清晰晰2022-7-302.4.3.1 计算错误举例计算错误举例int Get_Ave_Value(int start,int iNum,short*p)int ave=0;int sum=*(p+start);for(int i=start+1;i iQueue_Size)bReverse_Flag=false;/2.-Read actual data from queue.-for(int i=0;i和和=混淆引发错误混淆引发错误2022-7-302.4.5 控制流错误控制流错误控制流程错误控制流程错误的原因是编程语言中循环等控的原因是编程语言中循
8、环等控制结构未按预期方式工作,他们通常由计算制结构未按预期方式工作,他们通常由计算或比较错误直接或间接引起,包括:或比较错误直接或间接引起,包括:复合语句是否配对复合语句是否配对程序、模块、子程序和循环能否终止程序、模块、子程序和循环能否终止可能存在死循环吗可能存在死循环吗循环可能从不执行吗循环可能从不执行吗1.在在switchcase语句中超出分支范围是否处理语句中超出分支范围是否处理2022-7-302.4.5.1 控制流错误举例控制流错误举例switch(iType)caseLABEL_TYPE_GENERAL:Draw_A_Label(i,pDC,label,rect);break;c
9、aseLABEL_TYPE_STIMULATE:Draw_A_Sti_Label(i,pDC,label,rect);break;caseLABEL_TYPE_DROP:Draw_A_Drop_Label(i,pDC,label,rect);break;如果不出现上面三种情况,程序如何处理?如果不出现上面三种情况,程序如何处理?2022-7-302.4.6 子程序参数错误子程序参数错误子程序参数错误子程序参数错误的来源是软件子程序不正确的来源是软件子程序不正确地传递参数,包括:地传递参数,包括:子程序接收的参数类型和大小与调用代码发子程序接收的参数类型和大小与调用代码发送的实参匹配吗送的实参匹
10、配吗如果子程序有多个入口点,引用的参数是否如果子程序有多个入口点,引用的参数是否与当前入口点没有关联与当前入口点没有关联常量是否当作形参传递,意外在子程序中改常量是否当作形参传递,意外在子程序中改动动子程序是否更改了仅作为输入值的参数子程序是否更改了仅作为输入值的参数1.每一个参数的单位与相应的形参匹配吗每一个参数的单位与相应的形参匹配吗比如比如ms和和s,ml和和l等等2022-7-302.4.7 输入输入/输出错误输出错误输入输入/输出错误包括文件读取、键盘或鼠标输输出错误包括文件读取、键盘或鼠标输入以及打印机输出等设备写入错误,包括:入以及打印机输出等设备写入错误,包括:软件是否遵守外部
11、设备读写数据的专用格式软件是否遵守外部设备读写数据的专用格式文件或者外设不存在或未准备好如何处理文件或者外设不存在或未准备好如何处理外设未连接、不可用或者读写过程中存贮器外设未连接、不可用或者读写过程中存贮器满如何处理满如何处理1.检查错误提示信息的准确性,正确性以及语检查错误提示信息的准确性,正确性以及语法和拼写等法和拼写等2022-7-302.4.8 其他错误其他错误其他错误包括:其他错误包括:软件是否存在国际化问题软件是否存在国际化问题软件是否要运行在不同的操作系统下软件是否要运行在不同的操作系统下是否考虑了软件的硬件兼容性,比如内是否考虑了软件的硬件兼容性,比如内存、图形捕获卡等存、图
12、形捕获卡等1.程序编译是否产生了警告或提示信息,程序编译是否产生了警告或提示信息,这些信息通常指示进行了有疑问的处理这些信息通常指示进行了有疑问的处理2022-7-302.4.9 通用代码审查清单总结通用代码审查清单总结上面的通用代码审查清单在我们进行静上面的通用代码审查清单在我们进行静态白盒测试时起到指南的作用态白盒测试时起到指南的作用由于上面的错误具有通用性,目前很多由于上面的错误具有通用性,目前很多系统的编译器都能够对这些错误进行检系统的编译器都能够对这些错误进行检查,如果我们提高编译器检查错误的等查,如果我们提高编译器检查错误的等级,那么它会列举出很多这样的错误供级,那么它会列举出很多
13、这样的错误供我们参考我们参考2022-7-30在在V C 6.0中设置编译警告级别中设置编译警告级别选择选择“Project”菜单下的菜单下的“Settings”命令进入命令进入2022-7-303 动态白盒测试动态白盒测试动态白盒测试概述动态白盒测试概述动态白盒测试和调试动态白盒测试和调试分段测试分段测试数据范围数据范围控制流测试控制流测试2022-7-303.1 动态白盒测试概述动态白盒测试概述动态白盒测试动态白盒测试是指利用查看代码功能和是指利用查看代码功能和实现方式得到的信息来确定哪些要测试,实现方式得到的信息来确定哪些要测试,哪些不测试,如何开展测试,又称为哪些不测试,如何开展测试,
14、又称为结结构测试构测试2022-7-303.1.1 动态白盒测试的内容动态白盒测试的内容直接测试底层功能、过程、子程序和库直接测试底层功能、过程、子程序和库以完整程序的方式从顶层测试软件,但以完整程序的方式从顶层测试软件,但是根据对软件运行的了解调整测试案例是根据对软件运行的了解调整测试案例从软件获得读取变量和状态信息的访问从软件获得读取变量和状态信息的访问权,以便确定测试与预期结果是否相符,权,以便确定测试与预期结果是否相符,同时,强制软件以正常测试难以实现的同时,强制软件以正常测试难以实现的方式运行方式运行估算执行测试时覆盖的代码量,然后调估算执行测试时覆盖的代码量,然后调整测试,去掉多余
15、的,补充遗漏的整测试,去掉多余的,补充遗漏的2022-7-303.2 动态白盒测试和调试动态白盒测试和调试动态白盒测试的目标是寻找软件缺陷,动态白盒测试的目标是寻找软件缺陷,调试的目标是修复软件缺陷调试的目标是修复软件缺陷进行动态白盒测试,需要使用与程序员进行动态白盒测试,需要使用与程序员相同的工具,了解程序的运行状态相同的工具,了解程序的运行状态动态白盒子动态白盒子分离软件缺陷分离软件缺陷调试调试调试调试编程编程测试测试动态白盒测试和调试的关系动态白盒测试和调试的关系2022-7-303.3 分段测试分段测试一开始就对程序进行整体测试,可能会一开始就对程序进行整体测试,可能会造成两个缺陷:造
16、成两个缺陷:难以找到导致问题的原因,因为受到众难以找到导致问题的原因,因为受到众多因素的影响多因素的影响1.某些缺陷掩盖了其他缺陷,导致一个缺某些缺陷掩盖了其他缺陷,导致一个缺陷解决马上又引起新的缺陷陷解决马上又引起新的缺陷2022-7-303.3.1 单元和集成测试单元和集成测试我们应该采取代码分段建立和测试的策我们应该采取代码分段建立和测试的策略,这样容易形成稳定的代码略,这样容易形成稳定的代码主程序主程序模块模块1模块模块2模块模块11模块模块111模块模块112模块模块113模块模块21模块模块22模块模块12 独立建立代码模块并分独立建立代码模块并分别测试,然后再集成测试别测试,然后
17、再集成测试2022-7-303.3.2 单元测试单元测试在底层进行的测试被称为在底层进行的测试被称为单元测试单元测试或或模模块测试块测试采取这种测试策略很容易隔离软件缺陷采取这种测试策略很容易隔离软件缺陷在单元级发现问题时,问题肯定在单元在单元级发现问题时,问题肯定在单元中中1.在多个单元集成时发现软件缺陷,那么在多个单元集成时发现软件缺陷,那么它通常与模块之间的交互相关它通常与模块之间的交互相关2022-7-303.3.2.1 自底向上的单元测试自底向上的单元测试自底向上的测试中,需要编写称为测试自底向上的测试中,需要编写称为测试驱动的模块以进行单元测试驱动的模块以进行单元测试测试驱动模块测
18、试驱动模块以将来真正模块同样的方以将来真正模块同样的方式挂接,向处于测试的模块发送测试案式挂接,向处于测试的模块发送测试案例数据,接受返回结果,并验证正确性例数据,接受返回结果,并验证正确性实际软件实际软件华式到摄氏华式到摄氏度转换模块度转换模块温度温度数据数据结果结果测试驱动模块测试驱动模块华式到摄氏华式到摄氏度转换模块度转换模块测试案测试案例数据例数据结果结果模拟模拟2022-7-303.3.2.2 自顶向下的单元测试自顶向下的单元测试自顶向下的测试中,是对完成的高层软件进行自顶向下的测试中,是对完成的高层软件进行测试,而下层软件则使用存根代码来模拟测试,而下层软件则使用存根代码来模拟这样
19、做的目的是测试在实际中不宜出现的数据,这样做的目的是测试在实际中不宜出现的数据,因为存根软件可以按要求产生各种数据因为存根软件可以按要求产生各种数据温度显示模块温度显示模块温度计接口温度计接口模块模块测试过的温度测试过的温度显示模块显示模块测试员书写测试员书写的存根模块的存根模块模拟模拟测试文件测试文件实际配置实际配置测试配置测试配置2022-7-303.4 数据范围数据范围由于软件可以分为数据和状态,白盒测由于软件可以分为数据和状态,白盒测试也包含数据测试和状态测试试也包含数据测试和状态测试数据包括常量、变量、数组、结构,键数据包括常量、变量、数组、结构,键盘和鼠标输入、文件、屏幕输出,网络
20、盘和鼠标输入、文件、屏幕输出,网络输入输入输出等输出等数据流范围数据流范围主要是指在整个软件中跟踪主要是指在整个软件中跟踪一批数据一批数据如果在底层测试函数,就会使用调试器如果在底层测试函数,就会使用调试器观察变量在运行期间值的变化观察变量在运行期间值的变化2022-7-303.4.1 次边界次边界在白盒测试中,我们通过查看代码,在白盒测试中,我们通过查看代码,找到程序内部的次边界,然后建立他找到程序内部的次边界,然后建立他们的测试案例们的测试案例下面是程序内部的一些次边界的例子:下面是程序内部的一些次边界的例子:计算时从采用数据表转换为使用公式计算时从采用数据表转换为使用公式1.为了获得更高
21、的精度,复杂的数值分为了获得更高的精度,复杂的数值分析程序根据数字大小切换不同的处理析程序根据数字大小切换不同的处理方式方式2022-7-303.4.2 公式和等式公式和等式查看公式中存在的数据隐患,例如计查看公式中存在的数据隐患,例如计算银行复利的公式如下:算银行复利的公式如下:A=P(1+r/n)nt其中:其中:P =本金本金r=年利率年利率 t=年数年数 n =每年复加的利率次数每年复加的利率次数 A=若干年的本息总和若干年的本息总和在上面的代码中,如果设定在上面的代码中,如果设定n=0,就会,就会造成代码崩溃造成代码崩溃2022-7-303.4.4 错误强制错误强制有些数据在实际系统中
22、很难出现,我们有些数据在实际系统中很难出现,我们难于测试,比如连接超过难于测试,比如连接超过10个的个的USB设设备,屏幕的分辨率为备,屏幕的分辨率为3000像素,为了对像素,为了对这些情况进行测试,我们需要在调试器这些情况进行测试,我们需要在调试器中强制设定相关变量的值,以便调试在中强制设定相关变量的值,以便调试在这些情况下的程序运行这些情况下的程序运行2022-7-303.4.4.1 错误强制举例错误强制举例在在VC6中强制修改变量的值中强制修改变量的值2022-7-303.5 控制流测试控制流测试我们除了测试数据之外,还需要对程我们除了测试数据之外,还需要对程序的控制流进行测试序的控制流
23、进行测试我们需要测试程序的状态以及其中的我们需要测试程序的状态以及其中的程序流程,必须设法进入和退出每一程序流程,必须设法进入和退出每一个模块,执行每一行代码,追踪每一个模块,执行每一行代码,追踪每一条逻辑和决策分支,这些测试称为条逻辑和决策分支,这些测试称为控控制流测试制流测试,即,即代码范围分析代码范围分析我们通常会使用代码范围分析工具作我们通常会使用代码范围分析工具作这样的工作这样的工作2022-7-303.5.1 控制流测试概述控制流测试概述控制流测试控制流测试通过识别程序代码中的执行通过识别程序代码中的执行路径建立覆盖那些路径的测试案例路径建立覆盖那些路径的测试案例不幸的是,试图对任
24、何适当的模块进行不幸的是,试图对任何适当的模块进行彻底地控制流路径测试都是不现实的。彻底地控制流路径测试都是不现实的。测试路径的数量太多造成无法在合理的测试路径的数量太多造成无法在合理的时间内测试完成时间内测试完成测试中每增加一个判定条件就会加倍测测试中每增加一个判定条件就会加倍测试路径并且任何一个循环将被乘增量测试路径并且任何一个循环将被乘增量测试路径(试路径(2n)2022-7-303.5.1.1 控制流测试的缺陷控制流测试的缺陷路径太多使控制流无法完全测试路径太多使控制流无法完全测试for(i=0;i1000;i+)for(j=0;j1000;j+)for(k=0;k0)doIsGrea
25、ter();if(a=0)doIsEqual();/遗失语句:遗失语句:if(a3)z=x+y;q=1b=2if(a=2)x=x+2x=x/2p=q/rif(b/c3)z=x+y2022-7-303.5.3 代码测试的覆盖范围代码测试的覆盖范围在控制流测试中,定义了在控制流测试中,定义了8种级别种级别测试覆盖范围(测试覆盖范围(coverage)覆盖范围(覆盖范围(coverage)的意思是已的意思是已经被测试的代码百分比经被测试的代码百分比2022-7-303.5.3.1 小于小于100%语句覆盖范围语句覆盖范围0级:级:测试与调试之间没有区别,除了支持调测试与调试之间没有区别,除了支持调试
26、,测试本身没有目的试,测试本身没有目的缺陷可能会偶尔被发现,但是没有正式缺陷可能会偶尔被发现,但是没有正式的努力去找到它们的努力去找到它们2022-7-303.5.3.2 100%语句覆盖范围语句覆盖范围1级:级:最低覆盖范围是指最低覆盖范围是指100%语句语句覆盖覆盖,可以简称为,可以简称为语句覆盖语句覆盖语句覆盖意味着测试模块中语句覆盖意味着测试模块中的每一条语句都至少被执行的每一条语句都至少被执行一次。这好像是合理的目标,一次。这好像是合理的目标,但这种测试会导致很多缺陷但这种测试会导致很多缺陷遗失,例如:遗失,例如:1.if(a0)2.x=x+1;3.if(b=3)4.y=0;if(b
27、=3)y=0if(a0)x=x+1左边程序段的状态图左边程序段的状态图用例用例a=6,b=3就可以就可以完成完成100%语句覆盖语句覆盖2022-7-303.5.3.2 语句语句(statement)覆盖范围覆盖范围上例中有上例中有4条独立的路径,但却只执行了条独立的路径,但却只执行了一条,由于测试路径的遗漏,可能会导一条,由于测试路径的遗漏,可能会导致缺陷的发生。语句测试只是入门测试致缺陷的发生。语句测试只是入门测试if(b=3)y=0if(a0)x=x+1if(b=3)y=0if(a0)x=x+11234falsefalsetrue falsefalse truetrue true2022
28、-7-303.5.3.3 判定判定(decision)覆盖范围覆盖范围2级:级:下一级的控制流测试是下一级的控制流测试是100%判定测试判定测试,这又被称为这又被称为分支测试分支测试在分支测试下,要求测试用例至少保证在分支测试下,要求测试用例至少保证每个判定条件为真、假的情况至少出现每个判定条件为真、假的情况至少出现一次一次分支测试不能保证分支测试不能保证路径覆盖路径覆盖,但是可以,但是可以保证保证语句覆盖语句覆盖2022-7-303.5.3.3 判定判定(decision)覆盖范围覆盖范围比如针对上一个案例,我们需要使用两个案例:比如针对上一个案例,我们需要使用两个案例:a=-2,b=2和和
29、a=4,b=3进行判定覆盖进行判定覆盖if(b=3)y=0if(a0)x=x+1if(b=3)y=0if(a0)x=x+1test1test2falsefalsetrue true2022-7-303.5.3.4 条件(条件(condition)覆盖范围覆盖范围并不是所有的条件语句都是简单的判定,并不是所有的条件语句都是简单的判定,有些条件包含多个逻辑或表达式的组合,有些条件包含多个逻辑或表达式的组合,例如:例如:1.if(a0&c=1)2.x=x+1;3.if(b=3|d0,c=1,第二个条件为,第二个条件为b=3,d0,c=1,b=3,d0 和和 a=0就可以就进行条就可以就进行条件测试件
30、测试 条件测试通常优于判定测试,因为条件测试对条件测试通常优于判定测试,因为条件测试对每个条件进行了测试,而判定测试并不需要测每个条件进行了测试,而判定测试并不需要测试每个条件试每个条件这两种测试并不互相包含,这两种测试并不互相包含,有什么区别?有什么区别?2022-7-303.5.3.5 判定判定/条件覆盖范围条件覆盖范围4级:级:思考下面的例子思考下面的例子:if(x&y)conditionedStatement;我们可以使用案例我们可以使用案例:x=true,y=false 和和 x=false,y=true进行条件覆盖测试,但是这两个条件都进行条件覆盖测试,但是这两个条件都不能使判定点
31、为真,也不能使语句执行不能使判定点为真,也不能使语句执行我们需要选择我们需要选择100%的判定和条件都覆盖的案的判定和条件都覆盖的案例,例如:例,例如:x=true,y=true 和和 x=false,y=false2022-7-303.5.3.6 多条件覆盖范围多条件覆盖范围5级:级:我们考虑编程语言编译器如何计算多条件判我们考虑编程语言编译器如何计算多条件判定点的值,我们通过这些知识建立测试产生定点的值,我们通过这些知识建立测试产生100%多条件的覆盖案例多条件的覆盖案例多条件测试可以覆盖判定测试、条件测试、多条件测试可以覆盖判定测试、条件测试、判定判定/条件测试,但是不能覆盖路径测试条件
32、测试,但是不能覆盖路径测试if(a0&c=1)x=x+1;if(b=30|d0,c=1,b=3,d0a=0a0,c!=1,b!=3,d0a=0if(b=3)y=0if(a0)if(c=1)x=x+1truetruefalseif(d0)truefalsefalse2022-7-303.5.3.7 循环覆盖范围循环覆盖范围6级:级:当模块中包含循环时,路径将变得无限,当模块中包含循环时,路径将变得无限,将循环数量降低到较小的程度是有意义将循环数量降低到较小的程度是有意义的的第一个案例是执行第一个案例是执行0次循环,第二个案例次循环,第二个案例是执行是执行1次循环,第三个案例是执行典型次循环,第三
33、个案例是执行典型的的n次循环,第四次执行最大数量次循环,第四次执行最大数量m次循次循环,你还可以测试环,你还可以测试m-1和和m+1(循环边界(循环边界测试)测试)2022-7-303.5.3.8 100%路径覆盖范围路径覆盖范围7级:级:100%路径覆盖是最高层次的测试路径覆盖是最高层次的测试在这种测试下,无论是程序中有没有出在这种测试下,无论是程序中有没有出现的分支路径均要做测试,并且需要考现的分支路径均要做测试,并且需要考虑多点分支和循环的情况虑多点分支和循环的情况在存在循环的情况下由于路径太多造成在存在循环的情况下由于路径太多造成测试几乎不可完成测试几乎不可完成思考题:思考题:是否进行了是否进行了100%路径测试的程路径测试的程序就没有问题?序就没有问题?2022-7-30作业作业名词解释名词解释静态白盒测试静态白盒测试正式审查正式审查检验检验动态白盒测试动态白盒测试 测试驱动模块测试驱动模块 路径路径语句覆盖语句覆盖 分支测试分支测试 简答题简答题简述白盒测试的优缺点简述白盒测试的优缺点?为什么要进行静态白盒测试为什么要进行静态白盒测试?简述正式审查的要素简述正式审查的要素?数据引用错误包含哪些方面的内容数据引用错误包含哪些方面的内容 1.为什么应该坚持符合标准和规范的形式进行为什么应该坚持符合标准和规范的形式进行编码编码
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。