第5章软件测试方法本章要点:静态测试与动态测试黑盒测试与白盒测试人工测试与自动化测试软件测试的常用策略:单元测试、集成测试、系统测试、验收测试5.1软件测试复杂性与经济性5.2软件测试方法5.2.1静态测试与动态测试静态测试就是静态分析,对模块的源代码进行研读,查找错误或收集一些度量数据,并不需要对代码进行编译和仿真运行。静态测试采用人工检测和计算机辅助静态分析手段进行检测,只进行特性分析。动态测试是通过观察代码运行时的动作,来提供执行跟踪、时间分析,以及测试覆盖度方面的信息。动态测试通过真正运行程序发现错误。通过有效的测试用例,对应的输入/输出关系来分析被测程序的运行情况。5.2.2黑盒测试、白盒测试与ALAC测试1.黑盒测试(black-boxtesting):也称功能测试或数据驱动测试,着重测试软件功能。黑盒测试力图发现下述类型的错误:(1)功能不正确或遗漏的错误。(2)界面错误。(3)数据结构错误或外部数据库访问错误。(4)性能错误。(5)初始值和终止错误。2.白盒测试(white-boxtesting):也称结构测试或逻辑驱动测试,也就是已知产品的内部工作过程,清楚最终生成软件产品的计算机程序的结构和语句,按照程序内部的结构测试程序。白盒测试的主要方法有逻辑覆盖、循环覆盖和基本路径测试。逻辑覆盖又可分为语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖等。3.ALAC(Act-like-a-customer)测试:是一种基于客户使用产品的知识开发出来的测试方法,是基于复杂的软件产品有许多错误的原则。它的出发点是著名的“二八”规律。5.2.3人工测试与自动化测试1.人工测试:是相对于通过机器运行程序来测试而言,即不依赖于计算机的测试技术。主要方法:桌前检查(deskchecking),代码审查(codereview)和走查(walkthrough)。2.自动化测试:是通过测试工具或其他手段,按照测试工程师的预定计划对软件产品进行自动的测试。5.3软件测试的策略从不同的角度对于软件测试技术加以分类:从是否需要执行被测软件的角度,可分为静态测试和动态测试。从测试是否针对系统的内部结构和具体实现算法的角度可分为白盒测试和黑盒测试。按测试对象(Web、Client、Server、Database等)进行分类,涉及面向开发的单元测试、GUI和捕获/回放测试、基于web应用的测试、C/C++/Java应用测试、负载和性能测试、数据库测试、软件测试和QA管理等各类工具测试。其他测试方法,如回归测试、压力测试、恢复测试、安全测试和兼容性测试等。从另外三个角度来划分测试阶段测试操作类型包括调试、集成、确认、验证、组装、验收、操作等。测试操作对象可以是单元、部件、配置项、子系统、系统等。测试实施者可以是开发者、测试者、使用者、验收者等。按阶段进行测试:单元测试、集成测试、系统测试、验收测试5.3.1单元测试单元测试(UnitTesting)是在软件测试过程中进行的最早期的测试活动。1.单元测试的定义:单元测试是对软件基本组成单元进行的测试。单元测试的对象是软件设计的最小单位――模块。2.单元测试的目标和任务单元测试活动包括:制定总体计划,包括方法,资源和进度;确定待测特性;精化总体测试计划;设计测试用例;实现精化的计划和设计;执行测试过程;检查测试是否可以终止;评估测试效率和被测单元质量单元测试的主要任务有以下几点:(1)模块接口测试(2)模块局部数据结构测试(3)模块边界条件测试(4)模块中所有独立执行通路测试(5)模块的各条错误处理通路测试3.静态测试技术的运用静态测试技术是单元测试中最重要的手段之一,其含义是不运行被测程序而对其代码进行分析。静态测试主要包含走查(walkthrough)、审查(inspection)、评审(review)4.动态测试技术的运用完成静态测试后,还需真正地将程序运行起来完成动态测试。这就需要设计系列的测试用例确保测试的完整性和有效性。在测试用例的设计中,通常会综合白盒与黑盒测试方法。(1)白盒测试方法语句覆盖判定覆盖条件覆盖判定/条件覆盖条件组合覆盖路径覆盖循环测试(2)黑盒测试方法:主要运用于单元的功能和性能方面的策划死。为了执行单元测试用例,需要基于被测试单元的接口,开发相应的驱动模块(driver)和桩模块(stub)。黑盒测试常用的技术和方法包括:等价类划分法、边界值分析法、错误推测法、因果图法、功能图法。5.执行单元测试6.单元测试的过程与文档管理7.单元测试的常用工具简介测试工具按照测试的范围和功能,可以分为:静态分析工具;代码规范审核工具;内存和资源检查工具;测试数据生成工具;测试框架工具;测试结果比较工具;测试度量工具;测试文档生成和管理工具。常用的动态测试工具:JUnitFramework、IBMRationalPureCoverage、IBMRationalPurify、IBMRationalQuantify5.3.2集成测试将所有功能独立的模块经过严格的单元测试以后,接下来需要进行集成测试(integrationtest)。集成测试是将已分别通过测试单元按设计要求组合起来再进行的测试,以检查这些单元之间的接口是否存在问题。1.集成测试前的准备人员安排测试计划测试内容集成模式测试方法2.集成测试的模式非渐增式测试模式:先分别测试每个模块,再把所有模块按设计要求放在一起结合成所要的程序,如大棒模式(big-bangintegration)。渐增式测试模式:把下一个要测试的模块同已经测试好的模块结合起来进行测试,测试完以后,再把下一个应该测试的模块结合进来测试。3.自顶向下和自底向上集成方法(1)自顶向下法(top-downintegration):从主控制模块开始,沿着程序的控制层次向下移动,逐渐把各个模块结合起来。(2)自底向上法(bottom-upintegration):自底向上法从“原子”模块(即在软件结构最底层的模块)开始集成以进行测试(3)混合策略(modifiedtop-downintegration)ABCDEFGTestBTestATestCTestDTestA、B、C、DTestETestFTestGTestA、B、C、D、E、F、G4.大棒与三明治集成方法(1)大棒集成方法(big-bangintegration):采用大棒集成方法,先对每一个子模块进行测试(单元测试),然后将所有模块全部集成起来一次性进行集成测试ABCDEFGTestDTestETestGTestA、B、C、D、E、F、GTestBTestCTestF(2)三明治集成方法(sandwichintegration):三明治集成方法自两头向中间集成。ABCDEFGTestATestD、GTestETestFTestGTestA、B、C、D、E、F、GTestB、E、F(3)改进的三明治集成方法(modifiedsandwichintegration):不仅自两头向中间集成,而且保证每个模块得到单独的测试,使测试进行得比较彻底。ABCDEFGTestCTestD、GTestETestFTestGTestA、B、C、D、E、F、GTestB、E、FTestDTestA集成方法性能的比较名称自底向上自顶向下混合策略大棒三明治改进三明治集成早早早晚早早基本程序能工作的时间晚早早晚早早需要驱动模块是否是是是是需要桩模块否是是是是是工作并行性中低中高中高特殊路径测试容易难容易容易中等容易计划与控制容易难难容易难难5.持续集成6.回归测试5.3.3系统测试系统测试是将经过集成测试后的软件,作为计算机系统的一部分,与计算机硬件、某些支持软件、数据和人员等系统元素结合起来,在实际运行环境下对计算机系统了更进行一系列的严格有效的测试来发现软件的潜在问题,保证系统的运行。1.系统测试的内容:包括压力测试、容量测试、性能测试、安全测试、容错测试等2.回归测试5.3.4验收测试验收测试(acceptancetest)也称确认测试,它的目标是验证软件的有效性。验收测试是软件产品完成了功能测试和系统测试之后,在产品发布之前所进行的软件测试活动,它是技术测试最后一个阶段,通过了验收测试,产品就会进入发布阶段。1.验收测试的过程和主要内容(1)测试内容(2)测试步骤:第一步,测试计划在需求分析阶段建立,主要了解软件功能和性能要求、软硬件环境要求等,并特别要了解软件的质量要求和验收要求。第二步,建立测试环境。第三步,准备测试数据、执行测试用例,记录测试结果。第四步,分析测试结果。第五步,比较测试报告。第五步,比较测试报告。(3)验收测试完成标准(4)注意事项2.验收测试报告和用户验收测试验收测试QA在整个产品测试中的最后一个环节,完成并通过验收测试后我们需要提交验收测试报告,也称为发布报告(releasereport)。验收测试的结果有两种可能:一种是功能和性能指标满足软件需求说明的要求,用户可以接受;另一种是软件不满足软件需求说明的要求,用户无法接受。α测试与β测试5.3.5面向对象软件测试面向对象软件测试是根据面向对象的软件开发过程结合面向对象的特点提出的。它包括:分析与设计模型测试技术类测试技术(单元测试)对象交互测试技术(集成测试)类层次结构测试技术(集成测试)面向对象系统测试技术1.面向对象测试模型(Object-OrientTestModel)2.面向对象分析的测试(OOATest)面向对象分析(OOA)是把E-R图和语义网络模型,即信息造型中的概念,与面向对象程序设计语言中的重要概念结合在一起而形成的分析方法,最后通常是得到问题空间的图表的形式描述。OOA阶段的测试划分为以下五个方面:(1)对认定的对象的测试(2)对认定的结构的测试(3)对认定的主题的测试(4)对定义的属性和实例关联的测试(5)对定义的服务和消息关联的测试3.面向对象设计的测试(OODTest)面向对象设计(OOD)采用造型的观点,以OOA为基础归纳出类,并建立类结构或进一步构造成类库,实现分析结果对问题空间的抽象。对OOD的测试,建议针对功能的实现和重用以及对OOA结果的拓展,从如下三方面考虑:对认定的类的测试;对构造的类层次结构的测试;对类库的支持的测试。4.面向对象编程的测试(OOPTest)在面向对象编程(OOP)阶段,忽略类功能实现的细则,将测试的目光集中在类功能的实现和相应的面向对象程序风格,主要体现为以下两个方面:数据成员是否满足数据封装的要求;类是否实现了要求的功能。5.面向对象的单元测试(OOUnitTest)传统的单元测试是针对程序的函数、过程或完成某一定功能的程序块。沿用单元测试的概念,实际测试类成员函数。一些传统的测试方法在面向对象的单元测试中都可以使用。6.面向对象的集成测试(OOIntegrateTest)面向对象的集成测试通常需要在整个程序编译完成后进行。此外,面向对象程序具有动态特性,程序的控制流往往无法确定,因此也只能对整个编译后的程序做基于黑盒的集成测试。面向对象的集成测试可以分成两步进行:先进行静态测试,再进行动态测试。7.面向对象的系统测试(OOSystemTest)系统测试时,应该参考OOA分析的结果,对应描述的对象、属性和各种服务,检测软件是否能够完全再现问题空间。系统测试的具体测试内容包括:功能测试强度测试性能测试安全测试恢复测试可用性测试安装/卸载测试(install/uninstalltest)等等。8.GUI测试图形用户界面(GUI)对软件测试提出了有趣的挑战。GUI的复杂性也增加了,从而加大了设计和执行测试用例的难度。一般有许多自动化的GUI测试工具,如:jemmy,JFCunit等。G