白盒测试及用例设计

白盒测试及用例设计
白盒测试及用例设计

白盒测试

白盒测试(White-box Testing,又称逻辑驱动测试,结构测试)

是把测试对象看作一个打开的盒子。利用白盒测试法进行动态测试时,需要测试软件产品的内部结构和处理过程,不需测试软件产品的功能。白盒测试又称为结构测试和逻辑驱动测试。

白盒测试法的覆盖标准有逻辑覆盖、循环覆盖和基本路径测试。其中逻辑覆盖包括语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖。

六种覆盖标准:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖发现错误的能力呈由弱至强的变化。语句覆盖每条语句至少执行一次。判定覆盖每个判定的每个分支至少执行一次。条件覆盖每个判定的每个条件应取到各种可能的值。判定/条件覆盖同时满足判定覆盖条件覆盖。条件组合覆盖每个判定中各条件的每一种组合至少出现一次。路径覆盖使程序中每一条可能的路径至少执行一次。

白盒测试也称结构测试或逻辑驱动测试,它是知道产品内部工作过程,可通过测试来检测产品内部动作是否按照规格说明书的规定正常进行,按照程序内部的结构测试程序,检验程序中的每条通路是否都有能按预定要求正确工作,而不顾它的功能,白盒测试的主要方法有逻辑驱动、基路测试等,主要用于软件验证。

"白盒"法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。"白盒"法是穷举路径测试。在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。贯穿程序的独立路径数是天文数字。但即使每条路径都测试了仍然可能有错误。第一,穷举路径测试决不能查出程序违反了设计规范,即程序本身是个错误的程序。第二,穷举路径测试不可能查出程序中因遗漏路径而出错。第三,穷举路径测试可能发现不了一些与数据相关的错误。

白盒测试六种覆盖方法

摘要:白盒测试作为测试人员常用的一种测试方法,越来越受到测试工程师的重视。白盒测试并不是简单的按照代码设计用例,而是需要根据不同的测试需求,结合不同的测试对象,使用适合的方法进行测试。因为对于不同复杂度的代码逻辑,可以衍生出许多种执行路径,只有适当的测试方法,才能帮助我们从代码的迷雾森林中找到正确的方向。本文介绍六种白盒子测试方法:语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖。

由于逻辑错误和不正确假设与一条程序路径被运行的可能性成反比。由于我们经常相信某逻辑路径不可能被执行, 而事实上,它可能在正常的情况下被执行。由于代码中的笔误是随机且无法杜绝的,因此我们要进行白盒测试。

白盒测试又称结构测试,透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试是一种测试用例设计方法,盒子指的是被测试的软件,白盒指的是盒子是可视的,你清楚盒子内部的东西以及里面是如何运作的。

白盒的测试用例需要做到:

●保证一个模块中的所有独立路径至少被使用一次

●对所有逻辑值均需测试

●在上下边界及可操作范围内运行所有循环

●检查内部数据结构以确保其有效性

白盒测试的目的:通过检查软件内部的逻辑结构,对软件中的逻辑路径进行覆盖测试;在程序不同地方设立检查点,检查程序的状态,以确定实际运行状态与预期状态是否一致。

白盒测试的特点:依据软件设计说明书进行测试、对程序内部细节的严密检验、针对特定条件设计测试用例、对软件的逻辑路径进行覆盖测试。

白盒测试的实施步骤:

1.测试计划阶段:根据需求说明书,制定测试进度。

2.测试设计阶段:依据程序设计说明书,按照一定规范化的方法进行软件结构划分和

设计测试用例。

3.测试执行阶段:输入测试用例,得到测试结果。

4.测试总结阶段:对比测试的结果和代码的预期结果,分析错误原因,找到并解决错

误。

白盒测试的方法:总体上分为静态方法和动态方法两大类。

静态分析是一种不通过执行程序而进行测试的技术。静态分析的关键功能是检查软件的表示和描述是否一致,没有冲突或者没有歧义。

动态分析的主要特点是当软件系统在模拟的或真实的环境中执行之前、之中和之后, 对软件系统行为的分析。动态分析包含了程序在受控的环境下使用特定的期望结果进行正式的运行。它显示了一个系统在检查状态下是正确还是不正确。在动态分析技术中,最重要的技术是路径和分支测试。下面要介绍的六种覆盖测试方法属于动态分析方法。

白盒测试的优缺点

1、优点

●迫使测试人员去仔细思考软件的实现

●可以检测代码中的每条分支和路径

●揭示隐藏在代码中的错误

●对代码的测试比较彻底

●最优化

2、缺点

●昂贵

●无法检测代码中遗漏的路径和数据敏感性错误

●不验证规格的正确性

六种覆盖方法

首先为了下文的举例描述方便,这里先给出一张程序流程图。(本文以1995年软件设计师考试的一道考试题目为例,图中红色字母代表程序执行路径)。

1、语句覆盖

1)主要特点:语句覆盖是最起码的结构覆盖要求,语句覆盖要求设计足够多的测试用例,使得程序中每条语句至少被执行一次。

2)用例设计:(如果此时将A路径上的语句1—〉T去掉,那么用例如下)

3)优点:可以很直观地从源代码得到测试用例,无须细分每条判定表达式。

4)缺点:由于这种测试方法仅仅针对程序逻辑中显式存在的语句,但对于隐藏的条件和可能到达的隐式逻辑分支,是无法测试的。在本例中去掉了语句1—〉T去掉,那么就少了一条测试路径。在if结构中若源代码没有给出else后面的执行分支,那么语句覆盖测试就不会考虑这种情况。但是我们不能排除这种以外的分支不会被执行,而往往这种错误会经常出现。再如,在Do-While结构中,语句覆盖执行其中某一个条件分支。那么显然,语句覆盖对于多分支的逻辑运算是无法全面反映的,它只在乎运行一次,而不考虑其他情况。

2、判定覆盖

1)主要特点:判定覆盖又称为分支覆盖,它要求设计足够多的测试用例,使得程序中每个判定至少有一次为真值,有一次为假值,即:程序中的每个分支至少执行一次。每个判断的取真、取假至少执行一次。

2

3)优点:判定覆盖比语句覆盖要多几乎一倍的测试路径,当然也就具有比语句覆盖更强的测试能力。同样判定覆盖也具有和语句覆盖一样的简单性,无须细分每个判定就可以得到测试用例。

4)缺点:往往大部分的判定语句是由多个逻辑条件组合而成(如,判定语句中包含AND、OR、CASE),若仅仅判断其整个最终结果,而忽略每个条件的取值情况,必然会遗漏部分测试路径。

3、条件覆盖

1)主要特点:条件覆盖要求设计足够多的测试用例,使得判定中的每个条件获得各种可能的结果,即每个条件至少有一次为真值,有一次为假值。

2)用例设计:

3)优点:显然条件覆盖比判定覆盖,增加了对符合判定情况的测试,增加了测试路径。4)缺点:要达到条件覆盖,需要足够多的测试用例,但条件覆盖并不能保证判定覆盖。条件覆盖只能保证每个条件至少有一次为真,而不考虑所有的判定结果。

4、判定/条件覆盖

1)主要特点:设计足够多的测试用例,使得判定中每个条件的所有可能结果至少出现一次,每个判定本身所有可能结果也至少出现一次。

2)用例设计:

3)优点:判定/条件覆盖满足判定覆盖准则和条件覆盖准则,弥补了二者的不足。4)缺点:判定/条件覆盖准则的缺点是未考虑条件的组合情况。

5、组合覆盖:

1)主要特点:要求设计足够多的测试用例,使得每个判定中条件结果的所有可能组合至少出现一次。

2)用例设计:

3)优点:多重条件覆盖准则满足判定覆盖、条件覆盖和判定/条件覆盖准则。更改的判定/条件覆盖要求设计足够多的测试用例,使得判定中每个条件的所有可能结果至少出现一次,每个判定本身的所有可能结果也至少出现一次。并且每个条件都显示能单独影响判定结果。

4)缺点:线性地增加了测试用例的数量。

6、路径覆盖

1)主要特点:设计足够的测试用例,覆盖程序中所有可能的路径。

2

3)优点:这种测试方法可以对程序进行彻底的测试,比前面五种的覆盖面都广。

4)缺点:由于路径覆盖需要对所有可能的路径进行测试(包括循环、条件组合、分支选择等),那么需要设计大量、复杂的测试用例,使得工作量呈指数级增长。而在有些情况下,一些执行路径是不可能被执行的,如:

If (!A)B++;

If (!A)D--;

这两个语句实际只包括了2条执行路径,即A为真或假时候对B和D的处理,真或假不可能都存在,而路径覆盖测试则认为是包含了真与假的4条执行路径。这样不仅降低了测试效率,而且大量的测试结果的累积,也为排错带来麻烦。

总结

白盒测试是一种被广泛使用的逻辑测试方法,是由程序内部逻辑驱动的一种单元测试方法。只有对程序内部十分了解才能进行适度有效的白盒测试。但是贯穿在程序内部的逻辑存在着不确定性和无穷性,尤其对于大规模复杂软件。因此我们不能穷举所有的逻辑路径,即使穷举也未必会带来好运(穷举不能查出程序逻辑规则错误,不能查出数据相关错误,不能查出程序遗漏的路径)。

那么正确使用白盒测试,就要先从代码分析入手,根据不同的代码逻辑规则、语句执行情况,选用适合的覆盖方法。任何一个高效的测试用例,都是针对具体测试场景的。逻辑测试不是片面的测试正确的结果或是测试错误的结果,而是尽可能全面地覆盖每一个逻辑路径

用例设计

一、白盒测试

根据软件产品的内部工作过程,在计算机上进行测试,以证实每种内部操作是否符合设计规格要求,所有内部成分是否已经过检查。这种测试方法就是白盒测试。白盒测试把测试对象看做一个打开的盒子,允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。

不论是黑盒测试,还是白盒测试,都不可能把所有可能的输入数据都拿来进行所谓的穷举测试。因为可能的测试输入数据数目往往达到天文数字。下面让我们看两个例子。

假设一个程序P有输入X和Y及输出Z,参看图10-4-1。在字长为32位的计算机上运行。如果X 、Y只取整数,考虑把所有的X 、Y值都做为测试数据,按黑盒测试方法进行穷举测试,力图全面、无遗漏地“挖掘”出程序中的所有错误。这样做可能采用的测试数据组(Xi,Yi)的最大可能数目为:。如果程序P测试一组X、Y数据需要 1毫秒,且一天工作24小时,一年工作365天,要完成264组测试,需要5亿年。

图 10-4-1 黑盒子

而对一个具有多重选择和循环嵌套的程序,不同的路径数目也可能是天文数字。设给出一个如图 10-4-2所示的小程序的流程图,其中包括了一个执行达20次的循环。那么它所包含的不同执行路径数高达条,若要对它进行穷举测试,覆盖所有的路径。假使测试程序对每一条路径进行测试需要1毫秒,同样假定一天工作24小时,一年工作365 天,那么要想把如图 10-4-2所示的小程序的所有路径测试完,则需要3170年。

图 10-4-2 白盒测试中的穷举测试

以上的分析表明,实行穷举测试,由于工作量过大,实施起来是不现实的。任何软件开发项目都要受到期限、费用、人力和机时等条件的限制,尽管为了充分揭露程序中所有隐藏错误,需要针对所有可能的数据进行测试,但事实告诉我们,这样做是不可能的。

软件工程的总目标是充分利用有限的人力、物力资源,高效率、高质量、低成本地完成软件开发项目。在测试阶段既然穷举测试不可行,为了节省时间和资源,提高测试效率,就必须要从数量极大的可用测试用例中精心地挑选少量的测试数据,使得采用这些测试数据能够达到最佳的测试效果,能够高效率地把隐藏的错误揭露出来。

二、逻辑覆盖

逻辑覆盖是以程序内部的逻辑结构为基础的设计测试用例的技术。属白盒测试。这一方法要求测试人员对程序的逻辑结构有清楚的了解,甚至要能掌握源程序的所有细节。由于覆盖测试的目标不同,逻辑覆盖又可分为:语句覆盖、判定覆盖、判定-条件覆盖、条件组合覆盖及路径覆盖。

1.语句覆盖

语句覆盖就是设计若干个测试用例,运行被测程序,使得每一可执行语句至少执行一次。这种覆盖又称为点覆盖,它使得程序中每个可执行语句都得到执行,但它是最弱的逻辑覆盖准,效果有限,必须与其他方法交互使用。

2.判定覆盖

判定覆盖就是设计若干个测试用例,运行被测程序,使得程序中每个判断的取真分支和取假分支至少经历一次。判定覆盖又称为分支覆盖。

判定覆盖只比语句覆盖稍强一些,但实际效果表明,只是判定覆盖,还不能保证一定能查出在判断的条件中存在的错误。因此,还需要更强的逻辑覆盖准则去检验判断内部条件。

3.条件覆盖

条件覆盖就是设计若干个测试用例,运行被测程序,使得程序中每个判断的每个条件的可能取值至少执行一次。

条件覆盖深入到判定中的每个条件,但可能不能满足判定覆盖的要求。

4.判定-条件覆盖

判定-条件覆盖就是设计足够的测试用例,使得判断中每个条件的所有可能取值至少

执行一次,同时每个判断本身的所有可能判断结果至少执行一次。换言之,即是要求各个判断的所有可能的条件取值组合至少执行一次。

判定-条件覆盖有缺陷。从表面上来看,它测试了所有条件的取值。但是事实并非如此。往往某些条件掩盖了另一些条件。会遗漏某些条件取值错误的情况。为彻底地检查所有条件的取值,需要将判定语句中给出的复合条件表达式进行分解,形成由多个基本判定嵌套的流程图。这样就可以有效地检查所有的条件是否正确了。

图 10-4-3(a)复合判定的例子

图 10-4-3(b)改为单个条件判定的嵌套结构的例子

5.多重条件覆盖

多重条件覆盖就是设计足够的测试用例,运行被测程序,使得每个判断的所有可能的条件取值组合至少执行一次。

这是一种相当强的覆盖准则,可以有效地检查各种可能的条件取值的组合是否正确。它不但可覆盖所有条件的可能取值的组合,还可覆盖所有判断的可取分支,但可能有的路径会遗漏掉。测试还不完全。

6.路径测试

路径测试就是设计足够的测试用例,覆盖程序中所有可能的路径。这是最强的覆盖准

则。但在路径数目很大时,真正做到完全覆盖是很困难的,必须把覆盖路径数目压缩到一定限度。下面我们做一分析。

三、关于控制结构测试的一些讨论

1.分支结构的路径数

当程序中判定多于一个时,形成的分支结构可以分为两类:嵌套型分支结构和连锁型分支结构。如图 10-4-4所示。对于嵌套型分支结构,若有n个判定语句,则需要n+1个测试用例;但对连锁型分支结构,若有n个判定语句,则需要有个测试用例,去覆盖它的条路径。当n较大时将无法测试。

(a)嵌套型分支结构

(b)连锁型分支结构

图 10-4-4 分支的两种类型

为减少测试用例的数目,可采用试验设计法,抽取部分路径进行测试。由于抽样服从均匀分布,因此,在假定各条路径的重要性相同,或暂不明确各条路径的重要性的情况下可以做到均匀抽样。如果明确了各条路径的重要性,还可以采取加权的办法,筛选掉部分

路径,再用如下的措施进行抽样。具体步骤如下:

(1)设耦合型分支结构中有n个判定,计算满足关系式的最小自然数m;

(2)设,取正交表L4,并利用它设计测试数据。

例如,一个耦合型分支结构中有三个判定语句P1,P2,P3。它全部路径是23=8条。先计算的t,得t= 4。取正交表L4,如图10-4-5(a)所示,把每一列当做一个判定,每一行当做可取的测试用例,则正交表L4最多可取三个判定,分别代之以P1,P2,P3。判定P1,P2,P3的取假分支和取真分支分别记作S1、S2;S3、S4;S5、S6,用各个判定的取假分支取代正交表L4中的“0”,用取真分支取代正交表中的“1”,就建立起一个测试路径矩阵,如图 10-4-5(b)所示。这样,测试路径数目从条减少到3+1=4条。

图 10-4-5(a)正交表L4

图 10-4-5(b)路径抽样矩阵

2.条件测试的策略

程序中的条件分为简单条件和复合条件。简单条件是一个布尔变量或一个关系表达式(可加前缀NOT),复合条件由简单条件通过逻辑运算符(AND、OR、NOT)和括号连接而成。如果条件出错,至少是条件中某一成分有错。条件中可能的出错类型有:布尔运算符错、布尔变量错、布尔括号错、关系运算符错、算术表达式错。

如果在一个判定的复合条件表达式中每个布尔变量和关系运算符最多只出现一次,而且没有公共变量,应用一种称之为BRO(分支与关系运算符)的测试法可以发现多个布尔运算符或关系运算符错,以及其他错误。

BRO策略引入条件约束的概念。设有n个简单条件的复合条件C,其条件约束为,其中是条件C中第i个简单条件的输出约束。如果在C的执行过程中,其每个简单条件的输出都满足D中对应的约束,则称条件C的条件约束D由C的执行所覆盖。特别地,布尔变量或布尔表达式的输出约束必须是真(t)或假(f);关系表达式的输出约束为符号>、=、<。

(1)设条件为。其中是布尔变量,的输出约束为,在此,和或为t或为f。则是可能的一个约束。覆盖此约束的测试(一次运行)将令为t,为f。BRO策略要求对的可能约束集合中的每一个,分别设计一组测试用例。如果布尔运算符有错,这三组测试用例的运行结果必有一组导致失败。

(2)设条件为。其中是布尔表达式,和是算术表达式,的输出约束为,在此,或为t或为f;则是<、= 或>。因此,只有与中的不同,可以修改的约束集合,导出的约束集合。因为在中,“t”相当于“=”,“f”相当于“<”或“>”,则的约束集合为。据此设计4组测试用例,检查中可能的布尔或关系运算符中的错误。

(3)设条件为。其中都是算术表达式,的输出约束为,在此,和的约束均为<、=、>。中只有与中的不同,可以修改的约束集合,导出的约束集合。因为在中,“t” 相当于“>”,"f"相当于“<”或“=”,则的约束集合为。根据这个约束集合设计测试用例,就能够检测中的关系运算符中的错误。

3.循环测试

循环分为4种不同类型:简单循环、连锁循环、嵌套循环和非结构循环,见图 10-4-6。

对于简单循环,测试应包括以下几种,其中的n表示循环允许的最大次数。

(1)零次循环:从循环入口直接跳到循环出口。

(2)一次循环:查找循环初始值方面的错误。

(3)二次循环:检查在多次循环时才能暴露的错误。

(4) m次循环:此时的m<n,也是检查在多次循环时才能暴露的错误。

·最大次数循环、比最大次数多一次的循环、比最大次数少一次的循环。

对于嵌套循环,不能将简单循环的测试方法简单地扩大到嵌套循环,因为可能的测试数目将随嵌套层次的增加呈几何倍数增长。这可能导致一个天文数字的测试数目。下面给出一种有助于减少测试数目的测试方法。

·除最内层循环外,从最内层循环开始,置所有其他层的循环为最小值;

·对最内层循环做简单循环的全部测试。测试时保持所有外层循环的循环变量为最小值。另外,对越界值和非法值做类似的测试。

·逐步外推,对其外面一层循环进行测试。测试时保持所有外层循环的循环变量取最小值,所有其它嵌套内层循环的循环变量取“典型”值。

·反复进行,直到所有各层循环测试完毕。

对全部各层循环同时取最小循环次数,或者同时取最大循环次数。对于后一种测试,由于测试量太大,需人为指定最大循环次数。

对于连锁循环,要区别两种情况。如果各个循环互相独立,则连锁循环可以用与简单循环相同的方法进行测试。例如,有两个循环处于连锁状态,则前一个循环的循环变量的值就可以做为后一个循环的初值。但如果几个循环不是互相独立的,则需要使用测试嵌套循环的办法来处理。

对于非结构循环,应该使用结构化程序设计方法重新设计测试用例。

四、基本路径测试

如果把覆盖的路径数压缩到一定限度内,例如,程序中的循环体只执行零次和一次,就成为基本路径测试。它是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例的方法。

设计出的测试用例要保证在测试中,程序的每一个可执行语句至少要执行一次。

1.程序的控制流图

控制流图是描述程序控制流的一种图示方法。基本控制构造的图形符号如图10-4-7所示。符号○称为控制流图的一个结点,一组顺序处理框可以映射为一个单一的结点。控制流图中的箭头称为边,它表示了控制流的方向,在选择或多分支结构中分支的汇聚处,即使没有执行语句也应该有一个汇聚结点。边和结点圈定的区域叫做区域,当对区域计数

时,图形外的区域也应记为一个区域。

图 10-4-7 控制流图的各种图形符号

如果判定中的条件表达式是复合条件时,即条件表达式是由一个或多个逻辑运算符(OR,AND,NAND,NOR)连接的逻辑表达式,则需要改复合条件的判定为一系列只有单个条件的嵌套的判定。例如对应图 10-4-8(a)的复合条件的判定,应该画成如图 10-4-8(b)所示的控制流图。条件语句ifaORb中条件a和条件b各有一个只有单个条件的判定结点。

图 10-4-8

2.计算程序环路复杂性

进行程序的基本路径测试时,程序的环路复杂性给出了程序基本路径集合中的独立路径条数,这是确保程序中每个可执行语句至少执行一次所必需的测试用例数目的上界。所谓独立路径,是指包括一组以前没有处理的语句或条件的一条路径。如在图10-4-9(b)所示的控制流图中,一组独立的路径是

path1:1-11

path2:1-2-3-4-5-10-1-11

path3:1-2-3-6-8-9-10-1-11

path4:1-2-3-6-7-9-10-1-11

路径path1,path2,path3,path4组成了图 10-4-9(b)所示控制流图的一个基本路径集。只要设计出的测试用例能够确保这些基本路径的执行,就可以使得程序中的每个可执行语句至少执行一次,每个条件的取真和取假分支也能得到测试。基本路径集不是唯一的,对于给定的控制流图,可以得到不同的基本路径集。

(a)程序流程图

(b)控制流图

图 10-4-9 程序流程图与对应的控制流图

通常环路复杂性可用以下3种方法求得。

(1)将环路复杂性定义为控制流图中的区域数。

(2)设E为控制流图的边数,N为图的结点数,则定义环路复杂性为V(G)=E-N +2。

(3)若设P为控制流图中的判定结点数,则有V(G)=P+1。

因为图 10-4-9(b)所示控制流图有4个区域。其环路复杂性为4。它是构成基本路径集的独立路径数的上界。可以据此得到应该设计的测试用例的数目。

3.导出测试用例

利用逻辑覆盖方法生成测试用例,确保基本路径集中每条路径的执行。

白盒测试用例设计方法

1白盒测试用例设计方法 1.1白盒测试简介 白盒测试又称结构测试、逻辑驱动测试或基于程序的测试,一般多发生在单元测试阶段。白盒测试方法主要包括逻辑覆盖法,基本路径法,程序插装等。 这里重点介绍一下常用的基本路径法,对于逻辑覆盖简单介绍一下覆盖准则。 1.2基本路径法 在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出独立路径集合,从而设计测试用例,设计出的测试用例要保证在测试中程序的每一个可执行语句至少执行一次。 在介绍基本路径测试方法(又称独立路径测试)之前,先介绍流图符号: 图1 如图1所示,每一个圆,称为流图的节点,代表一个或多个语句,流程图中的处理方框序列和菱形决策框可映射为一个节点,流图中的箭头,称为边或连接,代表控制流,类似于流程图中的箭头。一条边必须终止于一个节点,即使该节点并不代表任何语句,例如,图2中两个处理方框交汇处是一个节点,边和节点限定的范围称为区域。 图2

任何过程设计表示法都可被翻译成流图,下面显示了一段流程图以及相应的流图。 注意,程序设计中遇到复合条件时(逻辑or, and, nor 等),生成的流图变得更为复杂,如(c)流图所示。此时必须为语句IF a OR b 中的每一个a 和b 创建一个独立的节点。

(c)流图 独立路径是指程序中至少引进一个新的处理语句集合,采用流图的术语,即独立路径必须至少包含一条在定义路径之前不曾用到的边。例如图(b)中所示流图的一个独立路径集合为: 路径1:1-11 路径2:1-2-3-4-5-10-1-11 路径3:1-2-3-6-8-9-10-1-11 路径4:1-2-3-6-7-9-10-1-11 上面定义的路径1,2,3 和4 包含了(b)流图的一个基本集,如果能将测试设计为强迫运行这些路径,那么程序中的每一条语句将至少被执行一次,每一个条件执行时都将分别取true 和false(分支覆盖)。应该注意到基本集并不唯一,实际上,给定的过程设计可派生出任意数量的不同基本集。如何才能知道需要寻找多少条路径呢?可以通过如下三种方法之一来计算独立路径的上界: 1. V=E-N+2,E 是流图中边的数量,N 是流图节点数量。 2. V=P+1,P 是流图中判定节点的数量 3. V=R,R 是流图中区域的数量 例如,(b)流图可以采用上述任意一种算法来计算独立路径的数量 1. V=11 条边-9 个节点+2=4 2. V=3 个判定节点+1=4 3. 流图有4 个区域,所以V=4 由此为了覆盖所有程序语句,必须设计至少4 个测试用例使程序运行于这4 条路径。 在采用基本路径测试方法中,获取测试用例可参考以下方式:

白盒测试方法

一、白盒测试概念 1、定义 白盒测试又称结构测试、透明盒测试、逻辑驱动测试、基于代码的测试。盒子指被测试的软件,白盒指盒子是可视的。白盒测试是一种测试用例设计方法,测试人员依据程序内部逻辑结构相关信息,设计或选择测试用例。白盒测试主要针对被测程序的源代码,主要用于软件验证,不考虑软件的功能实现,只验证内部动作是否按照设计说明书的规定进行。 2、目的 我们一方面注重软件功能需求的实现,另一方面还要注重程序逻辑细节,主要是因为软件自身的缺陷,具体如下: 1)逻辑错误和不正确假设与一条程序路径被运行的可能性成反比。日常处理往往被很好地了解,而“特殊情况”的处理则难于发现。 2)我们经常相信某逻辑路径不可能被执行,而事实上,它可能在正常的基础上被执行。程序的逻辑流有时是违反直觉的,只有路径测试才能发现这些错误。 3)代码中的笔误是随机且无法杜绝的。笔误出现在主流上和不明显的逻辑路径上的机率是一样的。很多被语法检查机制发现,但是其他的会在测试开始时才会被发现。 4)功能测试本身的局限性。如果程序实现了没有被描述的行为,功能测试是无法发现的,例如病毒,而白盒测试很容易发现它。 3、目标 采用白盒测试必须遵循以下几条原则,才能达到测试的目标: 1)保证一个模块中的所有独立路径至少被测试一次。 2)所有逻辑值均需测试真(true) 和假(false)两种情况。 3)检查程序的内部数据结构,保证其结构的有效性。 4)在上下边界及可操作范围内运行所有循环。 4、黑白灰区别 黑盒测试技术:也称功能测试或数据驱动测试,只关注规格说明中的功能,测试者在程序接口对软件界面和软件功能进行测试,它只检查实现了的功能是否按照“用户需求说明书”的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息,并且保持外部信息(如数据库或文件)的完整性。主要用于软件确认测试,结合兼容、性能测试等方面,但黑盒测试不能保证已经实现的各个部分都被测试到。黑盒测试适用于各阶段测试。 白盒测试技术:只关注软件产品的测试,深入到代码一级的测试,它是知道产品内部结构,通过测试来检测产品内部动作是否按照“设计规格说明书”的规定正常进行,按照程

如何编写单元测试用例(白盒测试)

如何编写单元测试用例(白盒测试)。 一、单元测试的概念 单元通俗的说就是指一个实现简单功能的函数。单元测试就是只用一组特定的输入(测试用例)测试函数是否功能正常,并且返回了正确的输出。 测试的覆盖种类 1.语句覆盖:语句覆盖就是设计若干个测试用例,运行被测试程序,使得每一条可执行语句至少执行一次。 2.判定覆盖(也叫分支覆盖):设计若干个测试用例,运行所测程序,使程序中每个判断的取真分支和取假分支至少执行一次。 3.条件覆盖:设计足够的测试用例,运行所测程序,使程序中每个判断的每个条件的每个可能取值至少执行一次。 4.判定——条件覆盖:设计足够的测试用例,运行所测程序,使程序中每个判断的每个条件的每个可能取值至少执行一次,并且每个可能的判断结果也至少执行一次。 5.条件组合测试:设计足够的测试用例,运行所测程序,使程序中每个判断的所有条件取值组合至少执行一次。 6.路径测试:设计足够的测试用例,运行所测程序,要覆盖程序中所有可能的路径。 用例的设计方案主要的有下面几种:条件测试,基本路径测试,循环测试。通过上面的方法可以实现测试用例对程序的逻辑覆盖,和路径覆盖。 二、开始测试前的准备

在开始测试时,要先声明一下,无论你设计多少测试用例,无论你的测试方案多么完美,都不可能完全100%的发现所有BUG,我们所需要做的是用最少的资源,做最多测试检查,寻找一个平衡点保证程序的正确性。穷举测试是不可能的。所以现在进行单元测试我选用的是现在一般用的比较多的基本路径测试法。 三、开始测试 基本路径测试法:设计出的测试用例要保证每一个基本独立路径至少要执行一次。 函数说明:当i_flag=0;返回 i_count+100 当i_flag=1;返回 i_count *10 否则返回 i_count *20 输入参数:int i_count , int i_flag 输出参数: int i_return; 代码: 1int Test(int i_count, int i_flag) 2 {

白盒测试:路径测试及测试用例设计

20 14 —20 15 学年第 2 学期 软件测试技术课程 实验报告 学院:计算机科学技术 专业:软件工程 班级:软件12401 姓名:李晶宇 学号:041240134 任课教师:刘玉宝

实验日期:2015年 6 月16 日实验题目实验5、白盒测试:路径测试及测试用例设计 实验目的1、掌握独立路径,程序基本路径测试的概念。 2、掌握独立路径测试法。 实验内容 程序int binsearch(int array[],int key)实现折半查找的功能。数组array元素按升序排列,length为数组array的长度,key为要查找的值。 试用独立路径集测试法测试该程序,撰写实验报告。 关键代码如下(Java实现) public static int binsearch(int array[],int key) { int low = 0; int high = array.length - 1; int middle; while(low <= high) { middle = (low+high)/2; if(array.[middle] == key) { return middle; }else if(array.[middle] < key) { low = middle +1; }else { high = middle - 1; } } return -1; } 实验步骤: 1)画出程序的流图(控制流程图)。

程序入口(数组元素升序) low <= high (low+high)/2 array[middle] == key Y N array[middle] < key key=middle Y N low=middle+1 high=middle-1 程序出口 2)计算流图G 的圈复杂度V(G)。 封闭区域:○2→○3→○4→○6→○7→○2→○10 ○2→○3→○4→○6→○8→○9→○2→○10 还有一个区域是这两个区域以外的区域,共有三个区域,即独立路径数的上界 是3,V(G)=3。 3)确定只包含独立路径的基本路径集。 V(G)值正好等于该程序的独立路径的条数。 程序的独立路径是: Path1:○1→○2→○3→○4→○5→○10 Path2:○1→○2→○3→○4→○6→○7→○2→○10 Path3:○1→○2→○3→○4→○6→○8→○9→○2→○10 4)根据上面的独立路径,设计测试用例,得到测试用例表。 为了确保基本路径集中的每一条路径的执行,根据判断结点给出的条件,选择适当的数据以保证每一条路径可以被测试到,满足上面例子基本路径集的测试用例表如下: 2 10 1 4 6 5 7 8 9 3

白盒测试用例练习题(1)

白盒测试用例练习 1.为以下所示的程序段设计一组测试用例,要求分别满足语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖和路径覆盖,并画出相应的程序流程图。 void DoWork (int x,int y,int z) { int k=0,j=0; if ( (x>3)&&(z<10) ) { k=x*y-1; j=sqrt(k); //语句块1 } if ( (x==4)||(y>5) ) { j=x*y+10; } //语句块2 j=j%3; //语句块3 } a Y c N b e Y N d x>3 and z<10 x=4 or y>5 j=j%3 j=x*y+10 k=x*y-1 j=sqrt(k) k=0 j=0

由这个流程图可以看出,该程序模块有4条不同的路径: P1:(a-c-e) P2:(a-c-d) P3:(a-b-e) P4:(a-b-d) 将里面的判定条件和过程记录如下: 判定条件M={x>3 and z<10} 判定条件N={x=4 or y>5} 1、语句覆盖 测试用例输入输出判定M的取值判定N的取值覆盖路径x=4,z=5,y=8 k=31,j=0 T T P1(a-c-e) 2、判定覆盖 p1和p4可以作为测试用例,其中p1作为取真的路径,p4作为取反的路径。 测试用例输入输出判定M的取值判定N的取值覆盖路径x=4,z=5,y=8 k=31,j=0 T T P1(a-c-e) x=2,z=11,y=5 k=0,j=0 F F P4(a-b-d) 也可以让测试用例测试路径P2和P3。相应的两组输入数据如下: 测试用例输入输出判定M的取值判定N的取值覆盖路径x=5,z=5,y=4 k=19,j=sqrt(19)%3 T F P2(a-c-d) x=4,z=11,y=6 k=0,j=1 F T P3(a-b-e) 3、条件覆盖 对于M:x>3取真时T1,取假时F1; z<10取真时T2,取假时F2; 对于N:x=4取真时T3,取假时F3; y>5取真时T4,取假时F4。 条件:x>3,z<10,x=4,y>5 条件:x<=3,z>=10,x!=4,y<=5 根据条件覆盖的基本思路,和这8个条件取值,组合测试用例如表所示: 测试用例输入输出取值条件具体取值条件覆盖路径x=4,z=5,y=8 k=31, j=0 T1,T2,T3,T4 x>3,z<10,x=4,y>5 P1(a-c-e) x=3,z=11,y=5 k=0, j=0 F1,F2,F3,F4 x<=3,z>=10,x!=4,y<=5 P4(a-b-d) 4、判定/条件覆盖 测试用例输入输出取值条件具体取值条件覆盖路径x=4,z=5,y=8 k=31, j=0 T1,T2,T3,T4 x>3,z<10,x=4,y>5 P1(a-c-e) x=3,z=11,y=5 k=0, j=0 F1,F2,F3,F4 x<=3,z>=10,x!=4,y<=5 P4(a-b-d)

白盒测试及用例设计

白盒测试 白盒测试(White-box Testing,又称逻辑驱动测试,结构测试) 是把测试对象看作一个打开的盒子。利用白盒测试法进行动态测试时,需要测试软件产品的内部结构和处理过程,不需测试软件产品的功能。白盒测试又称为结构测试和逻辑驱动测试。 白盒测试法的覆盖标准有逻辑覆盖、循环覆盖和基本路径测试。其中逻辑覆盖包括语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖。 六种覆盖标准:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖发现错误的能力呈由弱至强的变化。语句覆盖每条语句至少执行一次。判定覆盖每个判定的每个分支至少执行一次。条件覆盖每个判定的每个条件应取到各种可能的值。判定/条件覆盖同时满足判定覆盖条件覆盖。条件组合覆盖每个判定中各条件的每一种组合至少出现一次。路径覆盖使程序中每一条可能的路径至少执行一次。 白盒测试也称结构测试或逻辑驱动测试,它是知道产品内部工作过程,可通过测试来检测产品内部动作是否按照规格说明书的规定正常进行,按照程序内部的结构测试程序,检验程序中的每条通路是否都有能按预定要求正确工作,而不顾它的功能,白盒测试的主要方法有逻辑驱动、基路测试等,主要用于软件验证。 "白盒"法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。"白盒"法是穷举路径测试。在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。贯穿程序的独立路径数是天文数字。但即使每条路径都测试了仍然可能有错误。第一,穷举路径测试决不能查出程序违反了设计规范,即程序本身是个错误的程序。第二,穷举路径测试不可能查出程序中因遗漏路径而出错。第三,穷举路径测试可能发现不了一些与数据相关的错误。

软件测试中如何编写单元测试用例(白盒测试)

软件测试中如何编写单元测试用例(白盒测试) 测试用例(T est Case)是为某个特殊目标而编制的一组测试输入、执行条件以及预期结果,以便测试某个程序路径或核实是否满足某个特定需求。 测试用例(T est Case)目前没有经典的定义。比较通常的说法是:指对一项特定的软件产品进行测试任务的描述,体现测试方案、方法、技术和策略。内容包括测试目标、测试环境、输入数据、测试步骤、预期结果、测试脚本等,并形成文档。 不同类别的软件,测试用例是不同的。不同于诸如系统、工具、控制、游戏软件,管理软件的用户需求更加不统一,变化更大、更快。笔者主要从事企业管理软件的测试。因此我们的做法是把测试数据和测试脚本从测试用例中划分出来。测试用例更趋于是针对软件产品的功能、业务规则和业务处理所设计的测试方案。对软件的每个特定功能或运行操作路径的测试构成了一个个测试用例。 随着中国软件业的日益壮大和逐步走向成熟,软件测试也在不断发展。从最初的由软件编程人员兼职测试到软件公司组建独立专职测试部门。测试工作也从简单测试演变为包括:编制测试计划、编写测试用例、准备测试数据、编写测试脚本、实施测试、测试评估等多项内容的正规测试。测试方式则由单纯手工测试发展为手工、自动兼之,并有向第三方专业测试公司发展的趋势。 要使最终用户对软件感到满意,最有力的举措就是对最终用户的期望加以明确阐述,以便对这些期望进行核实并确认其有效性。测试用例反映了要核实的需求。然而,核实这些需求可能通过不同的方式并由不同的测试员来实施。例如,执行软件以便验证它的功能和性能,这项操作可能由某个测试员采用自动测试技术来实现;计算机系统的关机步骤可通过手工测试和观察来完成;不过,市场占有率和销售数据(以及产品需求),只能通过评测产品和竞争销售数据来完成。 既然可能无法(或不必负责)核实所有的需求,那么是否能为测试挑选最适合或最关键的需求则关系到项目的成败。选中要核实的需求将是对成本、风险和对该需求进行核实的必要性这三者权衡考虑的结果。 确定测试用例之所以很重要,原因有以下几方面。 测试用例构成了设计和制定测试过程的基础。测试的“深度”与测试用例的数量成比例。由于每个测试用例反映不同的场景、条件或经由产品的事件流,因而,随着测试用例数量的增加,您对产品质量和测试流程也就越有信心。判断测试是否完全的一个主要评测方法是基于需求的覆盖,而这又是以确定、实施和/或执行的测试用例的数量为依据的。类似下面这样的说明:“95 % 的关键测试用例已得以执行和验证”,远比“我们已完成95 % 的测试”更有意义。测试工作量与测试用例的数量成比例。根据全面且细化的测试用例,可以更准确地估计测试周期各连续阶段的时间安排。测试设计和开发的类型以及所需的资源主要都受控于测试用例。测试用例通常根据它们所关联关系的测试类型或测试需求来分类,而且将随类型和需求进行相应地改变。最佳方案是为每个测试需求至少编制两个测试用例:·一个测试用例用于证明该需求已经满足,通常称作正面测试用例;·另一个测试用例反映某个无法接受、反常或意外的条件或数据,用于论证只有在所需条件下才能够满足该需求,这个测试用例称作负面测试用例。 前段时间公司进行有关测试的培训,集成测试,性能测试,压力测试说了很多。由于本人还处于Coder阶段,只是对单元测试有了些了解。写下来怕以后自己忘记了。都是些自己的看法,不一定准确,欢迎高手指教。 一、单元测试的概念 单元通俗的说就是指一个实现简单功能的函数。单元测试就是只用一组特定的输入(测试用

常见的测试用例设计方法都有哪些

常见的测试用例设计方法都有哪些 常见的测试用例设计方法都有哪些? 请分别以具体的例子来说明这些方 法在测试用例设计工作中的应用。 1. 等价类划分常见的软件测试面试题划分等价类: 等价类是指某个输入域的子集合.在该子集合中,各个输入数据对于揭露程序中的错误都是等效的.并 合理地假定:测试某等价类的代表值就等于对这一类其它值的测试.因此,可以把全部输入数据合理划分为若干等价类,在每一个等价类中取一个数据作为测试的输入条件,就可以用少量代表性的测试数据.取得较好的测试结果.等价类划分可有两种不同的情况:有效等价类和无效等价类. 2. 边界值分析法边界值分析方法是对等价类划 分方法的补充。测试工作经验告诉我,大量的错误是发生在输入或输出范围的边界上,而不是发生在输入

输出范围的内部.因此针对各种边界情况设计测试用例,可以查出更多的错误. 使用边界值分析方法设计测试用例,首先应确定边界情况.通常输入和输出等价类的边界,就是应着重测试的边界情况.应当选取正好等于,刚刚大于或刚刚小于边界的值作为测试数据,而不是选取等价类中的典型值或任意值作为测试数据. 3. 错误推测法基于经验和直觉推测程序中所有可能存在的各种错误, 从而有针对性的设计测试用例的方法. 错误推测方法的基本思想: 列举出程序中所有可能有的错误和容易发生错误的特殊情况根据他们选择测试用例. 例如, 在单元测试时曾列出的许多在模块中常见的错误. 以前产品测试中曾经发现的错误等, 这些就是经验的总结。还有, 输入数据和输出数据为0 的情况。输入表格为空格或输入表格只有一行. 这些都是容易发生错误的情况。可选择这些情况下的例子作为测试用例. 4. 因果图方法前面介绍的等价类划分方法和边界值分析方法,都是着重考虑输入条件,但未考虑输入条件之间的联系, 相互组合等. 考虑输入条件之间的相互组合,可能会产生一些新的情况. 但要检查

软件白盒测试计划

XXXXXXXXXXXXXXXXXXXXXXXX 白盒测试 实验名称:白盒测试 班级:计算机071 学号: 姓名: 实验日期:2010.9.30

1、测试计划标识符 测试计划版本:Version2.1 测试等级:SSS 测试软件版本:Enterprise 2、简要介绍 产品规格:制造商:Team HEY,软件版本号:Version2.1。软件的运行平台:Windows XP,Windows Vista,Windows 7。应用领域:教学测试,学生实验。 软件的特点是:简单,实用,占用系统资源少。 主要功能模块的特点:模块之间聚合度不高,结构简单易懂。

3、测试项目 功能测试:测试覆盖所有的功能项。 设计测试:用户界面,菜单结构,窗体设计等是否合理。 整体测试:测试数据从软件中的一个模块流到另一个模块的过程中的准确与否。 4、测试对象 以用户身份登录并查看并检测该软件的界面,实现功能。 5、不需要测试的对象 不测试的对象:在网络不稳定时是否能顺利完成软件下载。 原因:环境条件不足。 6、测试方法 1、语句覆盖 1)主要特点:语句覆盖是最起码的结构覆盖要求,语句覆盖要求设计足够多的测试用例,使得程序中每条语句至少被执行一次。 2)用例设计:(如果此时将A路径上的语句1—〉T去掉,那么用例如下)

3)优点:可以很直观地从源代码得到测试用例,无须细分每条判定表达式。 4)缺点:由于这种测试方法仅仅针对程序逻辑中显式存在的语句,但对于隐藏的条件和可能到达的隐式逻辑分支,是无法测试的。在本例中去掉了语句1—〉T去掉,那么就少了一条测试路径。在if 结构中若源代码没有给出else后面的执行分支,那么语句覆盖测试就不会考虑这种情况。但是我们不能排除这种以外的分支不会被执行,而往往这种错误会经常出现。再如,在Do-While结构中,语句覆盖执行其中某一个条件分支。那么显然,语句覆盖对于多分支的逻辑运算是无法全面反映的,它只在乎运行一次,而不考虑其他情况。 2、判定覆盖 1)主要特点:判定覆盖又称为分支覆盖,它要求设计足够多的测试用例,使得程序中每个判定至少有一次为真值,有一次为假值,即:程序中的每个分支至少执行一次。每个判断的取真、取假至少执行一次。 2)用例设计:

2020年白盒测试用例设计方法.doc

白盒测试用例设计方法白盒测试概述由于逻辑错误和不正确假设与一条程序路径被运行的可能性成反比。由于我们经常相信某逻辑路径不可能被执行,而事实上,它可能在正常的情况下被执行。由于代码中的笔误是随机且无法杜绝的,因此我们要进行白盒测试。 白盒测试又称结构测试,透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试是一种测试用例设计方法,盒子指的是被测试的软件,白盒指的是盒子是可视的,你清楚盒子内部的东西以及里面是如何运作的。 白盒的测试用例需要做到保证一个模块中的所有独立路径至少被使用一次; 对所有逻辑值均需测试 true 和 false; 在上下边界及可操作范围内运行所有循环; 检查内部数据结构以确保其有效性。 白盒测试的目的通过检查软件内部的逻辑结构,对软件中的逻辑路径进行覆盖测试; 在程序不同地方设立检查点,检查程序的状态,以确定实际运行状态与预期状态是否一致。 白盒测试的特点依据软件设计说明书进行测试、对程序内部细节的严密检验、针对特定条件设计测试用例、对软件的逻辑路径进行覆盖测试。 白盒测试的实施步骤 1)测试计划阶段根据需求说明书,制定测试进度。 2)测试设计阶段依据程序设计说明书,按照一定规范化的方法进行软件结构划分和设计测试用例。 3)测试执行阶段输入测试用例,得到测试结果。 4)测试总结阶段对比测试的结果和代码的预期结果,分析错误原因,找到并解决错误。 白盒测试的方法总体上分为静态方法和动态方法两大类。 静态分析是一种不通过执行程序而进行测试的技术。静态分析的关键功能是检查软件的表示和描述是否一致,没有冲突或者没有歧义。 动态分析主要特点是当软件系统在模拟的或真实的环境中执行之前、之中和之后 , 对软件系统行为的分析。动态分析包含了程序在受控的环境下使用特定的期望结果进行正式的运行。它显示了一个系统在检查状态下是正确还是不正确。在动态分析技术中,最重要的技术是路径和分支测试。下面要介绍的六种覆盖测试方法属于动态分析方法。 白盒测试的优缺点优点迫使测试人员去仔细思考软件的实现;

白盒测试用例设计方法

1.白盒测试用例设计方法 1.1. 白盒测试概述 由于逻辑错误和不正确假设与一条程序路径被运行的可能性成反比。由于我们经常相信某逻辑路径不可能被执行,而事实上,它可能在正常的情况下被执行。由于代码中的笔误是随机且无法杜绝的,因此我们要进行白盒测试。 白盒测试又称结构测试,透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试是一种测试用例设计方法,盒子指的是被测试的软件,白盒指的是盒子是可视的,你清楚盒子部的东西以及里面是如何运作的。 1.白盒的测试用例需要做到 ?保证一个模块中的所有独立路径至少被使用一次; ?对所有逻辑值均需测试true 和false; ?在上下边界及可操作围运行所有循环; ?检查部数据结构以确保其有效性。 2.白盒测试的目的 通过检查软件部的逻辑结构,对软件中的逻辑路径进行覆盖测试;在程序不同地方设立检查点,检查程序的状态,以确定实际运行状态与预期状态是否一致。 3.白盒测试的特点 依据软件设计说明书进行测试、对程序部细节的严密检验、针对特定条件设计测试用例、对软件的逻辑路径进行覆盖测试。 4.白盒测试的实施步骤 1)测试计划阶段:根据需求说明书,制定测试进度。 2)测试设计阶段:依据程序设计说明书,按照一定规化的方法进行软件结构划分和设计测试用例。 3)测试执行阶段:输入测试用例,得到测试结果。 4)测试总结阶段:对比测试的结果和代码的预期结果,分析错误原因,找到并解决错误。 5.白盒测试的方法

总体上分为静态方法和动态方法两大类。 ?静态分析:是一种不通过执行程序而进行测试的技术。静态分析的关键功能是检查软件的表示和描述是否一致,没有冲突或者没有歧义。 ?动态分析:主要特点是当软件系统在模拟的或真实的环境中执行之前、之中和之后, 对软件系统行为的分析。动态分析包含了程序在受控的环 境下使用特定的期望结果进行正式的运行。它显示了一个系统在检查状 态下是正确还是不正确。在动态分析技术中,最重要的技术是路径和分支 测试。下面要介绍的六种覆盖测试方法属于动态分析方法。 6.白盒测试的优缺点 ?优点:迫使测试人员去仔细思考软件的实现;可以检测代码中的每条分支和路径;揭示隐藏在代码中的错误;对代码的测试比较彻底; 最优化 ?缺点:费用昂贵;无法检测代码中遗漏的路径和数据敏感性错误; 不验证规格的正确性。 1.2. 白盒测试基本技术 1.2.1.控制流图 1.2.1.1.定义 程序流程图是软件开发过程中进行详细设计时,表示模块部逻辑的一个常用的、也非常有效的图示法。程序流程图详细地反映了程序部控制流的处理和转移过程,它一般是进行模块编码的参考依据。在程序流程图中,通常拥有很多种图示元素,例如,“矩形框”表示一个计算处理过程,而“菱形框”表示一个判断条件等。通常测试人员为某个程序模块做白盒测试过程中,在做与路径相关的各种分析的时候,这些非常细节的信息往往是不太重要。因此,为了更清晰突出地显示出程序的控制结构,反映控制流的转移过程,一种简化了的程序流程图便出现了,就是程序的控制流图。在控制流图中一般只有两种简单的图示符号:节点和控制流。

软件测试-白盒测试用例练习题

白盒测试用例练习 一、为以下所示的程序段设计一组测试用例,要求分别满足语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖和路径覆盖,并画出相应的程序流程图。 void DoWork (int x,i nt y,i nt z) { int k=O,j=O; if ( (x>3)&&(z<10)) { k=x*y-1; j=sqrt(k); // 语句块1 } if ( (x==4)||(y>5)) { j=x*y+1O; } 〃语句块2 j=j%3; //语句块3 }

由这个流程图可以看出,该程序模块有4条不同的路径: P1:(a-c-e) P2:(a-c-d) P3:(a-b-e) P4:(a-b-d) 将里面的判定条件和过程记录如下: 判定条件M = {x>3 and z<10} 判定条件N={x=4 or y>5} 1 2、判定覆盖 3、条件覆盖 对于M: x>3取真时T1,取假时F1; z<10取真时T2,取假时F2; 对于N : x=4取真时T3,取假时F3; y>5取真时T4,取假时F4。 条件:x>3,z<10,x=4,y>5 条件:x<=3,z>=10,x!=4,y<=5

5条件组合 6 二、冒泡法排序: #in clude main () { int i,j,temp; int a[10]; for(i=0;i<10;i++) sca nf ("%d,",&a[i]); for(j=0;j<=9;j++) { for (i=0;i<10-j;i++) if (a[i]>a[i+1]) { temp=a[i]; a[i]=a[i+1]; 1)x>3,z<10 3) x<=3,z<10 5)x=4,y>5 2)x>3,z>=10 4)x<=3,z>=10 6)x=4,y<=5

实验5、白盒测试:覆盖测试及测试用例设计

实验5、白盒测试:覆盖测试及测试用例设计 一、实验目的 1、掌握白盒测试的概念。 2、掌握逻辑覆盖法。 二、实验任务 以下三个任务、至少完成一个 1、某工资计算程序功能如下:若雇员月工作小时超过40小时,则超过部分按原小时工资的1.5倍的加班工资来计算。若雇员月工作小时超过50小时,则超过50的部分按原小时工资的3倍的加班工资来计算,而40到50小时的工资仍按照原小时工资的1.5倍的加班工资来计算。程序输入为:雇员月工作时间及小时工资,输出为工资。 运用逻辑覆盖法的判定覆盖标准设计测试用例,并执行测试,撰写实验报告。 实验步骤: 1)画出程序流程图 #include float salary_compute(int time, float unit_pay); void main() { int time=0; float unit_pay=50; float salary=0; time=20; salary=salary_compute(time, unit_pay); printf("月薪为:%f\n",salary); } float salary_compute(int time, float unit_pay) { float salary=0.0; ①if (time >= 50 ) { ②salary = unit_pay * 40 + 3 * unit_pay * (time - 50);

} ③else if (time >= 40 ) { ④salary = unit_pay * 40 + 1.5 * unit_pay * (time - 40); } ⑤else if(time >=0) { ⑥salary = unit_pay * time; } ⑦else { ⑧salary = unit_pay * time;//printf("输入的工作时间有误!"); } ⑨return salary; ⑩} 控制流图

白盒测试方法设计思路

请帮我针对下面小段程序用三种白盒测试方法设计测试用例 Int IsLeap(int year) { if (year % 4 == 0) { if (year % 100 == 0) { if (year % 400 ==0) leap = 1; else leap = 0; } else leap = 1; } else leap = 0; return leap; } 纯粹从白盒角度来设计用例,是方向性的错误,这是缺少实践的书本和专家的误导。这叫跟着代码走,费力不讨好。 程序中的错误,根据产生原因可分为两类:代码错误和代码缺失。代码缺失是程序员未考虑到某些输入,未编写对应代码形成的。白盒覆盖基于现有代码,无法发现这种错误。那么,白盒覆盖是否能发现前一种错误?未必!用例必须根据程序功能设定正确的预期输出,否则再高的白盒覆盖也没有意义。也就是说,程序的设计功能是用例设计工作中绕不过去的,是一切的基础。既然如此,为什么要纯粹从白盒角度来设计用例?我认为,类似基路径法之类的纯白盒方法都是应该抛弃的,效率低下不说,既不能发现代码缺失错误,也容易造成忽略程序设计功能这个测试的根本依据。 白盒方法的价值在于衡量对既有代码的测试完整性,也可以根据白盒覆盖找出遗漏的用例,这些价值也是建立在用例是基于功能来设计、设定了必要的预期输出的基础上的。 所以,正确的方法应该是:首先根据功能来设计用例,并将数据集中起来,从“有哪些正常输入?有哪些边界输入?有哪些非法输入”三个角度检查完整性,这样可以有效发现代码缺失错误。然后,再统计白盒覆盖,根据未覆盖的逻辑单位,找出遗漏用例,实现高覆盖,新加的用例也要根据设计功能设定必要的预期输出。这样做,即避免了掉入“跟着代码走”的陷阱,白盒方法也不用起头做起,效率高得多。 下面我就楼主提供的代码演示一下: 首先根据设计功能:计算某一年是否为润年,设计了几个用例:

白盒测试用例练习题

白盒测试实验一 1.为以下所示的程序段设计一组测试用例,要求分别满足语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖和路径覆盖,并画出相应的程序流程图。 void DoWork (int x,int y,int z) { int k=0,j=0; if ( (x>3)&&(z<10) ) { k=x*y-1; j=sqrt(k); //语句块1 } if ( (x==4)||(y>5) ) { j=x*y+10; } //语句块2 j=j%3; //语句块3 } a Y c N b e Y N d x>3 and z<10 x=4 or y>5 j=j%3 j=x*y+10 k=x*y-1 j=sqrt(k) k=0 j=0

由这个流程图可以看出,该程序模块有4条不同的路径: P1:(a-c-e) P2:(a-c-d) P3:(a-b-e) P4:(a-b-d) 将里面的判定条件和过程记录如下: 判定条件M={x>3 and z<10} 判定条件N={x=4 or y>5} 1、语句覆盖 测试用例输入输出判定M的取值判定N的取值覆盖路径 2、判定覆盖 p1和p4可以作为测试用例,其中p1作为取真的路径,p4作为取反的路径。 测试用例输入输出判定M的取值判定N的取值覆盖路径 也可以让测试用例测试路径P2和P3。相应的两组输入数据如下: 测试用例输入输出判定M的取值判定N的取值覆盖路径 3、条件覆盖 对于M:x>3取真时T1,取假时F1; z<10取真时T2,取假时F2; 对于N:x=4取真时T3,取假时F3; y>5取真时T4,取假时F4。 条件:x>3,z<10,x=4,y>5 条件:x<=3,z>=10,x!=4,y<=5 根据条件覆盖的基本思路,和这8个条件取值,组合测试用例如表所示: 测试用例输入输出取值条件具体取值条件覆盖路径 4、判定/条件覆盖 测试用例输入输出取值条件具体取值条件覆盖路径

白盒测试练习及问题详解

1、在白盒测试用例设计中,有语句覆盖、分支覆盖、条件覆盖、路径覆盖等,其中( A )是最强的覆盖准则。为了对如下图所示的程序段进行覆盖测试,必须适当地选取测试用例组。若x, y是两个变量,可供选择的测试用例组共有Ⅰ、Ⅱ、Ⅲ、Ⅳ四组,如表中给出,则实现判定覆盖至少应采取的测试用例组是( B )或( C );实现条件覆盖至少应采取的测试用例组是( D );实现路径覆盖至少应采取的测试用例组是( E )或( F )。 供选择的答案 A:①语句覆盖②条件覆盖③判定覆盖④路径覆盖 B~F:①Ⅰ和Ⅱ组②Ⅱ和Ⅲ组③Ⅲ和Ⅳ组④Ⅰ和Ⅳ组 ⑤Ⅰ、Ⅱ、Ⅲ组⑥Ⅱ、Ⅲ、Ⅳ组⑦Ⅰ、Ⅲ、Ⅳ组 ⑧Ⅰ、Ⅱ、Ⅳ组 解答:A. ④ B. ⑤ C. ⑧ D. ④ E. ⑤ F. ⑧ 2. 阅读下面这段程序,使用逻辑覆盖法进行测试,请问哪一组关于(a,b,c)的输入值可以达到条件覆盖。( B ) int func(int a,b,c) { int k=1; if ( (a>0) || (b<0) || (a+c>0) ) k=k+a; else k=k+b; if (c>0) k=k+c; return k; } A. (a,b,c) = (3,6,1)、(-4,-5,7) B. (a,b,c) = (2,5,8)、(-4,-9,-5)

C. (a,b,c) = (6,8,-2)、(1,5,4) D. (a,b,c) = (4,9,-2)、(-4,8,3) 3. 阅读下面这段程序,使用逻辑覆盖法进行测试,请问哪一组关于(a,b,c)的输入值可以达到判定覆盖。(D ) int func(int a,b,c) { int k=1; if ( (a>0) &&(b<0) && (a+c>0) ) k=k+a; else k=k+b; if (c>0) k=k+c; return k; } A. (a,b,c) = (3,6,1)、(-4,-5,7) B. (a,b,c) = (2,5,8)、(-4,-9,-5) C. (a,b,c) = (6,8,-2)、(1,5,4) D. (a,b,c) = (4,-9,-2)、(-4,8,3) 4. 阅读下面这段程序,使用逻辑覆盖法进行测试,请问哪一组关于(a,b,c)的输入值可以达到判定条件覆盖。(B ) int func(int a,b,c) { int k=1; if ( (a>0) || (b<0) || (a+c>0) ) k=k+a; else k=k+b; if (c>0) k=k+c; return k; } A. (a,b,c) = (3,6,1)、(-4,-5,7) B. (a,b,c) = (2,-5,8)、(-4,9,-5) C. (a,b,c) = (6,8,-2)、(1,5,4) D. (a,b,c) = (4,9,-2)、(-4,8,3) 5、下面是一段求最大值的程序,其中datalist是数据表,n是datalist的长度。 int GetMax(int n, int datalist[ ]) {

实训 白盒测试用例设计

实训白盒测试用例设计实训 1、实训目的 1、掌握白盒测试用例的设计方法。 2、综合运用所学的白盒测试方法设计测试用例。 2、实训准备 1、白盒测试用例的设计方法。 2、测试用例模板。 3、实训内容 3.1基本训练 实验一:下面是快速排序算法中的一趟划分算法,其中datalist是数据表,它有两个数据成员:一是元素类型为Element的数组V,另一个是数组大小n。算法中用到两个操作,一是取某数组元素V[i]的关键码操作getKey( ),一是交换两数组元素内容的操作Swap( ): int Partition ( datalist &list, int low, int high ) { //在区间[ low, high ]以第一个对象为基准进行一次划分,k返回基准对象回放位置。 int k = low; if ( list.V[i].getKey ( ) < pivot.getKey( ) && ++ k != i ) } (1)试画出它的程序流程图; (2)试利用路径覆盖方法为它设计足够的测试用例(循环次数限定为0次,1次和2次)。 实验二:下面是选择排序的程序,其中datalist是数据表,它有两个数据成员:一是元素类型为Element的数组V,另一个是数组大小n。算法中用到两个操作,一是取某数组元素V[ i]的关键码操作getKey ( ),一是交换两数组元素内容的操作Swap( ): void SelectSort ( datalist & list ) { //对表list.V[0]到list.V[n-1]进行排序,n是表当前长度。 for ( int i = 0; i < list.n-1; i++ ) { int k = i; //在list.V[i].key到list.V[n-1].key中找具有最小关键码的对象

实训白盒测试用例设计实训

实训白盒测试用例设计实训 一、实训目的 1) 掌握白盒测试用例的设计方法。 2) 综合运用所学的白盒测试方法设计测试用例。 二、实训准备 1) 白盒测试用例的设计方法。 2) 测试用例模板。 三、实训内容 3.1基本训练 实验一:下面是快速排序算法中的一趟划分算法,其中datalist是数据表,它有两个数据成员:一是元素类型为Element的数组V,另一个是数组大小n。算法中用到两个操作,一是取某数组元素V[i]的关键码操作getKey( ),一是交换两数组元素内容的操作Swap( ): int Partition ( datalist &list, int low, int high ) { //在区间[ low, high ]以第一个对象为基准进行一次划分,k返回基准对象回放位置。 int k = low; Element pivot = list.V[low]; //基准对象 for ( int i = low+1; i <= high; i++ ) //检测整个序列,进行划分 if ( list.V[i].getKey ( ) < pivot.getKey( ) && ++ k != i ) Swap ( list.V[k], list.V[i] );//小于基准的交换到左侧去 Swap ( list.V[low], list.V[k] );//将基准对象就位 return k; //返回基准对象位置 } (1)试画出它的程序流程图; (2)试利用路径覆盖方法为它设计足够的测试用例(循环次数限定为0次,1次和2次)。 实验二:下面是选择排序的程序,其中datalist是数据表,它有两个数据成员:一是元素类型为Element的数组V,另一个是数组大小n。算法中用到两个操作,一是取某数组元素V[i]的关键码操作getKey ( ),一是交换两数组元素内容的操作Swap( ): void SelectSort ( datalist & list ) { //对表list.V[0]到list.V[n-1]进行排序, n是表当前长度。

白盒测试用例

第七次作业 白盒测试用例 1.如下所示的程序段设计一组测试用例,要求分别满足语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖和路径覆盖,并画出相应的程序流程图。 void DoWork (int x,int y,int z) { int k=0,j=0; if ( (x>3)&&(z<10) ) { k=x*y-1; j=sqrt(k); //语句块1 } if ( (x==4)||(y>5) ) { j=x*y+10; } //语句块2 j=j%3; //语句块3 } 完整程序: #include #include using namespace std; void DoWork (int x,int y,int z) { int k=0,j=0; if ( (x>3)&&(z<10) ) { k=x*y-1; j=int(sqrt(double(k))); //语句块 } if ( (x==4)||(y>5) ) { j=x*y+10; } //语句块 j=j%3; cout<<"j="<

return 0; } 一、分析问题 1.画出流程图(算法流程图) 2.找出路径(p1代表第1条路径,依此类推)P1:(a-c-e) P2:(a-c-d) P3:(a-b-e) P4:(a-b-d) 3.找出判定条件(用大写字母表示,M,N……) M:x>3&&z<10 N:(x==4)||(y>5) 二、解决步骤

相关文档
最新文档