资源描述
单击此处编辑母版标题样式,*,*,第,*,页,河北工业大学廊坊分院计算机系,软件测试,第 6 章 软件测试用例的设计,6.1 黑 盒 测 试,6.2 白 盒 测 试,6,.3,测 试 用 例 设 计,测试方法有多种,使用最为广泛的是黑盒测试和白盒测试。黑盒测试是以用户的观点,从输入数据与输出数据的对应关系出发进行的测试,它完全不涉及程序的内部结构。而白盒测试则是根据程序内部的结构进行测试,不考虑外部的特性。,6.1 黑 盒 测 试,黑盒测试也称功能测试或数据驱动测试,前提是已知产品所具有的功能,通过测试来检测每个功能是否都正常使用。,黑盒测试方法主要有等价类划分、边界值分析、因果图、错误推测、功能图法等,主要用于软件确认测试。,6.1.1,等价类划分法,等价类划分是一种典型的黑盒测试方法。使用这一方法时,完全不考虑程序的内部结构,只依据程序的规格说明来设计测试用例。由于不可能用所有可以输入的数据来测试程序,而只能从全部可供输入的数据中选择一个自己进行测试。如何选择适当的子集,使其尽可能多地发现错误,解决的办法之一就是等价类划分,首先,把数目极多的输入数据,包括有效的和无效的,划分为若干等价类,而所谓等价类,是指某个输入域的子集合。在该子集合中,各个输入数据对于揭露程序中的错误都是等效的。并合理地假定:测试某等价类的代表值就等价于对这一类其他值的测试。因此,可以把全部输入数据合理划分为若干等价类,在每一个等价类中取一个数据作为测试的输入条件,就可用少量代表性测试数据,取得较好的测试结果,等价类的划分有以下两种不同的情况,有效等价类,无效等价类,划分等价类的原则如下,按区间划分,按数值划分,按数值集合划分,按限制条件或规则划分,输入条件,有效等价类,无效等价类,.,.,.,.,.,.,表61 等价类表示例,在确立了等价类之后,建立等价类表,列出所有划分出的等价类,如表6-1所示。,再从划分出的等价类中按以下原则选择测试用例。,为每一个等价类规定一个惟一的编号。,设计一个新的测试用例,使其尽可能多地覆盖尚未覆盖的有效等价类;重复这一步骤,直到所有的有效等价类都被覆盖为止。,设计一个新的测试用例,使其仅覆盖一个无效等价类,重复这一步骤,直到所有的无效等价类都被覆盖为止。,6.1.2,边界值分析法,人们从长期的测试工作经验得知,大量的错误是发生在输入或输出范围的边界上,而不是在输入范围的内部。因此针对各种边界情况设计测试用例,可以查出更多的错误。,使用边界值分析方法设计测试用例,首先应确定边界情况。,选择测试用例的原则如下。,如果输入条件规定了值的范围,则应该取刚达到这个范围的边界值,以及刚刚超过这个范围边界的值作为测试输入数据。,如果输入条件规定了值的个数,则用最大个数、最小个数、比最大个数多1个、比最小个数少1 个的数作为测试数据。,根据规格说明的每一个输出条件,使用规则1。,根据规格说明的每一个输出条件,使用规则2。,如果程序的规格说明给出的输入域或输出域是有序集合(如有序表、顺序文件等),则应选取集合的第一个和最后一个元素作为测试用例。,如果程序用了一个内部结构,应该选取这个内部数据结构的边界值作为测试用例。,分析规格说明,找出其他可能的边界条件。,6.1.3,错误推测法,人们也可以靠经验和直觉推测程序中可能存在的各种错误,从而有针对性地编写检查这些错误的例子。这就是错误推测法。,错误推测法的基本想法是:列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据它们选择测试用例。,6.1.4,因果图法,因果图方法最终生成的就是判定表。它适合于检查程序输入条件的各种组合情况。,利用因果图生成测试用例的基本步骤如下。,分析软件规格说明的描述中哪些是原因,哪些是结果。原因是输入条件或输入条件的等价类,结果是输出条件。,分析软件规格说明描述中的语义,找出原因与结果之间、原因与原因之间对应的关系,根据这些关系,画出因果图。,标明约束条件。由于语法或环境的限制,有些原因和结果的组合情况是不可能出现的。为表明这些特定的情况,在因果图上使用若干标准的符号标明约束条件。,把因果图转换成判定表。,为判定表中的每一列设计测试用例。,通常在因果图中,用C,i,表示原因,E,i,表示结果,其基本符号如图6-1所示。,图6-1 因果图的基本符号,对于黑盒测试方法来说,以上4种方法是基本的测试方法,除此之外还有判定表驱动法、正交试验法、功能图法和场景法等。,在实际测试中,往往是综合使用各种方法才能有效地提高测试效率和测试覆盖率,这就需要认真掌握这些方法的原理,积累更多的测试经验,以有效地提高测试水平。,6.1.5 综合策略,以下是各种测试方法选择的综合策略,可供读者在实际应用过程中参考。,首先进行等价类划分,包括输入条件和输出条件的等价划分,将无限测试变成有限测试,这是减少工作量和提高测试效率最有效的方法。,在任何情况下都必须使用边界值分析方法。经验表明,用这种方法设计出的测试用例发现程序错误的能力最强。,可以用错误推测法追加一些测试用例,这需要依靠测试工程师的智慧和经验。,对照程序逻辑,检查已设计出的测试用例的逻辑覆盖程度。如果没有达到要求的覆盖标准,应当再补充足够的测试用例。,如果程序的功能说明中含有输入条件的组合情况,则一开始就可选用因果图法和判定表驱动法。,模块设计导出的测试;,这个阶段适合的技术有:,这个阶段适合的技术有:,在设计程序中,一个判定语句是由多个条件组合而成的复合判定。,测试方法有多种,使用最为广泛的是黑盒测试和白盒测试。,错误猜测;,白盒测试的动态测试要根据程序的控制结构设计测试用例,其原则是:,通常环路复杂性可用以下3种方法求得。,多条件覆盖也称为条件组合覆盖,它的含义是:设计足够的测试用例,使得每个判定中条件的各种可能组合都至少出现一次。,(5)步骤5:覆盖率测试用例设计,在设计程序中,一个判定语句是由多个条件组合而成的复合判定。,控制流图是描述程序控制流的一种图示方式。,使用这一方法时,完全不考虑程序的内部结构,只依据程序的规格说明来设计测试用例。,(1)步骤1:使被测单元运行,包含功能测试、健壮性测试、可靠性测试。,按判定覆盖准则进行测试是指,设计若干测试用例,运行被测程序,使得程序中每个判断的取真分支和取假分支至少经历一次,即判断的真假值均曾被满足。,1语句覆盖,对于参数配置类的软件,要用正交试验法选择较少的组合方式达到最佳效果。,功能图法也是很好的测试用例设计方法,我们可以通过不同时期条件的有效性设计不同的测试数据。,6.2 白 盒 测 试,白盒测试也称为结构测试或逻辑驱动测试,前提是知道产品内部工作过程,可通过测试来检测产品内部动作是否按照规格说明书的规定正常进行,按照程序内部的结构测试程序,检验程序中的每条通路是否都能够按预定要求正确工作,而不管产品的功能,主要用于软件验证。,白盒测试的动态测试要根据程序的控制结构设计测试用例,其原则是:,(1)保证一个模块中的所有独立路径至少被使用一次;,(2)对所有逻辑值均需测试true和false;,(3)在上下边界及可操作范围内运行所有循环;,(4)检查内部数据结构以确保其有效性。,6.2.1 基本概念,1.程序的控制流图,控制流图是描述程序控制流的一种图示方式。其中基本的控制结构对应的图形符号如图6-2所示。在图6-2所示的图形符号中,圆圈称为控制流图的一个结点,它表示一个或多个无分支的语句或源程序语句。,图6-2 控制流图的图形符号,图6-3 程序流程图和对应的控制流图,图6-3(a)所示的是一个程序的流程图,它可以映射成图(b)所示的控制流图。,2计算程序环路复杂性,进行程序的基本路径测试时,程序的环路复杂性给出了程序基本路径集合中的独立路径条数,这是确保程序中每个可执行语句至少执行一次所必须的测试用例数目的上界。,所谓独立路径,是指包括若干未曾处理的语句或条件的一条路径。,基本路径集不是惟一的,对于给定的控制流图,可以得到不同的基本路径集。,通常环路复杂性可用以下3种方法求得。,将环路复杂性定义为控制流图中的区域数。图6.3中有4个区域,复杂性,V,(G)4,设,E,为控制流图的边数,,N,为图的结点数,则定义环路的复杂性为,V,(G)=,E,N,+2。,图6.3中E11,N9,V(G)11924,若设,P,为控制流图中的判定结点数,则有,V,(G)=,P,+1。,图6.3中判定结点数P3,故,V,(G)=,P,+14,6.2.2,程序插桩,下面将介绍几种实用的白盒测试用例设计方法,包括程序插桩、逻辑覆盖、基本路径测试等。,在软件动态测试中,程序插桩是一种基本的测试手段,有着广泛的应用。,程序插桩方法是借助往被测程序中插入打印语句或是设置断点,在执行过程中了解程序的一些动态特性。这就相当于在运行程序后,一方面检验测试结果数据,另一方面借助插入语句给出的信息了解程序动态的执行特性,从而实现了测试的目的。,如果我们想要了解一个程序在某次运行中所有可执行语句被覆盖的情况,或是每个语句的实际执行次数,最好的办法是利用插桩技术。这里仅以计算整数,X,和整数,Y,的最大公约数程序为例,说明插桩方法的要点。图6-4给出了这一程序的流程图。,图6-4 插桩后求最大公约数程序的流程图,设计插桩程序时需要考虑的问题包括:,探测哪些信息;,在程序的什么部位设置探测点;,需要设置多少个探测点。,6.2.3,逻辑覆盖,逻辑覆盖是以程序内部的逻辑结构为基础的设计测试用例的技术,是通过对程序逻辑结构的遍历实现程序的覆盖,它是一系列测试过程的总称,这组测试过程逐渐进行越来越完整的通路测试。这一方法要求测试人员对程序的逻辑结构有清楚的了解,甚至要能掌握源程序的所有细节。它属于动态测试。,从覆盖源程序语句的详细程度分析,逻辑覆盖标准有语句覆盖、判定覆盖、条件覆盖、条件判定组合覆盖、多条件覆盖和修正条件判定覆盖。,为便于理解,使用如下所示的程序,图65所示的是其流程图。,图6-5 参考例子流程图,int function1(bool a,bool b,bool c),int x;,x=0;,if(a&(b|c),x=1;,return x;,1语句覆盖,为了暴露程序中的错误,程序中的每条语句至少应该执行一次。所以,语句覆盖的含义是:选择足够多的测试数据,使被测程序中每条语句至少执行一次。,2判定覆盖,比语句覆盖稍强的覆盖标准是判定覆盖。按判定覆盖准则进行测试是指,设计若干测试用例,运行被测程序,使得程序中每个判断的取真分支和取假分支至少经历一次,即判断的真假值均曾被满足。判定覆盖又称为分支覆盖,3条件覆盖,在设计程序中,一个判定语句是由多个条件组合而成的复合判定。,条件覆盖的含义是:构造一组测试用例,使得每一判定语句中每个逻辑条件的可能值至少满足一次。,4条件判定组合覆盖,条件判定组合覆盖的含义是:设计足够的测试用例,使得判定中每个条件的所有可能(真/假)至少出现一次,并且每个判定本身的判定结果(真/假)也至少出现一次,5多条件覆盖,多条件覆盖也称为条件组合覆盖,它的含义是:设计足够的测试用例,使得每个判定中条件的各种可能组合都至少出现一次。显然满足多条件覆盖的测试用例是一定满足判定覆盖、条件覆盖和条件判定组合覆盖的。,6.2.4,基本路径测试,上节的例子是个比较简单的程序段,只有两条路径。但在实际问题中,即使一个不太复杂的程序,其路径的组合都是一个庞大的数字。,如果把覆盖的路径数压缩到一定限度内,例如,程序中的循环体只执行零次和一次,就成为基本路径测试。,设计出的测试用例要保证在测试中程序的每一条可执行语句至少执行一次。,2基本路径测试法步骤,基本路径测试法适用于模块的详细设计及源程序,其主要步骤如下。,以详细设计或源代码作为基础,导出程序的控制流图。,计算得到的控制流图G的环路复杂性,V,(G)。,确定线性无关的路径的基本集。,生成测试用例,确保基本路径集中每条路径的执行,6.2.5 循环测试,循环测试是一种白盒测试技术,注重于循环构造的有效性。n 循环结构测试用例的设计循环可以划分为以下几种模式,如图6-6,图6-6 各种循环图,接口测试、路径测试,含部分,测试用例的编写请参考表6-4。,版本管理是用例管理的核心部分,建议采用工具(例如Visual SourceSafe)对用例进行控制。,这里仅以计算整数X和整数Y的最大公约数程序为例,说明插桩方法的要点。,功能测试用例。,程序插桩方法是借助往被测程序中插入打印语句或是设置断点,在执行过程中了解程序的一些动态特性。,对等区间划分(等价分类法)。,有效的用例评审通常由下面两种形式组成。,模块设计导出的测试;,另外有一些内容由测试人员的相关背景知识、经验、直觉等产生。,最后,总结一下用例设计的一般原则。,对于黑盒测试方法来说,以上4种方法是基本的测试方法,除此之外还有判定表驱动法、正交试验法、功能图法和场景法等。,单元测试说明实际上由一系列单元测试用例组成,每个测试用例应该包含以下4个关键元素。,可以使用如下方法设计循环测试用例:,一、简单循环:,设,n,为循环的最大次数,测试用例可设计如下:,跳过循环。,只执行一次循环。,执行,m,次循环,这里,m,n,。,执行,n1,次,,n,次,,n1,次循环。,二、嵌套循环:,置外循环处于最小循环计数值,对内层进行单循环测试。,由里向外,进行下一层的循环测试。,三、串接循环:使用嵌套策略,四、无结构循环:不能测试,最后,归纳一下白盒测试中各种测试方法的应用策略。,在白盒测试中,可以使用各种测试方法的综合策略如下。,(1)在测试中,应尽量先使用工具进行静态结构分析。,(2)测试中可采取先静态后动态的组合方式:先进行静态结构分析、代码检查,再进行覆盖率测试。,(3)利用静态分析的结果作为导引,通过代码检查和动态测试的方式对静态发现结果进行进一步的确认,使测试工作更为有效。,(4)覆盖率测试是白盒测试的重点,一般可使用基本路径测试法达到语句覆盖标准;对于软件的重点模块,应使用多种覆盖率标准衡量代码的覆盖率。,测试部门内部评审,用户界面测试用例。,循环测试是一种白盒测试技术,注重于循环构造的有效性。,一、简单循环:,在开始实施测试之前设计好测试用例,可以避免盲目测试并提高测试效率。,还有可能在测试设计阶段比测试执行阶段发现更多的BUG。,对于参数配置类的软件,要用正交试验法选择较少的组合方式达到最佳效果。,在该子集合中,各个输入数据对于揭露程序中的错误都是等效的。,在集成测试阶段,需要增加静态结构分析等;,如果输入条件规定了值的范围,则应该取刚达到这个范围的边界值,以及刚刚超过这个范围边界的值作为测试输入数据。,在测试时,不可能进行穷举测试,为了节省时间和资源,提高测试效率,必须要从数量极大的可用测试数据中精心挑选出具有代表性或特殊性的测试数据来进行测试。,条件测试;,测试用例的设计依据为系统需求分析、系统用户手册和系统设计报告等相关资料的内容,而且测试人员要与开发人员充分交互。,设计一个新的测试用例,使其仅覆盖一个无效等价类,重复这一步骤,直到所有的无效等价类都被覆盖为止。,设计定义试验测试;,错误推测法的基本想法是:列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据它们选择测试用例。,(5)在不同的测试节点,测试的侧重点不同:在单元测试阶段,以代码检查、逻辑覆盖为主;在集成测试阶段,需要增加静态结构分析等;在系统测试阶段,应根据黑盒测试的结果,采取相应的白盒测试。,6,.3,测 试 用 例 设 计,6.3.1,测试用例的基本概念,简单地说,测试用例就是设计一个情况,软件程序在这种情况下,必须能够正常运行并且达到程序所设计的执行结果。,如果程序在这种情况下不能正常运行,而且这种问题会重复发生,那就表示已经测出软件有缺陷,这时候就必须将这个问题标示出来,并且输入到问题跟踪系统内,通知软件开发人员。软件开发人员接到通知后,将问题修改完成于下一个测试版本内,测试工程师取得新的测试版本后,必须利用同一个测试用例来测试这个问题,确保该问题已修改完成。,测试用例应由测试人员在充分了解系统的基础上在测试之前设计好,测试用例的设计是测试系统开发中一项非常重要的内容。测试用例的设计依据为系统需求分析、系统用户手册和系统设计报告等相关资料的内容,而且测试人员要与开发人员充分交互。另外有一些内容由测试人员的相关背景知识、经验、直觉等产生。,测试用例的设计需要考虑很周全。在测试系统功能的同时,还要检查系统对输入数据(合法值、非法值和边界值)的反应,要检查合法的操作和非法的操作,检查系统对条件组合的反应等。好的测试用例让其他人能够很好地执行测试,能够快速地遍历所测试的功能,能够发现至今没有发现的错误。所以测试用例应该由经验丰富的系统测试人员来编写,对于新手来说,应该多阅读一些好的测试用例,并且在测试实践中用心去体会。,在测试时,不可能进行穷举测试,为了节省时间和资源,提高测试效率,必须要从数量极大的可用测试数据中精心挑选出具有代表性或特殊性的测试数据来进行测试。,使用测试用例的好处主要体现在以下几个方面。,在开始实施测试之前设计好测试用例,可以避免盲目测试并提高测试效率。,测试用例的使用令软件测试的实施重点突出、目的明确。,在软件版本更新后只需修正少部分的测试用例便可开展测试工作,降低工作强度,缩短项目周期。,功能模块的通用化和复用化使软件易于开发,而测试用例的通用化和复用化则会使软件测试易于开展,并随着测试用例的不断精化其效率也不断提高。,测试用例主要有如下几种。,功能测试用例。包含功能测试、健壮性测试、可靠性测试。,性能测试用例。包含性能测试、压力测试、强度测试。,集成测试用例。包含接口测试、健壮性测试、可靠性测试。,安全测试用例。安全测试用例。,用户界面测试用例。用户界面测试用例、少量功能测试用例。,安装/反安装测试用例。安装/反安装测试用例。,测试种类、阶段和用例的关系如表6-2所示。,表,6,-,2,测试阶段与测试用例关系列表,测,试,阶,段,测,试,类,型,执,行,人,员,单元测试,模块功能测试,包含部分接口,测试、路径测试,开发人员,集成测试,接口测试、路径测试,含部分,功能测试,开发人员,如果测试,人员水平较高可以由,测试人员执行,系统测试,功能测试、健壮性测试、性能,测试、用户界面测试、安全性,测试、压力测试、可靠性测试、,安装,/,反安装测试,测试人员,验收测试,对于实际项目基本同上,并包,含文档测试;对于软件产品主,要测试相关技术文档,测试人员,可能包含,用户,表,63,测试用例编写的时间安排,开,发,阶,段,依,据,文,档,编写的用例,需求分析结束后,需求文档,系统测试对应的用例,概要设计阶段结束后,概要设计、体系设计,集成测试对应的用例,详细设计阶段,详细设计文档,单元测试对应的用例,测试工作和开发通常一同进行,所以在完成测试计划编写后,就可以进行用例的编写工作了。测试和开发的对应关系如表6-3所示。,6.3.2,测试用例的设计步骤,测试按照阶段分为单元测试、集成测试以及系统测试。而各阶段都有相应的测试用例。这里,以单元测试的用例设计为依据来说明测试用例的设计步骤。,单元测试说明实际上由一系列单元测试用例组成,每个测试用例应该包含以下4个关键元素。,被测单元模块初始状态声明,即测试用例的开始状态(仅适用于被测单元维持了调用间状态的情况)。,被测单元的输入,包含由被测单元读入的任何外部数据值。,该测试用例实际测试的代码,用被测单元的功能和测试用例设计中使用的分析来说明,如单元中哪一个决策条件被测试。,测试用例的期望输出结果。测试用例的期望输出结果总是应该在测试进行之前在测试说明中定义。,下面说明测试用例的设计步骤。,(1)步骤1:使被测单元运行,这个阶段适合的技术有:,模块设计导出的测试;,对等区间划分(等价分类法)。,(2)步骤2:正面测试,这个阶段适合的技术有:,设计说明导出的测试;,等价类分析;,状态转换测试。,这个阶段适合的技术有:,错误猜测;,边界值分析;,内部边界值测试;,状态转换测试,(3)步骤3:负面测试,这个阶段适合的技术有:,设计说明导出的测试。,(4)步骤4:需求中其他测试特性用例设计,(5)步骤5:覆盖率测试用例设计,这个阶段适合的技术有:,分支测试;,条件测试;,数据定义使用测试;,状态转换测试。,其中和均属于逻辑覆盖范畴。,(6)步骤6:测试执行,(7)步骤7:完善代码覆盖,这个阶段适合的技术有:,分支测试;,条件测试;,设计定义试验测试;,状态转换测试。,最后,总结一下用例设计的一般原则。,通常应该避免依赖先前测试用例的输出,测试用例的执行序列早期发现的错误可能导致其他的错误而减少测试执行时实际测试的代码量。,测试用例设计过程中,包括作为试验执行这些测试用例时,常常可以在软件构建前就发现BUG。还有可能在测试设计阶段比测试执行阶段发现更多的BUG。,6.3.3,测试用例的编写,1测试用例计划的编写,2测试设计说明,3测试用例说明,4测试程序说明,测试用例的编写请参考表6-4。,表6-4 测试用例,图6-7 测试程序说明片断,图6-7所示是“Windows计算器”的测试程序说明的例子片断。,6.3.4,测试用例的管理,可以把测试用例看成程序测试工程师编写的程序,这个程序也要经过“设计”、“开发”、“测试”、“版本管理”、“发布”、“维护”等一系列操作。,1用例评审,有效的用例评审通常由下面两种形式组成。,测试部门外部评审,测试部门内部评审,通常情况下先执行内部评审,然后执行外部评审。很多时候,内部评审会被忽略,建议要进行内部评审。,2用例管理,版本管理是用例管理的核心部分,建议采用工具(例如Visual SourceSafe)对用例进行控制。建议用例参照图6-8进行管理,图6-8 用例管理示意图,在编写测试用例之前,应该给出测试大纲,大纲基本上是测试思路的整理,以保证测试用例的设计能够清晰、完整而不是顾此失彼。测试大纲可以按照模块、功能点、菜单和业务流程这样的思路来策划。,本章总结,
展开阅读全文