1、三、三、MFC: MFC,即即Microsoft基本类,该类库封装了基本类,该类库封装了SDK(软件开发工具包)结构、功能及应用程序软件开发工具包)结构、功能及应用程序框架内部技术。框架内部技术。 它提供了许多可以重用的类,使得它提供了许多可以重用的类,使得Windows程序员避免了许多重复性工作。程序员避免了许多重复性工作。 四、四、Visual C集成开发工具环境集成开发工具环境 1)开发工具的使用;)开发工具的使用; 2)掌握)掌握Win32程序开发流程程序开发流程 ; 一个一个win32程序由两大块组成:程序由两大块组成: 程序代码程序代码; 用户接口资源用户接口资源。 用户接口资源用
2、户接口资源:菜单,对话框,图标,光标等;:菜单,对话框,图标,光标等; 这些资源的实际内容(二进制代码)由各种工这些资源的实际内容(二进制代码)由各种工具产生,并以各种扩展名的文件存在;具产生,并以各种扩展名的文件存在; 资源描述文件(资源描述文件(*.rc)中对用户接口资源进中对用户接口资源进行描述;行描述; RC编辑器(编辑器(RC.exe)根据该资源描述文件根据该资源描述文件(*.rc)将所有用户接口资源集中构造一个将所有用户接口资源集中构造一个*.RES文件;文件; *.RES文件与程序代码结合起来,构成一个文件与程序代码结合起来,构成一个Win32程序。程序。 关于函数库和头文件关于
3、函数库和头文件:动态链接库动态链接库:应用程序调用的:应用程序调用的API函数在函数在“执行执行期间期间”才链接上的函数库才链接上的函数库,扩展名可以是扩展名可以是.dll,也可以是也可以是.exe、 .fon、 .mod、.drv、 .ocx等。等。 静态连接库静态连接库:.lib头文件头文件:如:如windows.h,它包含操作系统本身的它包含操作系统本身的三大模块三大模块gdi32.dll、user32.dll和和kernel32.dll中的所有中的所有API函数。函数。 有关测试的一些规则:有关测试的一些规则:(1)测试是为了发现程序中的错误而执行程)测试是为了发现程序中的错误而执行程
4、序的过程;序的过程;(2)好的测试方案是极可能发现迄今为止尚)好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案;未发现的错误的测试方案;(3)成功的测试是发现了至今为止尚未发现)成功的测试是发现了至今为止尚未发现的错误的测试。的错误的测试。 7.2.1 软件测试的目标软件测试的目标7.2 软件测试基础软件测试基础 7.2.2 软件测试准则软件测试准则1)所有测试都应该能追溯到用户需求;)所有测试都应该能追溯到用户需求;2)应该远在测试前就制定出测试计划;)应该远在测试前就制定出测试计划;3)把)把Pareto原理应用到软件测试中;原理应用到软件测试中;4)应该从)应该从“小规模小规模”
5、测试开始,并逐步进行测试开始,并逐步进行“大大规模规模”测试;测试;5)穷举测试是不可能的;)穷举测试是不可能的;:包含所有可能情况的测试称为穷尽测试。:包含所有可能情况的测试称为穷尽测试。程序程序main()()a2a1a3b输入输入输出输出a1、a2、a3 :Integer 16bits输入数据的穷尽测输入数据的穷尽测试组合:试组合:216216 216 248 3 10146)为了达到最佳测试效果,应该由独立的第三)为了达到最佳测试效果,应该由独立的第三方从事测试工作。方从事测试工作。黑盒测试黑盒测试: 如果已经知道软件应该具有的功能,可以通如果已经知道软件应该具有的功能,可以通过测试来
6、检验是否每个功能都能正常使用,这过测试来检验是否每个功能都能正常使用,这种测试称黑盒测试。也称功能测试。种测试称黑盒测试。也称功能测试。 7.2.3 测试方法测试方法白盒测试白盒测试: 也称结构测试。也称结构测试。 如果知道软件内部工作过程,可以通过测如果知道软件内部工作过程,可以通过测试来检验软件内部动作是否按照规格说明书试来检验软件内部动作是否按照规格说明书的规定正常进行,这种测试称为白盒测试。的规定正常进行,这种测试称为白盒测试。1.模块测试模块测试 模块测试又称单元测试,它把每个模块作为模块测试又称单元测试,它把每个模块作为单独的实体来测试。单独的实体来测试。2.子系统测试子系统测试
7、子系统测试是把经过单元测试的模块放在一子系统测试是把经过单元测试的模块放在一起形成一个子系统来测试。起形成一个子系统来测试。7.2.4 软件测试的步骤软件测试的步骤3.系统测试系统测试 系统测试是把经过测试的子系统装配成一个完系统测试是把经过测试的子系统装配成一个完整的系统来测试。整的系统来测试。4.验收测试验收测试 验收测试把软件系统作为单一的实体进行测试验收测试把软件系统作为单一的实体进行测试(利用用户的实际数据测试)。(利用用户的实际数据测试)。5.平行运行平行运行 平行运行是同时运行新开发出来的系统和将被平行运行是同时运行新开发出来的系统和将被它取代的旧系统,以便比较新旧两个系统的处理
8、它取代的旧系统,以便比较新旧两个系统的处理结果。结果。 7.2.5 测试阶段的信息流测试阶段的信息流测试测试评价评价调试调试可靠性可靠性模型模型软件配置软件配置测试配置测试配置测试测试结果结果预期结果预期结果错误错误错误率数据错误率数据正确正确可靠性预测可靠性预测图图7.1 测试阶段的信息流测试阶段的信息流7.3 单元测试单元测试 单元测试的一般方法是:单元测试的一般方法是: 首先通过编译系统检查并改正程序中所有的语首先通过编译系统检查并改正程序中所有的语法错误;法错误; 然后用详细设计模块说明为指南,对重要的控然后用详细设计模块说明为指南,对重要的控制路径进行测试,以便发现模块内部的错误。制
9、路径进行测试,以便发现模块内部的错误。 通常,单元测试使用白盒测试方法。通常,单元测试使用白盒测试方法。 1)模块接口模块接口 应该对穿过模块接口的数据流进行检测,应该对穿过模块接口的数据流进行检测,以保证正确的输入和输出。以保证正确的输入和输出。2)局部数据结构局部数据结构 这是错误的主要来源,应该设计相应的测这是错误的主要来源,应该设计相应的测试用例,以便发现数据结构方面的错误。试用例,以便发现数据结构方面的错误。7.3.1 测试重点测试重点3)重要的执行路径重要的执行路径 由于不可能进行穷尽测试,因此选择测试由于不可能进行穷尽测试,因此选择测试路径是非常关键的。路径是非常关键的。4)出错
10、处理通路出错处理通路5)边界条件边界条件审查小组:审查小组: 1)组长;)组长; 2)程序的设计者;)程序的设计者; 3)程序的编写者;)程序的编写者; 4)程序的测试者。)程序的测试者。 7.3.2 代码审查代码审查 7.3.3 计算机测试计算机测试 由于软件模块不是一个独立的系统,不能独由于软件模块不是一个独立的系统,不能独立运行,要依靠其他模块调用,或需要调用其立运行,要依靠其他模块调用,或需要调用其他模块。他模块。 因此,必须要为测试的单元开发因此,必须要为测试的单元开发驱动程序驱动程序或或存根程序存根程序。1)驱动程序驱动程序 相当于一个相当于一个“主程序主程序”,用来把测试数据传,
11、用来把测试数据传送给被测试的模块,并打印有关结果。送给被测试的模块,并打印有关结果。2)存根程序存根程序 用来代替被测试模块所调用的模块,相当于用来代替被测试模块所调用的模块,相当于“虚拟子程序虚拟子程序”。 如,测试如,测试B模块,设计了模块,设计了A模块和模块和C模块。模块。 由由A负责传送测试数据,由负责传送测试数据,由C负责模拟被负责模拟被B调用的调用的模块。模块。C模块可能没有,这取决于模块可能没有,这取决于B有没有调用其有没有调用其他程序。他程序。 A、C都是一次性程序,只在测试时临时使用,都是一次性程序,只在测试时临时使用,应尽量设计得简单一些,以节省费用和时间。应尽量设计得简单
12、一些,以节省费用和时间。 BAC被测试模块被测试模块驱动模块驱动模块存根模块存根模块例:例:正文加工正文加工系统系统输入输入1.0输出输出2.0编辑编辑3.0加标题加标题4.0存储存储5.0检索检索6.0编目录编目录7.0格式化格式化8.0添加添加3.1删除删除3.2插入插入3.3修改修改3.4合并合并3.5列表列表3.6图图7.2 正文加工系统(正文加工系统(H图)图)TEST DRIVER编辑编辑3.0TEST STUB对对“编辑编辑”功能的测试:功能的测试:7.4 集成测试集成测试 集成测试是组装软件的系统化技术,它将集成测试是组装软件的系统化技术,它将经过单元测试的模块联系在一起进行测
13、试。经过单元测试的模块联系在一起进行测试。 由模块组装成程序时有两种方法:由模块组装成程序时有两种方法: 1)非渐增式测试方法非渐增式测试方法 先分别测试每个模块,再把所有模块按设先分别测试每个模块,再把所有模块按设计要求放在一起结合成所要的程序。计要求放在一起结合成所要的程序。2)渐增式测试方法渐增式测试方法 每次增加一个待测试模块,把它同已经测每次增加一个待测试模块,把它同已经测试好的那些模块结合起来进行测试,反复进试好的那些模块结合起来进行测试,反复进行直到完成所有模块测试的方法。行直到完成所有模块测试的方法。 使用渐增式测试方法把模块结合到软件系统中使用渐增式测试方法把模块结合到软件系
14、统中去时,有去时,有自顶向下自顶向下和和自底向上自底向上两种集成方法。两种集成方法。 自顶向下自顶向下集成是一种递增的装配软件结构的集成是一种递增的装配软件结构的方法,这种方法应用非常广泛。它需要存根程序,方法,这种方法应用非常广泛。它需要存根程序,但是不需要驱动程序。但是不需要驱动程序。7.4.1 自顶向下集成自顶向下集成 这种方法的思想是:从主控模块(主程这种方法的思想是:从主控模块(主程序)开始,沿软件的控制层次向下移动,序)开始,沿软件的控制层次向下移动,逐渐把各个模块结合起来。逐渐把各个模块结合起来。 在自顶向下结合方法中,如何将所有模在自顶向下结合方法中,如何将所有模块组装到软件结
15、构中,又有两种方法:块组装到软件结构中,又有两种方法:1)深度优先策略深度优先策略 先组装软件结构的一条先组装软件结构的一条主主控制通路控制通路上的所有模块,选上的所有模块,选择哪条主控制通路,具有较择哪条主控制通路,具有较大的任意性。大的任意性。 如图,如果选取左通路,如图,如果选取左通路,就先把模块就先把模块M1、M2、M5结合起来测试,然后结合模结合起来测试,然后结合模块块M8、M6,再构造中央和再构造中央和右侧的控制通路。右侧的控制通路。 M1M2M3M4M6M5M7M8图图7.3 自顶向下结合实例自顶向下结合实例2)宽度优先策略宽度优先策略 沿着软件结构水平地移沿着软件结构水平地移动
16、,把处于同一个层次的动,把处于同一个层次的所有模块组装起来。所有模块组装起来。 如图,首先结合如图,首先结合M2、M3、M4和主控模块和主控模块M1,然后结合下一个控制层次然后结合下一个控制层次中的模块中的模块M5、M6和和M7,最后结合模块最后结合模块M8。 M1M2M3M4M6M5M7M8图图7.3 自顶向下结合实例自顶向下结合实例 自顶向下集成方法自顶向下集成方法的基本过程如下:的基本过程如下: 1)对主控模块进)对主控模块进行测试,测试时用存行测试,测试时用存根程序代替所有直接根程序代替所有直接被主控模块调用的模被主控模块调用的模块;块;M1M2M3M4M6M5M7M8图图7.3 自顶
17、向下结合实例自顶向下结合实例M1M2M3M4M6M5M7M8图图7.3 自顶向下结合实例自顶向下结合实例 2)根据选定的)根据选定的结合策略(深度优结合策略(深度优先或宽度优先),先或宽度优先),每次用一个实际模每次用一个实际模块代替一个存根程块代替一个存根程序(新结合的模块序(新结合的模块往往又需要新的存往往又需要新的存根程序);根程序);3)每结合一个模块,)每结合一个模块,就测试一个;就测试一个;4)为保证不引入新)为保证不引入新的错误,需要进行的错误,需要进行回归测试,即重复回归测试,即重复以前进行过的部分以前进行过的部分或全部测试;或全部测试;5)重复回到第二步,)重复回到第二步,直
18、到构成整个软件直到构成整个软件结构。结构。M1M2M3M4M6M5M7M8图图7.3 自顶向下结合实例自顶向下结合实例 自底向上集成方法是从软件结构最底自底向上集成方法是从软件结构最底层模块开始进行组装和测试,它与自顶层模块开始进行组装和测试,它与自顶向下结合方法相反,需要驱动程序,不向下结合方法相反,需要驱动程序,不需要存根程序。需要存根程序。 7.4.2 自底向上集成自底向上集成 自底向上集成方法自底向上集成方法的基本过程如下:的基本过程如下:1)把底层模块组合)把底层模块组合成实现一个特定软件成实现一个特定软件子功能的族,如图族子功能的族,如图族1、2、3。McMaMbD2D1D3族族1
19、族族2族族3图图7.4 自底向上实例自底向上实例2)为每个模块设计)为每个模块设计一个驱动程序,作一个驱动程序,作为测试的控制程序,为测试的控制程序,以协调测试用例的以协调测试用例的输入和输出。图中输入和输出。图中D1、D2、D3分别分别是族是族1、2、3的驱动的驱动程序;程序;McMaMbD2D1D3族族1族族2族族3图图7.4 自底向上实例自底向上实例3)对模块进行测试;)对模块进行测试;4)用实际模块代替驱)用实际模块代替驱动程序组装成新的模动程序组装成新的模块族,在新加入的实块族,在新加入的实际模块上面加上新的际模块上面加上新的驱动程序进行测试;驱动程序进行测试;McMaMbD2D1D
20、3族族1族族2族族3图图7.4 自底向上实例自底向上实例5)重复第二到第)重复第二到第四步,逐渐向上加四步,逐渐向上加入实际模块,直至入实际模块,直至构造出整个软件结构造出整个软件结构。构。McMaMbD2D1D3族族1族族2族族3图图7.4 自底向上实例自底向上实例7.4.3 不同集成测试策略的比较不同集成测试策略的比较1. 改进的自顶向下测试方法;改进的自顶向下测试方法;2. 混合法。混合法。 M1M2M3M4M5M67.4.4 回归测试回归测试 指重新执行已经做过的部分测试。指重新执行已经做过的部分测试。 回归测试用于保证由于调试或其他原因引起回归测试用于保证由于调试或其他原因引起的程序
21、变化,不会导致额外错误的测试活动。的程序变化,不会导致额外错误的测试活动。7.5 确认测试(验收测试)确认测试(验收测试) 也称为验收测试,目标是验证软件的有效性。也称为验收测试,目标是验证软件的有效性。 如果软件的功能和性能符合用户的期待,软件如果软件的功能和性能符合用户的期待,软件就是有效的。就是有效的。 软件规格说明书是进行确认测试的基础。软件规格说明书是进行确认测试的基础。 7.5.1 确认测试的范围确认测试的范围确认测试的主要特点及内容有:确认测试的主要特点及内容有:1)某些已经测试过的纯粹技术性的测试项可能)某些已经测试过的纯粹技术性的测试项可能不需要再次测试,而对用户特别感兴趣的
22、功不需要再次测试,而对用户特别感兴趣的功能或性能,可能需要增加一些测试;能或性能,可能需要增加一些测试;2)通常确认测试主要使用实际生产中的数据来)通常确认测试主要使用实际生产中的数据来进行测试;进行测试;3)确认测试必须有用户的积极参与,甚至以用)确认测试必须有用户的积极参与,甚至以用户为主,可能需要进行一些与用户使用步骤户为主,可能需要进行一些与用户使用步骤有关的测试。有关的测试。 确认测试一般使用黑盒测试法。确认测试一般使用黑盒测试法。7.5.2 软件配置复查软件配置复查 目的:保证软件配置的所有成分都齐全,目的:保证软件配置的所有成分都齐全,质量符合要求,文档与程序完全一致,而且已质量
23、符合要求,文档与程序完全一致,而且已经编好目录。经编好目录。7.5.3 Alpha和和Beta测试测试:用户在开发者的场所进行测试,并:用户在开发者的场所进行测试,并且在开发者的指导下进行,测试在受控环境且在开发者的指导下进行,测试在受控环境中进行,开发者记录发现的错误和问题;中进行,开发者记录发现的错误和问题;:用户在一个或多个客户场所进行测:用户在一个或多个客户场所进行测试,不受开发者控制,测试者记录发现的问试,不受开发者控制,测试者记录发现的问题和错误,定期将问题报告发送给开发者。题和错误,定期将问题报告发送给开发者。7.6 白盒测试技术白盒测试技术 1. 语句覆盖是指:设计的测试用例能
24、使程序中语句覆盖是指:设计的测试用例能使程序中每条语句至少执行一次。每条语句至少执行一次。 7.6.1 逻辑覆盖逻辑覆盖例:一个被测试模块的源程序为例:一个被测试模块的源程序为(PASCAL语言)语言): PROCEDURE EXAMPLE (A , B : REAL ; VAR X : REAL) ; BEGIN IF (A1) AND (B=0) THEN X : = X / A; IF (A=2) OR (X1) THEN X : = X + 1 END入口入口返回返回A1 and B=0A=2 or X1X=X/AX=X+1sabdceTTFF1234567图图7.5 被测试模块的流程
25、图被测试模块的流程图 选取测试用例:选取测试用例: ,程序执,程序执行路径为:行路径为:sacbed。 2. 判定覆盖是指:选取足够的测试用例,使判定覆盖是指:选取足够的测试用例,使得程序中每个判断的可能结果都至少执行一得程序中每个判断的可能结果都至少执行一次,也就是说使程序的每个判断分支至少通次,也就是说使程序的每个判断分支至少通过一次。过一次。 入口入口返回返回A1 and B=0A=2 or X1X=X/AX=X+1sabdceTTFF1234567图图7.5 被测试模块的流程图被测试模块的流程图对于上例,选取如下测试用例:对于上例,选取如下测试用例: I. (覆盖覆盖sacbd) II
26、. (覆盖覆盖sabed) 3. 条件覆盖是指:选择足够的测试用例,使得条件覆盖是指:选择足够的测试用例,使得程序中每个判定表达式的每个条件都取到各种程序中每个判定表达式的每个条件都取到各种可能的结果。可能的结果。 入口入口返回返回A1 and B=0A=2 or X1X=X/AX=X+1sabdceTTFF1234567图图7.5 被测试模块的流程图被测试模块的流程图 上例中,有两个判定表达式,上例中,有两个判定表达式,每个表达式有两个条件,为了每个表达式有两个条件,为了做到条件覆盖,应该选取测试做到条件覆盖,应该选取测试数据使得数据使得a点出现如下结果:点出现如下结果: 在在b点出现如下结
27、果:点出现如下结果: 选取如下测试用例:选取如下测试用例:I. (满足满足A1,B=0,A=2和和X1,执行执行路径为路径为sacbed)II. (满足满足A1,B0,A2和和X1,执行执行路径为路径为sabd) 入口入口返回返回A1 and B=0A=2 or X1X=X/AX=X+1sabdceTTFF1234567图图7.5 被测试模块的流程图被测试模块的流程图 条件覆盖通常条件覆盖通常比判定覆盖强,比判定覆盖强,但是条件覆盖不但是条件覆盖不一定包含判定覆一定包含判定覆盖。盖。入口入口返回返回A1 and B=0A=2 or X1X=X/AX=X+1sabdceTTFF1234567图图
28、7.5 被测试模块的流程图被测试模块的流程图如:如: I(满满足足A1,B=0,A=2和和X1,执执行路径为行路径为sacbed) II (满满足足A1,B0,A2和和X1,执执行路径为行路径为sabed) 只满足条件覆盖,并不满足判只满足条件覆盖,并不满足判定覆盖。定覆盖。 入口入口返回返回A1 and B=0A=2 or X1X=X/AX=X+1sabdceTTFF1234567图图7.5 被测试模块的流程图被测试模块的流程图4. 判定判定/条件覆盖是指:选取足够的测试用例条件覆盖是指:选取足够的测试用例使得同时满足判定覆盖和条件覆盖的要求。使得同时满足判定覆盖和条件覆盖的要求。 对于上例
29、,选取如下测试对于上例,选取如下测试用例:用例:IA=2,B=0,X=4 (满满足足A1,B=0,A=2和和X1,执行路径为执行路径为sacbed)IIA=1,B=1,X=1 (满满足足A1,B0,A2和和X1,执行路径为执行路径为sabd) 入口入口返回返回A1 and B=0A=2 or X1X=X/AX=X+1sabdceTTFF1234567图图7.5 被测试模块的流程图被测试模块的流程图5. 条件组合覆盖指:选取足够的测试用例,使条件组合覆盖指:选取足够的测试用例,使得每个判定表达式中条件的各种可能的组合得每个判定表达式中条件的各种可能的组合都至少出现一次。都至少出现一次。 对于上例
30、,共有对于上例,共有8种可能种可能的条件组合:的条件组合: 1)A1,B=0 2)A1,B0 3)A1,B=0 4)A1,B0 5)A=2,X1 6)A=2,X1 7)A2,X1 8)A2,X1 入口入口返回返回A1 and B=0A=2 or X1X=X/AX=X+1sabdceTTFF1234567图图7.5 被测试模块的流程图被测试模块的流程图选取如下测试用例:选取如下测试用例:I(满足满足1、5组合:组合:A1,B=0,A = 2 , X 1 , 执 行 路 径执 行 路 径sacbed)II(满足满足2、6组合:组合:A1,B0,A = 2 , X 1 , 执 行 路 径执 行 路
31、径sabed)入口入口返回返回A1 and B=0A=2 or X1X=X/AX=X+1sabdceTTFF1234567图图7.5 被测试模块的流程图被测试模块的流程图III(满足满足3、7组合:组合:A1,B=0,A2,X1,执行路径执行路径sabed)IV(满足满足4、8组合:组合:A1,B0,A2,X1,执行路径执行路径sabd) 入口入口返回返回A1 and B=0A=2 or X1X=X/AX=X+1sabdceTTFF1234567图图7.5 被测试模块的流程图被测试模块的流程图 如果从对程序路径的覆如果从对程序路径的覆盖程度分析,可以提出下盖程度分析,可以提出下面一些逻辑覆盖标
32、准:面一些逻辑覆盖标准:6. 点覆盖是指:选取足够点覆盖是指:选取足够多的测试用例,使得程序多的测试用例,使得程序执行路径至少经过程序图执行路径至少经过程序图中每个节点一次。中每个节点一次。 sabdce1234567图图7.5 对应的程序图对应的程序图7. 边覆盖是指:选取足够多的测试用例,使得边覆盖是指:选取足够多的测试用例,使得程序执行路径至少经过程序图中每条边一次。程序执行路径至少经过程序图中每条边一次。 sabdce1234567图图7.5 对应的程序图对应的程序图选取如下测试用例:选取如下测试用例:I (执行路径执行路径1453)II(执行路径执行路径1267) 8. 路径覆盖是指
33、:选取足够多的测试用例,路径覆盖是指:选取足够多的测试用例,使得程序的每条可能路径都至少执行一次。使得程序的每条可能路径都至少执行一次。sabdce1234567图图7.5 对应的程序图对应的程序图选取如下测试用例:选取如下测试用例:I (执行路径执行路径123)II (执行路径执行路径1267)III(执行路径执行路径1453)IV(执行路径执行路径14567) 1)A=3,B=0,X=12)A=2,B=0,X=43)A=2,B=1,X=14)A=1,B=0,X=25)A=1,B=1,X=1:满足路径覆盖和条件组合覆盖:满足路径覆盖和条件组合覆盖 2)5)满足条件组合覆)满足条件组合覆盖,执
34、行路径分别是:盖,执行路径分别是:sacbed、sabed、sabed、sabd入口入口返回返回A1 and B=0A=2 or X1X=X/AX=X+1sabdceTTFF1234567图图7.5 被测试模块的流程图被测试模块的流程图路径:路径:sacbd7.6.2 控制结构测试控制结构测试 (自学自学) 等价类划分是一种黑盒测试技术。等价类划分是一种黑盒测试技术。 穷尽的黑盒测试需要使用所有可能的输入数据穷尽的黑盒测试需要使用所有可能的输入数据(有效的和无效的)进行测试,通常是不现实的。(有效的和无效的)进行测试,通常是不现实的。因此产生了等价类划分。因此产生了等价类划分。 7.7.1 等
35、价划分(等价类划分)等价划分(等价类划分)7.7 黑盒测试技术黑盒测试技术 : 如果将所有可能的输入数据(有效的和无效如果将所有可能的输入数据(有效的和无效的)划分为若干个等价类,就可以假定用每一的)划分为若干个等价类,就可以假定用每一个等价类中的代表值作为测试用例来进行测试个等价类中的代表值作为测试用例来进行测试时,等价于用该类中所有值进行了测试。时,等价于用该类中所有值进行了测试。 用等价类划分设计测试用例时,主要分两步:用等价类划分设计测试用例时,主要分两步:划分等价类、确定测试用例。划分等价类、确定测试用例。 1)等价类划分等价类划分 划分等价类需要经验,以下给出一些规则:划分等价类需
36、要经验,以下给出一些规则: A如果某输入条件规定了输入的范围,那么可以划分为一个有效的如果某输入条件规定了输入的范围,那么可以划分为一个有效的等价类和两个无效的等价类。如等价类和两个无效的等价类。如X的值的输入范围是的值的输入范围是1,99,那么测试那么测试X时,可以这样划分:有效等价类为时,可以这样划分:有效等价类为1,99,无效等,无效等价类为(价类为(-,1)和()和(99,+)。)。 B如果某个输入条件规定了一组可能的值,且程序可以如果某个输入条件规定了一组可能的值,且程序可以对不同的值作出不同的处理,那么可以为每种值确定对不同的值作出不同的处理,那么可以为每种值确定一个有效的等价类,
37、同时还有一个无效等价类。一个有效的等价类,同时还有一个无效等价类。 如,如,“职称职称”这个量可能的值是:教授、副教这个量可能的值是:教授、副教授、讲师、助教。那么可以这样划分:四类有效授、讲师、助教。那么可以这样划分:四类有效等价类分别为教授、副教授、讲师、助教,无效等价类分别为教授、副教授、讲师、助教,无效等价类为四种职称以外的所有值。等价类为四种职称以外的所有值。2) A给每个等价类规定一个唯一的编号;给每个等价类规定一个唯一的编号; B设计一个新的测试用例,使其尽可能多设计一个新的测试用例,使其尽可能多地覆盖未被覆盖过的有效等价类。重复此步,地覆盖未被覆盖过的有效等价类。重复此步,直至
38、所有有效等价类被覆盖;直至所有有效等价类被覆盖; C设计一个新的测试用例,使其覆盖而设计一个新的测试用例,使其覆盖而且只覆盖一个尚未被覆盖的无效等价类。重且只覆盖一个尚未被覆盖的无效等价类。重复此步,直到所有无效等价类被覆盖。复此步,直到所有无效等价类被覆盖。 通常程序发现一类错误后,就报出错信息,通常程序发现一类错误后,就报出错信息,不再检查其它类错误,所以设计测试用例时,不再检查其它类错误,所以设计测试用例时,一次只覆盖一个无效等价类。一次只覆盖一个无效等价类。实例:一个把数字串变成整数的函数。实例:一个把数字串变成整数的函数。 计算机字长:计算机字长:16 bits ,函数由函数由PAS
39、CAL语言编写。语言编写。 function strtoint ( dstr: shortstr ): integer type shortstr = array1.6 of char; /字符串字符串6位位/ (16位字长能表示的整型数范围是位字长能表示的整型数范围是-215, 215-1,即即-32768, 32767 )有效输入的等价类有:有效输入的等价类有:(1)16个数字字符组成的数字串(最高位数字不为零);个数字字符组成的数字串(最高位数字不为零); 如:如: 0 , 999999 (2)最高位数字是零的数字串;)最高位数字是零的数字串; 如:如:“012345”(3)最高位数字左
40、邻是负号的数字串;)最高位数字左邻是负号的数字串; 如:如:“12345”无效输入的等价类有:无效输入的等价类有:(4)空字符串(全是空格);如)空字符串(全是空格);如“ ”;(5)左部填充的字符既不是零,又不是空格;)左部填充的字符既不是零,又不是空格; 如:如:“A12345”(6)最高位数字右面由数字和空格混合而成;最高位数字右面由数字和空格混合而成; 如:如:“123 45”(7)最高位数字右面由数字和其他字符混合而成;)最高位数字右面由数字和其他字符混合而成; 如:如:“12A345”(8)负号与最高位数字之间有空格;负号与最高位数字之间有空格; 如:如:“- 1234”合法输出的
41、等价类有:合法输出的等价类有:(9)在计算机能表示的最小负整数和零之间的)在计算机能表示的最小负整数和零之间的负整数;负整数; 如:如: -32768 , 0 )(10)零;)零;(11)在零和计算机能表示的最大正整数之间的)在零和计算机能表示的最大正整数之间的正整数;正整数; 如:如: (0 , 32767 非法输出的等价类有:非法输出的等价类有:(12)比计算机能表示的最小负整数还小的负整数;)比计算机能表示的最小负整数还小的负整数; 如:如:“32769”(13)比计算机能表示的最大正整数还大的正整数;)比计算机能表示的最大正整数还大的正整数; 如:如:“123456”根据划分的等价类,
42、设计出测试方案根据划分的等价类,设计出测试方案11个:个:(1)16个数字组成的字符串;个数字组成的字符串; 输入:输入: 1 预期的输出:预期的输出:1(2)最高位数字是零的数字串;最高位数字是零的数字串; 输入:输入:000001 预期的输出:预期的输出:1(3)负号与最高位数字相邻;)负号与最高位数字相邻; 输入:输入:00001 预期的输出:预期的输出:1(4)最高位数字是零的特例;)最高位数字是零的特例; 输入:输入:000000 预期的输出:预期的输出:0(5)太小的负整数;)太小的负整数; 输入:输入:47561 预期的输出:错误无效输入预期的输出:错误无效输入(6)太大的正整数
43、;)太大的正整数; 输入:输入:132767 预期的输出:错误无效输入预期的输出:错误无效输入(7)空字符串;)空字符串; 输入:输入: 预期的输出:错误没有数字预期的输出:错误没有数字(8)字符串左部字符既不是零又不是空格;)字符串左部字符既不是零又不是空格; 输入:输入:AAAAA1 预期的输出:错误非数字预期的输出:错误非数字(9)最高位数字后面有空格;)最高位数字后面有空格; 输入:输入:1 2 预期的输出:错误无效输入预期的输出:错误无效输入(10)最高位数字后面有其他字符;)最高位数字后面有其他字符; 输入:输入:1AAA23 预期的输出:错误无效输入预期的输出:错误无效输入(11
44、)负号和最高位数字之间有空格;负号和最高位数字之间有空格; 输入:输入: 12 预期的输出:错误负号位置错。预期的输出:错误负号位置错。 程序通常在处理边缘情况时容易出现错误,如程序通常在处理边缘情况时容易出现错误,如等价类与等价类之间的边界值。等价类与等价类之间的边界值。 所以在设计测试用例时,使用正好等于、正好所以在设计测试用例时,使用正好等于、正好大于、正好小于边界值的数据进行测试,发现程大于、正好小于边界值的数据进行测试,发现程序错误的概率较大。序错误的概率较大。 7.7.2 边界值分析边界值分析 边界值分析测试法属黑盒测试。边界值分析测试法属黑盒测试。 在实际设计测试方案时,常常结合
45、使用等价在实际设计测试方案时,常常结合使用等价划分和边界值分析两种技术,把一些等价类的划分和边界值分析两种技术,把一些等价类的边界值作为测试用例进行测试。边界值作为测试用例进行测试。 上例中设计了上例中设计了11个测试用例,还应该用边界值个测试用例,还应该用边界值分析补充测试用例:分析补充测试用例:(12)使输出刚好等于最小负整数;)使输出刚好等于最小负整数; 输入:输入:32768 预期的输出:预期的输出:32768(13)使输出刚好等于最大的正整数;)使输出刚好等于最大的正整数; 输入:输入: 32767 预期的输出:预期的输出:32767(14)使输出刚刚小于最小的负整数;)使输出刚刚小
46、于最小的负整数; 输入:输入:32769 预期的输出:错误无效输入预期的输出:错误无效输入(15)使输出刚刚大于最大正整数;)使输出刚刚大于最大正整数; 输入:输入: 32768 预期的输出:错误无效输入预期的输出:错误无效输入 错误推测法在很大程度上靠直觉和经验进行。错误推测法在很大程度上靠直觉和经验进行。 基本思想:列举出程序中可能的错误和容易发基本思想:列举出程序中可能的错误和容易发生错误的特殊情况,且根据它们选择测试方案。生错误的特殊情况,且根据它们选择测试方案。 如:输入、输出为如:输入、输出为0时容易出错;输出记录为时容易出错;输出记录为0条时容易出错;等等。条时容易出错;等等。7
47、.7.3 错误推测错误推测 对软件系统进行实际测试时,应该联合使对软件系统进行实际测试时,应该联合使用各种设计测试方案的方法,形成一种综合用各种设计测试方案的方法,形成一种综合策略。具体可以使用如下策略:策略。具体可以使用如下策略: 1)在任何情况下都应该进行边界值分析;)在任何情况下都应该进行边界值分析; 2)必要时用等价划分法补充测试方案;)必要时用等价划分法补充测试方案;7.7.4 实用测试策略实用测试策略3)必要时再用错误推测法补充测试方案;)必要时再用错误推测法补充测试方案;4)对照程序逻辑,检查已经设计出的测试)对照程序逻辑,检查已经设计出的测试方案。可以根据对程序可靠性的要求采方
48、案。可以根据对程序可靠性的要求采用不同的逻辑覆盖标准。用不同的逻辑覆盖标准。:程序:程序TRIANGLE读入三个整数值,读入三个整数值,这三个整数代表同一个三角形三条边的长度,这三个整数代表同一个三角形三条边的长度,程序根据这三个值判断三角形属于不等边、程序根据这三个值判断三角形属于不等边、等腰或是等边三角形。等腰或是等边三角形。 开始开始停止停止AB+CBA+CCA+BA=BA=CB=CB=C输出:等输出:等边三角形边三角形输出:不输出:不等边三角等边三角形形输出:等输出:等腰三角形腰三角形输出:不输出:不是三角形是三角形abcdefghijklmnop1234567891011121314
49、1516171819202122TFTFTFTTFFFTTF图图7.8 程序程序TRIANGLE的流程图的流程图 综合使用边界值分析、等价值划分和错误推测等技综合使用边界值分析、等价值划分和错误推测等技术,可以设计出术,可以设计出11种应该测试的情况:种应该测试的情况: (1)正常的不等边三角形)正常的不等边三角形; (2)正常的等边三角形)正常的等边三角形; (3)正常的等腰三角形,包括两条相等边的三种不)正常的等腰三角形,包括两条相等边的三种不同排列方法同排列方法; (4)退化的三角形(即两边的和等于第三边),包)退化的三角形(即两边的和等于第三边),包括三种不同排列方法;括三种不同排列方
50、法;(5)三条边不能构成三角形(即两边之和小于第三边),)三条边不能构成三角形(即两边之和小于第三边),包括三种不同排列方法;包括三种不同排列方法;(6)一条边的长度为零,包括三种不同的排列方法;)一条边的长度为零,包括三种不同的排列方法;(7)两条边的长度为零,包括三种不同的排列方法;)两条边的长度为零,包括三种不同的排列方法;(8)三条边的长度全为零;)三条边的长度全为零;(9)输入数据中包含负整数;)输入数据中包含负整数;(10)输入数据不全(不足三个正整数);)输入数据不全(不足三个正整数);(11)输入数据中包含非整数型的数据。)输入数据中包含非整数型的数据。abcdefghklmn