考核说明: 本节主要介绍软件测试的有关概念、软件测试技术、软件测试的实施步骤等,其中软件测试的技术和方法是本节的重点,也是本章的重点内容之一。
软件测试的方法有3种:动态测试、静态测试和正确性证明。
动态测试是指通常的上机测试,这种方法是使程序有控制地进行,并从多种角度观察程序运行时的行为,以发现其中的错误。测试是否能够发现错误取决于测试实例的设计。
静态测试一般是指人工评审软件文档或程序,借以发现其中的错误,由于被评审的文档或程序不必运行,所以称为静态,不需要测试实例。
设计测试实例的方法一般有两类:黑箱测试和白箱测试。
(1)黑箱测试即功能测试,测试时完全不考虑内部细节、结构和实现方式,仅检验程序结果与说明书的一致性。黑箱测试分等价分类法、边缘值分析法、因果图法、错误推测法。在黑箱测试中,应首先使用边界值分析法,经验表明,用这种方法设计出的测试实例暴露错误的能力最强,应该既包括输入数据的边界情况又包括输出数据的边界情况,必要时使用等价分类法和错误推断法补充测试。
(2)白箱测试即结构测试,它与程序内部结构有关,要利用程序结构的实现细节设计测试实例。白箱测试包括语句测试、分支测试、路径测试。
软件系统的开发过程是一个自顶向下逐步细化的过程,而测试过程是以相反顺序进行的集成过程。软件测试的组成包括单元测试、集成测试、有效性测试、系统测试和验收测试。单元测试是通过测试发现模块单元的子程序或过程的实际功能与该模块的功能和接口的描述是否相符,以及是否有编码错误存在。单元测试是最基础的,只有通过了单元测试,集成测试、有效性测试、系统测试和验收测试才有意义。
软件评审可以分为需求复审、总体设计复审、详细设计复审和程序复审。
在使用黑箱测试设计测试实例时,测试人员将程序看成一个“黑箱”,也就是说,他不关心程序内部是如何实现的,而只是检查程序是否符合它的“功能说明”,所以使用黑箱测试设计的测试用例完全是根据程序的功能说明来设计的。
黑箱测试不考虑程序内部的逻辑,只是根据程序的功能说明来设计测试用例。在使用黑箱测试时,手头只需要有程序功能说明就可以了。
白箱测试即结构测试,它与程序内部结构相关,要利用程序结构的实现细节设计测试实例。它涉及程序设计风格、控制方法、源语句、数据库设计、编码细节。
使用白箱测试需要了解程序内部的结构,此时的测试用例是根据程序的内部逻辑来设计的,如果想用白箱测试发现程序中所有的错误,则至少必须使程序中每种可能的路径都执行一次。
白箱测试包括3个方面:
(1)语句测试,要求程序中每个语句最少检查一次。
(2)分支测试,要求程序中每个分支路径最少检查一次。
(3)路径测试,要求程序中每条路径最少检查一次。
白箱测试考虑的测试实例针对程序内部逻辑的覆盖程度。为了衡量测试的覆盖程度,需建立一些标准。覆盖程度从低到高分别为语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖。
程序排错即程序调试,是程序测试后开始的工作,它确定测试中发现错误的性质和位置、并修改错误。排错方法有多种,但在理论和方法上还不成熟。
借助排错工具,插入打印语句,设置断点,跟踪语句的执行,确定程序执行正确与否。简单排错方法有效性较低,且依赖测试人员的经验和水平。
从特殊到一般的归纳对问题进行分析和思考,其过程为,通过实例运行结果,寻找线索,从线索(一个或多个测试实例的执行结果所反映的错误征兆)和线索之间的联系出发做归纳分析,从而确定错误。
从一般推测出发,使用逐步求精方法去获得错误的性质和位置。
反向搜索排错法或称回溯法,从程序产生不正确的结果处,沿逻辑路径反向搜索,直到发现程序错误为止。
测试与排错或调试是互相联系但又是性质不同的两类活动。两者之间的关系是,一个好的测试设计有利于排错,从而保证程序的正确性。
穷举测试又称完全测试。
如果测试的目标是希望通过测试发现程序的全部错误,则只有将程序输入域内的全部数据都作为测试的输入数据,或者设计这样的测试输入数据集,使程序的全部路径都被遍历。
路径测试是整个测试的柱石,是结构测试之一。路径测试的目标是通过检验足够多的程序元素的路径来证实程序元素的实际结构同所期望的程序元素的结构是一致的。路径测试的关键是如何选择或设计测试实例集合,使其小到可以被接受,而又包括足够多的路径以实现路径测试的目标。
循环测试是路径测试的一部分。循环是最复杂的一种控制结构,它同路径覆盖有关。
作业是由一组操作组成的,操作可由系统、人或系统以外的设备去执行。典型的作业是从输入操作开始,而终止于产生一个或多个结果的输出操作。
输入确认用以保证系统拒绝无用信息。
软件系统的开发过程是一个自顶向下逐步细化的过程,而测试过程是以相反顺序进行的集成过程。软件测试的组成包括单元测试、集成测试、有效性测试、系统测试和验收测试。
单元测试是通过测试发现模块单元的子程序或过程的实际功能与该模块的功能和接口的描述是否相符,以及是否有编码错误存在。
集成测试是在组装软件模块的同时进行测试,以查找与接口有关的错误。组装模块的过程可以分为自顶向下组装法和自底向上组装法。
经过全部模块的集成测试,已经得到一个完整的软件包。这时进行最后的软件测试,即有效性测试。所谓有效性测试,是指当软件的运行达到了用户的期望时,则认为软件是有效的。
系统测试是指将软件系统与硬件、外设或其他系统元素结合在一起,对整个软件系统进行测试。
系统测试通过后,用户根据合同进行验收测试,确定系统功能的可接受性。
单元是软件系统的组成部分,它具有以下特点:
(1)由一个程序员负责完成工作;
(2)有一份详细的说明书;
(3)一个可识别的和可见的程序组成部分,容易结合成程序;
(4)能够单独编译、汇编和测试;
(5)程序中的必要部分。
单元是私有的,即未经严格测试,尚未交付使用的单元。
单元是公开的,即已经严格测试及确认,可以与别的单元结合或调用的单元。
单元测试的目的和效果是将私有单元转化为公开单元,且使用最少的费用和最有效的方法完成从私有到公开的转化。
测试的目标是证明程序有错误,而不是证明程序没有错误,这一结论是程序经验的总结,也是其本身的规律。如在目标制定时,还可以分为主要目标、次要目标和辅助目标。
单元测试时应首先提供下列文档并按步骤进行:
(1)正式说明书。
(2)单元测试计划和文件。
(3)先测试可测试代码。
(4)先测试私有单元,再进行公开单元测试。
(5)验收和条件验收。
单元测试后可进行程序元素测试,即对由单元组成的各种程序进行测试。
单元测试必须在一定的环境下进行,这些环境可以是真实的也可以是模拟的。
单元测试是基础性测试,通常可采用的方法有静态测试、动态测试和复审3种。
集成测试又称整体测试或结合测试,是软件测试的一个重要环节。
集成测试是在已完成的程序元素测试的条件下证实这些元素间的一致性。
集成测试前提是
(1)全部被结合的子元素已经过测试,子元素自身是一致和正确的。
(2)研究子元素间直接或间接接口的一致性。
(3)测试与排错交替进行,获得一个互相一致的子元素结合。
(4)对新元素进行测试。
(5)重复上述过程,直到完成整个系统的测试和结合。
集成测试将对结合元素间的调用关系、数据依赖和元素间的接口进行测试,它可以应用包括:调用图/树的准备、数据依赖图的准备、加工依赖图、接口与接口标准等技术。
(1)程序元素中数据项的相容性。
(2)检验对调用图的路径覆盖情况。
(3)检查多入口元素的每个入口点,并验证选取入口的正确和路径覆盖。
集成测试可以采用自顶向下集成,也可以采用自底向上集成两种策略。
完成系统级的功能验证和完成系统的验收测试。
测试计划的制订是执行系统功能测试和验收测试的基本保证,它们必须有正式的测试文档。测试文档一般包括综述部分、测试数据库和代码部分及实际测试说明书三大部分。
系统测试的实施一般按照功能测试、性能测试、背景测试、配置测试、繁忙测试、恢复测试、安全性测试几个步骤进行。
测试报告是对测试阶段工作的总结,测试报告的内容主要包括引言、测试计划和配置、接口测试、功能测试、开发测试、交付使用的准备、附录等几部分。
【试题2-7】 设计测试用例的方法有黑箱测试和白箱测试。以下方法中属于白箱测试的是_____。(2010年9月)
A.语句覆盖法
B.等价分类法
C.边缘值分析法
D.错误推测法
答案: A
解析: 黑箱测试即功能测试,不考虑程序内部细节、结构和实现方式,仅检验程序结果与说明书的一致性。黑箱法分为等价分类法、边缘值分析法、因果图法、错误推测法;白箱测试即结构测试,它与程序内部结构相关,要利用程序结构的实现细节设计测试实例。白箱测试包括语句测试、分支测试、路径测试,白箱测试考虑的测试实例针对程序内部逻辑的覆盖程度。覆盖程度从低到高分别为语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖。
【试题2-8】 在软件测试阶段中,既可采用自底向上策略,也可采用自顶向下策略的是_____。(2011年3月)
A.单元测试
B.验收测试
C.功能测试
D.集成测试
答案: D
解析: 集成测试是在组装软件模块的同时进行测试,以查找与接口有关的错误。组装模块的过程可以分为自顶向下组装法和自底向上组装法。
【试题2-9】 测试是为了发现程序中的错误而_____程序的过程。(2010年3月)
答案: 执行
解析: 测试是为了发现程序中的错误而执行程序的过程。好的测试方案是尽可能发现至今尚未被发现的错误;成功的测试则是发现了至今尚未发现的错误。