《第2章 软件测试基础》由会员分享,可在线阅读,更多相关《第2章 软件测试基础(58页珍藏版)》请在金锄头文库上搜索。
1、第二章第二章 软件测试基础软件测试基础 本章要点本章要点 软件测试基础知识; 白盒测试和黑盒测试的定义; 常见的白盒和黑盒测试设计技术; 白盒测试与黑盒测试的区别; 测试计划和测试报告的编制; 测试用例的定义和编制方法。 本章目标本章目标 u掌握有关测试的一些数学知识,包括集合、函数和图论基础等;u理解并掌握白盒测试和黑盒测试,以及二者的优缺点和各自的应用范围;u能够熟练使用几种常见测试用例设计技术;u了解测试计划和测试文档的作用,以及应该包含的内容和制定方法;u了解测试报告的基本内容,以及测试用例的基本内容和编制方法。 2.12.1用于测试的离散数学和图论基础用于测试的离散数学和图论基础 一
2、般而言,在功能性测试中,通常要用到离散数学知识,而在结构性测试领域中,则要用到一些关于图论的知识。 2.1.1 2.1.1集合论集合论 集合论可分为:自然和不言自明两种。自然的集合论把集合看作是基本术语,我们把集合看作一个单位,或一个整体引用多个事物。 集合的表示法有以下两种: 1、将集合所有元素一一列出的表示法叫做“枚举法”,但有时也可以只列出一部分元素。 2、用一个集合所具有的共同性质来刻画这个集合。 2.1.2 2.1.2函数函数 简而言之,函数是将唯一的输出值赋予每一输入的“法则”。 2.1.3 2.1.3关系关系 通俗的讲,关系就是客观世界一定范围的对象之间的某种特定联系。 集合之间
3、的关系集合之间的关系 定义: : 给定两个集合A和B,关系R是笛卡儿积A B的一个子集。 如果希望描述整个关系,则通常只写RAB。对于特定元素aiA、biB,我们记做aiRbi 。 关系的表示关系的表示 关系关系表示事物之间的某种联系,二元关系表示两个事物之间的关系,如果把这两个事物分别放在一边,如果某两个元素有关系,那么就在它们之间画一条有向线,用这种方式表示关系,称作关系图。 这里我们必须对“势”进行解释。势在用于集合时,是指集合中的元素的个数。 定义定义: : 给定两个集合A和B,一个关系RAB,关系R的势是: 1)一对一势 2)多对一势 3)一对多势 4)多对多势 单个集合上的关系单个
4、集合上的关系 首先,我们对关系进行定义。设A是一个集合,RAA是定义在A上的一个关系,、R。关系具有四个特殊属性: 定义定义: : 关系RAA是: 1)自反的 2)对称的 3)反对称的 4)传递的 2.1.4 2.1.4命题逻辑命题逻辑 凡是能分辨其真假的语句都叫做命题。我们通常采用小写字母p,q和r表示命题。 命题逻辑有着和集合论相似的操作,表达式和标识。命题的真值只有两种,T代表真,而F代表假。 命题公式的分类:命题公式的分类: 如果命题公式A在任意的真值赋值函数t : U0, 1下的真值t(A)都为1,则称命题公式A为永真式(tautology)(或称重言式); 如果命题A在任意的真值赋
5、值函数下的真值都为0,则称A为矛盾式(contradiction); 如果A不是矛盾式,则称为可满足式。 2.1.52.1.5概率论概率论 概率是随机事件发生的可能性的数量指标。 在独立随机事件中,如果某一事件在全部事件中出现的频率,在更大的范围内比较明显的稳定在某一固定常数附近。就可以认为这个事件发生的概率为这个常数。对于任何事件的概率值一定介于 0和 1之间。 2.1.6 2.1.6用于测试的图用于测试的图 测试中使用两种基本图:无向图和有向图。这里我们给出一些概念。 图(又叫做线性图)是一种由两种集合定义的抽象数据结构,即一个节点集合和一个构成节点之间连接的集合。 图中节点的度节点的度是
6、以该节点作为端点的边的条数。 在本节中将介绍的三种图:程序图、有限状态机、状态图。 1、程序图 经过改进的程序图定义:节点要么是整个语句,要么是语句的一部分,边表示控制流(从节点i到节点j有一条边,当且仅当对应节点j的语句或语句的一部分,可以立即在节点i对应的语句或语句的一部分之后执行)。 程序的有向图公式化能够非常准确地描述程序的测试方面的问题。基本结构化程序设计的构造,例如:串行、选择和循环等可以用如图 2-1所示的有向图表示。图2-1 结构化程序设计构造的有向图 2、有限状态机 有限状态机已经成为需求规格说明的一种相当标准的表示方法。有限状态机是一种有向图,其中状态是节点,转移是边。 图
7、2-2是一个简单的自动柜员机(SATM)系统。该图描述了用于个人标识编号PIN尝试部分的有限状态机。这种机器包含5 个状态(空闲、等待第一次PIN尝试等等)和8个用边表示的转移。转移上的标签所遵循的规则是,“分子”是引起转移的事件,“分母”是与该转移关联的行为。图2-2 用于PIN尝试的有限状态机 3、状态图 状态图现在被Rational公司选为统一建模语言,即UML的控制模型。图2-3 状态图的团点 Harel使用与方法无关的术语“团点”表示状态图的基本构建块。在图2-3中,团点A包含两个团点B和C,通过边连接。团点A通过边与团点D连接。 根据Harel的意图,我们可以把团点解释为状态,把边
8、解释为转移。 在图2-4中,状态A是初始状态,当进入到这个状态时,也进入低层状态B。当进入某个状态时,我们可以认为该状态是活动的,这可与Petri网中的被标记地点类比。状态图工具采用色彩表示哪个状态活动的,并等效于Petri网中的标记地点。 图2-4中有一些微妙的地方,从状态A转移到状态D初看起来是有歧义的,因为它没有区分状态B和C。约定是,边必须开始和结束于状态的周围。如果状态包含子状态,就像图中的A一样,边会“引用”所有的子状态。 因此,从A到D的边意味着转移可以从状态B或从状态C发生。如果有从状态D到状态A的边,如图2-5所示,则用B来表示初始状态这个事实,意味着转移实际上是从状态D到状
9、态B。这种约定可以大大减缓有限状态机向“空心代码”发展的趋势。 图2-4 状态图中的初始状态 图2-5 进入自状态的默认入口 我们最后要讨论的一个状态图的特性就是并发状态图概念。图2-6中状态D的虚线用于表示状态D实际上引用两个并发状态E和F。图2-6 并发状态 2.2 2.2白盒测试白盒测试 白盒测试是一种可视的测试软件的方法,即它把测试对象看作一个透明的盒子,测试人员要了解程序结构和处理过程,按照程序内部逻辑测试程序,检查程序中的每条通路是否按照预定要求正确工作。白盒测试的过程如图2-7所示:图2-7 白盒测试过程示意图 那么,在对被测软件进行白盒测试时,主要对程序进行哪些方面的检查呢?有
10、如下几点: ()保证一个模块中的所有独立执行路径至少测试一次; ()对所有逻辑判定取值“true”和“false”的两种情况都至少测试一次; ()在循环边界和运行界限内执行循环体; ()测试内部数据结构的有效性。 在软件测试领域,有六种基本的测试类型:单元测试,集成测试,功能测试/系统测试,可接受性测试,回归测试和Beta测试。白盒测试可以用在其中的三种测试类型中: 1、单元测试 2、集成测试 3、回归测试 2.2.12.2.1白盒测试与调试的异同白盒测试与调试的异同 白盒测试和调试有哪些不同点呢? 1、从承担的任务来看,白盒测试同其他类型测试一样,它的任务是发现所开发的项目中的缺陷;但是,调
11、试不属于测试,其任务是纠正软件中的缺陷。 2、从最终的结果来看,白盒测试有预知的结果,不可预知的只是程序是否通过测试,并且成功测试的结果是发现错误的症状,从而引起调试的进行;而调试的结果是消除项目中的错误。 3、从执行的过程来看,测试是一个发现错误、改正错误、重新测试的过程;而调试是一个推理过程。 4、从准备工作来看,测试从已知的条件开始,使用预先定义的程序;调试一般是以不可知的内部条件开始,做统一性调试 。 5、从执行的计划性来看,测试是有计划的并要进行测试设计;而调试则不受时间约束。 6、从执行的人员来看,测试经常是由独立的测试组在不了解软件设计的条件下完成的,而调试必须由程序员来完成。
12、7、从所使用的工具来看,大多数白盒测试的执行和设计可有工具支持,而调试程序员能利用的工具主要是调试器。 2.2.2 2.2.2白盒测试的用例设计白盒测试的用例设计 白盒测试用例设计技术就是研究如何用最少的测试用例最大限度地发现软件中的错误,目前主要有基本路径测试、等价类划分/边界值分析测试、覆盖测试、循环测试、数据流测试、程序插桩测试、变异测试等等方法。下面主要对几种常见的方法加以介绍: 一、基本路径测试 二、等价类划分/边界值分析(Equivalence partitioning/boundary value analysis) 三、控制流/覆盖测试(Control-flow/Coverag
13、e Testing) 方法覆盖 方法覆盖可用于衡量测试用例所覆盖的方法的百分比。 语句覆盖(Statement Coverage) 语句覆盖是一种衡量测试所覆盖的程序语句百分比的措施。通过测试应该达到100%程序语句覆盖的目标,可以标识圈数,然后执行最少的一组测试用例就可以达到语句覆盖的目标。 判断/分支覆盖 判断/分支覆盖是为了衡量在测试过程中覆盖了多少个程序中的布尔表达式。图2-11 各种循环图 四、循环测试是一种白盒测试技术,注重于循环构造的有效性。n 循环结构测试用例的设计循环可以划分为以下几种模式,如图2-11: 可以使用如下方法设计循环测试用例: 一、简单循环: 二、嵌套循环: 三
14、、串接循环: 四、无结构循环: 五、数据流测试: 六、程序插装: 程序插装(Program Instrumentation)是指在程序中设置断点或打印语句,在执行过程中了解程序的一些动态特性。 七、变异测试 变异测试(Mutation Testing)的提出始于70年代末期,是一种错误驱动测试,即针对某类特定程序错误而进行的测试,也是一种比较成熟的排错性测试方法(排错性测试方法的基本思想是通过检验测试数据集的排错能力来判断软件测试的充分性)。 2.2.32.2.3白盒测试举例(略)白盒测试举例(略) 2.32.3黑盒测试黑盒测试 黑盒测试也称作功能测试和行为测试,主要是根据功能需求来测试程序是
15、否按照预期工作。 黑盒测试的目的是尽量发现代码所表现的外部行为的错误,主要有以下几类: 功能不正确或不完整; 接口错误; 接口所使用的数据结构错误; 行为或性能错误; 初始化和终止错误。 黑盒测试的示意图如图2-14 所示。从图2-14中,我们可以看出黑盒测试只考虑程序的输入和输出,无须考虑程序的内部代码。 图2-14 黑盒测试示意图2.3.12.3.1黑盒测试和白盒测试的异同黑盒测试和白盒测试的异同 本书归纳出以下几点:1.执行测试人员不同 黑盒测试通常由用户以及非开发人员来进行;而白盒测试通常要有了解软件内部结构的开发人员来做。2.测试覆盖目标不同 如果我们用一个盒子来代替整个软件系统,那
16、么黑盒测试可以看成是一种系统测试。而对盒子内部的多个单元的测试就可以称作为白盒测试。 另外一种区别就是,二者的覆盖目标不同。黑盒测试的目标是覆盖所有的用户需求;而白盒测试的目标是覆盖所有的代码。3、测试动机不同 有效的安全测试有时也需要详细了解代码以及系统结构,此时把这些技术称作白盒测试。 另外一种风险测试的目标可能就只是测试软件是否能够为用户提供预期输出。可用性测试就是如此,所以被称作黑盒测试。 4、测试方法不同 一个最普通的区别就是行为测试设计是基于功能需求来定义测试,而结构测试则是基于代码本身来定义测试的。这就是两种设计测试的方法。因为行为测试是基于外部功能定义的,所以称作黑盒测试;结构
17、测试则是基于代码内部结构来定义的,所以称作白盒测试。 5、评估测试方法不同 一些技术是使用代码工具来跟踪软件内部的工作过程,因此称为白盒测试技术。与之相比,黑盒测试技术只是简单的观察程序的正常输出。 2.3.22.3.2黑盒测试的用例设计黑盒测试的用例设计 常用的黑盒测试用例设计方法主要有以下几种:功能图分析方法,等价类划分方法,边界值分析方法,错误推测方法,因果图方法,判定表驱动分析方法,正交实验设计方法和功能图分析方法等。 下面对上述方法分别作以简要介绍。 一、基于用户需求的测试 黑盒测试用例就是基于用户需求的,也是从研究客户需求工作开始的。 二、对等区间划分 对等区间划分是一种黑盒测试方
18、法,该方法也称为等价类划分,是一种设计测试用例的非常形式化的方法。 三、边界值分析法 边界值分析方法是对等价类划分方法的补充。长期的测试工作经验告诉我们,大量的错误是发生在输入或输出范围的边界上,而不是发生在输入输出范围的内部。 四、状态转换测试 状态转换测试适用于软件被设计成一个状态机或实现了一种被建模成一种状态机的情况。可以设计测试用例测试状态间转换,测试用例创建引起转换的事件。可以设计负面测试的测试用例用于测试状态与事件的非法组合。 五、分支测试 在分支测试中,测试用例用于测试单元的控制流分支或决策点。通常用于实现决策覆盖(Decision Coverage)的测试目标。 六、错误推测法
19、 错误推测法就是根据经验和直觉推测程序中所有可能存在的各种错误,借助边界值分析等方法有针对性的设计测试用例的方法。 七、因果图方法 因果图方法适合于检查程序输入条件的各种组合情况。使用该方法首先要理解软件所表示的对象及其关系,然后,定义一组保证“所有对象与其他对象都具有所期望的关系”的测试序列。 2.3.3 2.3.3黑盒测试举例(略)黑盒测试举例(略) 2.4 2.4白盒测试和黑盒测试的比较白盒测试和黑盒测试的比较 1、白盒测试只关注软件产品的测试,不能够确保产品已经实现了规格说明中的所有功能。黑盒测试则只关注规格说明中的功能测试,不能够保证已经实现的各个部分都被测试到。 2、与黑盒测试相比
20、,白盒测试的成本要高一些。 3、黑盒测试故意不考虑控制结构,而只注意信息域。白盒测试只考虑测试软件产品,它不保证完整的需求规格是否被满足。黑盒测试是一种确认技术,回答“我们在构造一个正确的系统吗?白盒测试是一种验证技术,回答“我们在正确地构造一个系统吗?” 总之,建议测试人员在进行测试的过程中,可以考虑先使用黑盒测试,然后统计相应的覆盖率,再设计适当的白盒测试用例作为补充以保证测试的完整性。 2.4.12.4.1白盒测试的优缺点白盒测试的优缺点 1)优点可构成测试数据对特定程序部分测试,可以检测代码中的每条分支和路径;揭示隐藏在代码中的错误;对代码的测试比较彻底;有较多工具支持;有一定的充分性
21、度量手段。 2)缺点工作量大, 成本高。通常只用于单元测试,有应用局限;无法检测代码中遗漏的路径和数据敏感性错误;不能验证规格说明的正确性;无法对规格说明中未实现的部分进行测试;不易生成测试数据(通常)。2.4.22.4.2黑盒测试的优缺点黑盒测试的优缺点1.优点对于较大的代码单元来说,效率高;测试人员不需要了解实现的细节,包括具体的编程语言;测试员和程序员可以由不同的人员来担任;从用户的角度进行测试,容易被理解和接受;有助于暴露任何规格不一致或有歧义的问题;测试用例的设计可以在规格说明完成之后马上进行;容易入手生成测试数据;适用于各阶段测试。2.缺点实际上,只有一小部分可能的输入被测试到,某
22、些代码得不到测试;如果没有清晰、简洁的规格说明,难以设计测试用例;如果测试人员不知道开发人员已经执行过该测试用例,会存在不必要的重复测试;会有很多程序路径没有被测试到;不能直接针对可能隐蔽了许多问题的特定程序段进行测试,;如果规格说明有误,则无法发现;不易进行充分性测试。2.4.32.4.3灰盒测试灰盒测试 灰盒测试介于白盒测试和黑盒测试之间,是现代测试的一种理念。就是指,在白盒测试中交叉使用黑盒测试的方法;在黑盒测试中交叉使用白盒测试的方法。2.52.5测试方法的选择测试方法的选择 一、单元测试 测试方法:白盒测试 参考规范:详细设计说明和代码结构 二、集成测试 测试方法:黑盒和白盒测试 参
23、考规范:详细设计说明和概要设计说明 2.6 2.6测试计划与测试文档测试计划与测试文档 最常见的测试文档包括测试计划,测试规范,测试用例和测试时发现缺陷后要写的缺陷报告等。 那么,测试计划和测试文档在测试过程中能够发挥什么样的作用呢? 1、测试文档有助于测试任务的完成。 2、使用测试文档可以更好的协调测试任务与测试过程。 3、测试文档为测试项目的组织、规划与管理提供了一个架构。 2.6.1 2.6.1测试计划的制定测试计划的制定为了给读者一个宏观的认识,首先请看测试计划活动图,如图2-20所示。 在制定测试计划过程中,核心活动就是: 一、确定测试策略 通常,可以采用以下几个方法来制定测试策略:
24、 1、确定测试的范围 2、确定测试的方法 3、确定测试标准和质量检查点 4、确定自动化测试策略 二、确定测试系统(硬件和软件) 1、测试架构 测试架构指的就是测试用例的组织结构。 图2-20 测试计划活动 2、测试工具 3、测试环境 测试环境的组成包括物理测试设施,产品运行的操作系统、产品运行的计算平台等。 4、测试配置情况 需要排列配置的优先级,然后决定哪些配置需要全面测试,哪些可以进行部分测试。 三、预估测试工作量(资源和时间进度计划) 对项目进行预估有5个准备步骤: 1、确定要完成的任务。 2、确定每项任务所需的工作量和整个测试生命周期的工作量。 3、确定完成每项任务以及整个测试生命周期
25、所需的时间。 4、为测试工作建立详细的时间进度计划和里程碑表。 5、评估时间进度风险并准备缓解风险计划。 四、准备并复查测试计划文档。 1、测试计划格式 2、测试计划复查 2.6.2 2.6.2测试报告测试报告 测试报告是测试阶段最后的文档产出物,优秀的测试经理应该具备良好的文档编写能力,一 份详细的测试报告包含足够的信息,包括产品质量和测试过程的评价,测试报告基于测试中的数据采集以及对最终测试结果的分析。 2.6.3 2.6.3测试用例的编制测试用例的编制 本节我们首先讨论几个和测试用例相关的几个问题,然后探讨如何编制一个有效的测试用例。 一、为什么做测试用例 主要原因有如下几点:完全测试是
26、不可能的;输入量太大;输出结果太多;软件实现途径太多;软件说明书没有客观标准。从不同角度看,软件缺陷的标准不同。 二、什么是测试用例 比较通常的说法是:为达到最佳的测试效果或高效的揭露隐藏的错误而精心设计的少量测试数据,称之为测试用例。 三、使用测试用例的好处 在开始实施测试之前设计好测试用例,可以避免盲目测试并提高测试效率。 测试用例的使用令软件测试的实施重点突出、目的明确。 在软件版本更新后只需修正少部分的测试用例便可展开测试工作,降低工作强度、缩短项目周期。 功能模块的通用化和复用化使软件易于开发,而 用于功能模块测试的测试用例的通用化和复用化则会使软件测试易于开展,并随着测试用例的不断
27、精化其效率也不断攀升。 四、测试用例在软件测试中的作用 指导测试的实施 规划测试数据的准备 评估测试结果的度量基准 分析缺陷的标准 编写测试脚本的设计规格说明书 五、测试用例文档的编制 首先,在编写测试用例之前需要准备以下几个编写的依据:需求说明以及相关文档;相关的设计说明(概要设计,详细设计等);与开发组交流对需求理解的记录(可以是开发人员的一个解释);已经基本成型的UI(可以有针对性地补充一些用例)。 其次,编写测试用例文档应有文档模板,须符合内部的规范要求。 最后一点就是,测试用例文档应该由简介和测试用例两部分组成。那么,下面从测试用例的设置、设计、评审、修改以及管理等几方面来详细讨论测
28、试用例文档的编制问题: 1、测试用例的设置 2、测试用例的设计 测试用例可以分为基本事件、备选事件和异常事件。软件测试常用的设计测试用例的基本方法有:等价类划分法、边界值分析法、错误推测法、因果图法、逻辑覆盖法等。视软件的不同性质采用不同的方法。如何灵活运用各种基本方法来设计完整的测试用 例,并最终实现暴露隐藏的缺陷,则要凭测试设计人员的丰富经验和精心设计。 3、测试用例的评审 4、测试用例的修改更新 5、测试用例的管理 测试管理软件的主要功能有三个: 能将测试用例文档的关键内容; 可供测试实施时及时输入测试情况; 最终实现自动生成测试结果文档。 本章小结本章小结 在功能性测试中,我们通常使用
29、离散数学,而涉及到结构性测试的领域,我们则会用到关于图论的知识。使用这两方面的知识,有助于我们更精确的描述软件测试,减少对测试过程的误解。 白盒测试与黑盒测试则是软件测试工作中设计测试用例的两个主要的方法。在实际测试过程中,如果黑盒测试是足够充分的,那么白盒测试就没有必要,但是“足够充分”只是一种理想状态,例如:真的是所有功能点都测试了吗?程序的功能点是人为的定义,常常是不全面的; 各个输入数据之间,有些组合可能会产生问题,怎样保证这些组合都经过了测试?难于衡量测试的完整性是黑盒测试的主要缺陷,而白盒测试恰恰具有易于衡量测试完整性的优点,两者之间具有极好的互补性。 白盒测试主要是针对程序的逻辑
30、结构设计测试用例,用逻辑覆盖率来衡量测试的完整性。逻辑单位主要有:语句、分支、条件、条件值、条件值组合、路径。语句覆盖就是覆盖所有的语句,其他类推。 另外还有一种判定条件覆盖,其实是分支覆盖与条件覆盖的组合,在此不作讨论。跟条件有关的覆盖就有三种: 条件覆盖是指覆盖所有的条件表达,即所有的条件表达式都计算了,不考虑计算结果;条件值覆盖是指覆盖条件的所有可能取值,即每个条件的取真值和取假值都要计算一次;条件值组合覆盖是指覆盖所有条件取值的所有可能组合。 效率比较高且完整性也足够的测试要求一般是这样的:完成功能测试,完成语句覆盖、条件覆盖、分支覆盖、路径覆盖。读者可能认为这似乎是不可能的要求,要达
31、到这种测试完整性,其测试成本是不可想象的,但是通过使用一些工具,可以在较低的成本下达到这种测试要求。 精心的测试计划是做好软件测试的关键步骤,因此应该根据需求的变更随时修改测试计划。全面地测试文档,能够为测试工作提供更好的支持,因此在测试的过程中应该给测试计划的制定和测试文档的编写工作以足够的重视。习习 题题1.请列出下列集合的所有元素: (1)大于4并小于28的所有素数的集合; (2)大于38并小于70的所有素数的集合;2.调试会遇到哪些困难?白盒测试与调试有哪些相同点和不同点?3.请阐述白盒测试用例设计的各种方法。4.请阐述黑盒测试用例设计的各种方法。 2.比较白盒测试与黑盒测试各自的优缺点。3.制定测试计划的主要步骤有哪些?如何确定测试范围? 4.为什么要提交测试报告?5.编写测试用例的依据有哪些?