欢迎光临! 1、引言 欢迎光临!eSt3atestingsfwtrEgd 测试设计遵循与软件设计相同的工程原则。好的软件设计包含几个对测试设计进行精心 欢迎光临!eSt3atestingsfwtrEgd 描述的阶段。这些阶段是: 欢迎光临!eSt3atestingsfwtrEgd 测试策略 欢迎光临!eSt3atestingsfwtrEgd 测试计划 欢迎光临!eSt3atestingsfwtrEgd 测试描述 欢迎光临!eSt3atestingsfwtrEgd 测试过程 欢迎光临!eSt3atestingsfwtrEgd 上述四个测试设计阶段适用于从单元测试到系统测试各个层面的测试。 欢迎光临!eSt3atestingsfwtrEgd 测试设计由软件设计说明所驱动。单元测试用于验证模块单元实现了模块设计中定义的 欢迎光临!eSt3atestingsfwtrEgd 规格。一个完整的单元测试说明应该包含正面测试(Positive Testing)和负面的测试 欢迎光临!eSt3atestingsfwtrEgd (Negative Testing)。正面测试验证程序应该执行的工作,负面测试验证程序不应该执行 欢迎光临!eSt3atestingsfwtrEgd 的工作。 欢迎光临!eSt3atestingsfwtrEgd 设计富有创造性的测试用例是测试设计的关键。本文档介绍了测试说明的一般设计过 欢迎光临!eSt3atestingsfwtrEgd 程,描述了一些结构化程序设计单元测试中采用的用例设计技术,同时也增加了面向对象编 欢迎光临!eSt3atestingsfwtrEgd 程中对类进行单元测试所采用的测试用例设计技术,这些可作为软件测试人员的参考阅读资 欢迎光临!eSt3atestingsfwtrEgd 料。 欢迎光临!eSt3atestingsfwtrEgd
测试用例设计步骤
欢迎光临!eSt3atestingsfwtrEgd 2.1.1 步骤1:首先使被测单元运行 欢迎光临!eSt3atestingsfwtrEgd 任何单元测试说明的第一个测试用例应该是以一种可能的简单方法执行被测单元。看到 欢迎光临!eSt3atestingsfwtrEgd 被测单元第一个测试用例的运行成功可用增强人的自信心。如果不能正确执行,最好选择一 欢迎光临!eSt3atestingsfwtrEgd 个尽可能简单的输入对被测单元进行测试/调试。 欢迎光临!eSt3atestingsfwtrEgd 这个阶段适合的技术有: 欢迎光临!eSt3atestingsfwtrEgd 模块设计导出的测试 欢迎光临!eSt3atestingsfwtrEgd 对等区间划分 欢迎光临!eSt3atestingsfwtrEgd 2.1.2 步骤2:正面测试(Positive Testing) 欢迎光临!eSt3atestingsfwtrEgd 正面测试的测试用例用于验证被测单元能够执行应该完成的工作。测试设计者应该查阅 欢迎光临!eSt3atestingsfwtrEgd 相关的设计说明;每个测试用例应该测试模块设计说明中一项或多项陈述。如果涉及多个设 欢迎光临!eSt3atestingsfwtrEgd 计说明,最好使测试用例的序列对应一个模块单元的主设计说明。 欢迎光临!eSt3atestingsfwtrEgd 适合的技术: 欢迎光临!eSt3atestingsfwtrEgd 设计说明导出的测试 欢迎光临!eSt3atestingsfwtrEgd 对等区间划分 欢迎光临!eSt3atestingsfwtrEgd 状态转换测试 欢迎光临!eSt3atestingsfwtrEgd 2.1.3 步骤3:负面测试(Negative Testing) 欢迎光临!eSt3atestingsfwtrEgd 负面测试用于验证软件不执行其不应该完成的工作。这一步骤主要依赖于错误猜测,需 欢迎光临!eSt3atestingsfwtrEgd 要依靠测试设计者的经验判断可能出现问题的位置。 欢迎光临!eSt3atestingsfwtrEgd 适合的技术有: 欢迎光临!eSt3atestingsfwtrEgd 错误猜测 欢迎光临!eSt3atestingsfwtrEgd 边界值分析 欢迎光临!eSt3atestingsfwtrEgd 内部边界值测试 欢迎光临!eSt3atestingsfwtrEgd 状态转换测试 欢迎光临!eSt3atestingsfwtrEgd 2.1.4 步骤4:设计需求中其它测试特性用例设计 欢迎光临!eSt3atestingsfwtrEgd 如果需要,应该针对性能、余量、安全需要、保密需求等设计测试用例。 欢迎光临!eSt3atestingsfwtrEgd 在有安全保密需求的情况下,重视安全保密分析和验证是方便的。针对安全保密问题的 欢迎光临!eSt3atestingsfwtrEgd 测试用例应该在测试说明中进行标注。同时应该加入更多的测试用例测试所有的保密和安全 欢迎光临!eSt3atestingsfwtrEgd 冒险问题。 欢迎光临!eSt3atestingsfwtrEgd 适合的技术: 欢迎光临!eSt3atestingsfwtrEgd 设计说明导出的测试
2.2 用例设计的一般原则 欢迎光临!eSt3atestingsfwtrEgd 注意到前面产生测试说明步骤可以用下面的方法完成:通常应该避免依赖先前测试用例的输出,测试用例的执行序列早期发现的错误可能 欢迎光临!eSt3atestingsfwtrEgd 导致其他的错误而减少测试执行时实际测试的代码量;测试用例设计过程中,包括作为试验执行这些测试用例时,常常可以在软件构建前 欢迎光临!eSt3atestingsfwtrEgd 就发现BUG。还有可能在测试设计阶段比测试执行阶段发现更多的BUG。在整个单元测试设计中,主要的输入应该是被测单元的设计文档。在某些情况下,需要将试验实际代码作为测试设计过程的输入,测试设计者必须意识到不是在测试代码本身。从代码构建出来的测试说明只能证明代码执行代码完成的工作,而不是代码应该完成的工作。
3、测试用例设计技术
欢迎光临!eSt3atestingsfwtrEgd 广义地分为两类: 欢迎光临!eSt3atestingsfwtrEgd 黑盒测试:使用单元接口和功能描述,不需了解被测单元的内部结构 欢迎光临!eSt3atestingsfwtrEgd 白盒测试:使用被测单元内部如何工作的信息 欢迎光临!eSt3atestingsfwtrEgd 灰盒测试:借助于源代码和测试工具等手段,通过黑盒和白盒测试相结合的方法进行测试的技术。
测试设计最重要的因素是经验和常识。测试设计者不应该让某种测试技术阻碍经验和常识的运用。
白盒测试用例设计:使用程序设计的控制结构导出测试用例。
欢迎光临!eSt3atestingsfwtrEgd 采用白盒测试的目的主要是:
保证一个模块中的所有独立路径至少被执行一次;
欢迎光临!eSt3atestingsfwtrEgd 对所有的逻辑值均需要测试真、假两个分支; 欢迎光临!eSt3atestingsfwtrEgd 在上下边界及可操作范围内运行所有循环; 欢迎光临!eSt3atestingsfwtrEgd 检查内部数据结构以确保其有效性。
黑盒测试用例设计:使用详细设计导出测试用例。
欢迎光临!eSt3atestingsfwtrEgd 采用黑盒测试的目的主要是:
检查功能是否实现或遗漏;
欢迎光临!eSt3atestingsfwtrEgd 检查人机界户是否错误; 欢迎光临!eSt3atestingsfwtrEgd 数据结构或外部数据库访问错误; 欢迎光临!eSt3atestingsfwtrEgd 性能等其它特性要求是否满足; 欢迎光临!eSt3atestingsfwtrEgd 初始化盒终止错误。
3.1 软件设计说明导出的测试
测试用例通过根据相关的软件设计说明文档进行设计。每个测试用例测试设计说明中一项或多项陈述。通常为被测单元设计说明的一系列陈述建立一系列对应的设计用例。
欢迎光临!eSt3atestingsfwtrEgd 例1:考虑下面计算实数平方根的函数的设计说明: 欢迎光临!eSt3atestingsfwtrEgd 输入:实数 欢迎光临!eSt3atestingsfwtrEgd 输出:实数 欢迎光临!eSt3atestingsfwtrEgd 处理:当输入0或大于0时,返回输入数的平方根;当输入小于0时,显示:“Square root error - illegal negative input",并返回0;库函数Print_Line用于显示出错信息。设计说明有3个陈述,可以2个测试用例来对应。 欢迎光临!eSt3atestingsfwtrEgd Test Case 1:输入4,返回2。 //执行第一个陈述 欢迎光临!eSt3atestingsfwtrEgd Test Case 2:输入-10,返回0,显示“Square root error - illegal negative input”//对应第二个和第三个陈述 欢迎光临!eSt3atestingsfwtrEgd 设计说明导出的测试用例提供了与被测单元设计说明陈述序列很好的对应关系,增强了测试说明的可读性和可维护性。但有软件设计说明导出测试是正面的测试用例设计技术。软件设计说明导出的测试应该用负面测试用例进行补充,以提供一个完整的单元测试说明。 欢迎光临!eSt3atestingsfwtrEgd 设计说明导出的测试设计技术还可用于安全分析、保密分析、软件冒险分析和其他给单元设计的其他补充文档。 欢迎光临!eSt3atestingsfwtrEgd 欢迎光临!eSt3atestingsfwtrEgd 3.2 基本路径测试 欢迎光临!eSt3atestingsfwtrEgd 基本路径测试是一种白盒测试技术。测试用例设计者导出一个过程设计的逻辑复杂性测度,并使用改测度作为指南来定义执行路径的基本集,从该基本集导出的测试用例保证对程序中的每一条执行语句至少执行一次。 欢迎光临!eSt3atestingsfwtrEgd 基本路径测试的方法步骤如下:
3.2.1 画出控制流图
欢迎光临!eSt3atestingsfwtrEgd C/C++语句中的控制语句表示如下:图中的每一个圆称为流图的节点,代表一条或多条语句。流图中的箭头称为边或连接, 欢迎光临!eSt3atestingsfwtrEgd 代表控制流。任何过程设计都要被翻译成控制流图。如下面的C 函数: 欢迎光临!eSt3atestingsfwtrEgd void Sort(int iRecordNum,int iType) 欢迎光临!eSt3atestingsfwtrEgd { 欢迎光临!eSt3atestingsfwtrEgd int x=0; 欢迎光临!eSt3atestingsfwtrEgd int y=0; 欢迎光临!eSt3atestingsfwtrEgd while (iRecordNum--) 欢迎光临!eSt3atestingsfwtrEgd { 欢迎光临!eSt3atestingsfwtrEgd if(0= =iType) 欢迎光临!eSt3atestingsfwtrEgd x=y+2; 欢迎光临!eSt3atestingsfwtrEgd else 欢迎光临!eSt3atestingsfwtrEgd if(1= =iType) 欢迎光临!eSt3atestingsfwtrEgd x=y+10; 欢迎光临!eSt3atestingsfwtrEgd else 欢迎光临!eSt3atestingsfwtrEgd x=y+20; 欢迎光临!eSt3atestingsfwtrEgd } 欢迎光临!eSt3atestingsfwtrEgd }
画出其对应的控制流图如下:

逐一:如果在程序中遇到复合条件,例如条件语句中的多个布尔运算符(逻辑OR、AND)
欢迎光临!eSt3atestingsfwtrEgd 时,为每一个条件创建一个独立的节点,包含条件的节点称为判定节点,从每一个判定节点
欢迎光临!eSt3atestingsfwtrEgd 发出两条或多条边。例如:
欢迎光临!eSt3atestingsfwtrEgd 1 if ( a or b)
欢迎光临!eSt3atestingsfwtrEgd 2 x
欢迎光临!eSt3atestingsfwtrEgd 3 else
欢迎光临!eSt3atestingsfwtrEgd 4 y
欢迎光临!eSt3atestingsfwtrEgd 5 …
欢迎光临!eSt3atestingsfwtrEgd 对应的逻辑为:

3.2.2计算圈复杂度
圈复杂度是一种为程序逻辑复杂性提供定量测度的软件度量,将该度量用于计算程序的基本的独立路径数目,为确保所有语句至少执行一次的测试数量的上界。独立路径必须包含一条在定义之前不曾用到的边。
有以下三种方法计算圈复杂度:
流图中区域的数量对应于环型的复杂性;
给定流图G的圈复杂度-V(G),定义为V(G)=E-N+2,E是流图中边的数量,N是流图中节点的数量;
给定流图G的圈复杂度-V(G),定义为V(G)=P+1,P是流图G中判定节点的数量。
对应3.2.1图一中代码的圈复杂度,计算如下:
流图中有四个区域;
V(G)=11条边-9节点+2=4;
V(G)=3个判定节点+1=4。
3.2.3导出测试用例
根据上面的计算方法,可得出四个独立的路径:
路径1:3-13
路径2:3-5-6-12-3-13
路径3:3-5-7-9-12-3-13
路径4:3-5-7-10-12-3-13
根据上面的独立路径,去设计输入数据,使程序分别执行到上面四条路径。
3.2对等区间(等价类划分)
对等区间划分是一种黑盒测试方法,该方法也成为等价类划分;
对等区间划分是测试用例设计的非常形式化的方法。它将被测软件的输入输出划分成一些区间,被测软件对一个特定区间的任何值都是等价的。形成测试区间的数据不只是函数/过程的参数,也可以是软件可以访问的全局变量,系统资源等,这些变量或资源可以是以时间形式存在的数据,或以状态形式存在的输入输出序列。
对等区间划分假定位于单个区间的所有值对测试都是对等的,应该为每个区间的一个值设计一个测试用例。
考虑前面的平方根函数的测试用例区间,有2个输入区间和2个输出区间,表示如下:
可以用2个测试用例测试4个区间:
测试用例1:输入4,返回 2 //区间 ii和a
测试用例 2:输入-10,返回0,输出"Square root error - illegal negative input" //区间i和b 欢迎光临! |