测试阶段划分

从测试阶段的划分可以分为单元测试、集成测试、系统测试、确认测试。下面内容来自网络相关资料的整理。

1.单元测试

    (1)定义:单元测试(又称为模块测试)是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。

   (2)单元测试任务包括:

1 模块接口测试;

2 模块局部数据结构测试;

3 模块边界条件测试;

4 模块中所有独立执行通路测试;

5 模块的各条错误处理通路测试。


  模块接口测试是单元测试的基础。只有在数据能正确流入、流出模块的前提下,其他测试才有意义。测试接口正确与否应该考虑下列因素:

  1 输入的实际参数与形式参数的个数是否相同;

  2 输入的实际参数与形式参数的属性是否匹配;

  3 输入的实际参数与形式参数的量纲是否一致;

  4 调用其他模块时所给实际参数的个数是否与被调模块的形参个数相同;

  5 调用其他模块时所给实际参数的属性是否与被调模块的形参属性匹配;

  6 调用其他模块时所给实际参数的量纲是否与被调模块的形参量纲一致;

  7 调用预定义函数时所用参数的个数、属性和次序是否正确;

  8 是否存在与当前入口点无关的参数引用;

  9 是否修改了只读型参数;

  10 对全程变量的定义各模块是否一致;

  11是否把某些约束作为参数传递。


  如果模块内包括外部输入输出,还应该考虑下列因素:

  1 文件属性是否正确;

  2 OPEN/CLOSE语句是否正确;

  3 格式说明与输入输出语句是否匹配;

  4缓冲区大小与记录长度是否匹配;

  5文件使用前是否已经打开;

  6是否处理了文件尾;

  7是否处理了输入/输出错误;

  8输出信息中是否有文字性错误;


  检查局部数据结构是为了保证临时存储在模块内的数据在程序执行过程中完整、正确。局部数据结构往往是错误的根源,应仔细设计测试用例,力求发现下面几类错误:

  1 不合适或不相容的类型说明;

  2 变量无初值;

  3 变量初始化或省缺值有错;

  4 不正确的变量名(拼错或不正确地截断); 

  5 出现上溢、下溢和地址异常。


  除了局部数据结构外,如果可能,单元测试时还应该查清全局数据(例如FORTRAN的公用区)对模块的影响。


  在模块中应对每一条独立执行路径进行测试,单元测试的基本任务是保证模块中每条语句至少执行一次。此时设计测试用例是为了发现因错误计算、不正确的比较和不适当的控制流造成的错误。此时基本路径测试和循环测试是最常用且最有效的测试技术。计算中常见的错误包括:

  1 误解或用错了算符优先级;

  2混合类型运算;

  3变量初值错;

  4精度不够;

  5表达式符号错。


  比较判断与控制流常常紧密相关,测试用例还应致力于发现下列错误: 

  1不同数据类型的对象之间进行比较;

  2错误地使用逻辑运算符或优先级;

  3因计算机表示的局限性,期望理论上相等而实际上不相等的两个量相等;

  4比较运算或变量出错;

  5循环终止条件或不可能出现;

  6迭代发散时不能退出;

  7错误地修改了循环变量。


  一个好的设计应能预见各种出错条件,并预设各种出错处理通路,出错处理通路同样需要认真测试,测试应着重检查下列问题:

  1输出的出错信息难以理解;

  2记录的错误与实际遇到的错误不相符;

  3在程序自定义的出错处理段运行之前,系统已介入;

  4异常处理不当;

  5错误陈述中未能提供足够的定位出错信息。


  边界条件测试是单元测试中最后,也是最重要的一项任务。众的周知,软件经常在边界上失效,采用边界值分析技术,针对边界值及其左、右设计测试用例,很有可能发现新的错误。

   (3)单元测试过程

  一般认为单元测试应紧接在编码之后,当源程序编制完成并通过复审和编译检查,便可开始单元测试。测试用例的设计应与复审工作相结合,根据设计信息选取测试数据,将增大发现上述各类错误的可能性。在确定测试用例的同时,应给出期望结果。

  应为测试模块开发一个驱动模块(driver)和(或)若干个桩模块(stub),下图显示了一般单元测试的环境。驱动模块在大多数场合称为“主程序”,它接收测试数据并将这些数据传递到被测试模块,被测试模块被调用后,“主程序”打印“进入-退出”消息。

  驱动模块和桩模块是测试使用的软件,而不是软件产品的组成部分,但它需要一定的开发费用。若驱动和桩模块比较简单,实际开销相对低些。遗憾的是,仅用简单的驱动模块和桩模块不能完成某些模块的测试任务,这些模块的单元测试只能采用下面讨论的综合测试方法。

  提高模块的内聚度可简化单元测试,如果每个模块只能完成一个,所需测试用例数目将显著减少,模块中的错误也更容易发现。集成测试:在单元测试的基础上,将模块按照设计要求组装进行测试。一般包括逻辑关系检查、数据关系检查、业务关系检查、模块间接口检查、外部接口检查。


2.集成测试

    (1)定义: 集成测试也叫组装测试、联合测试、子系统测试或部件测试。集成测试是在单元测试的基础上,将所有模块按照概要设计要求组装成为子系统或系统。

   (2)集成测试的关注点:

  1.在把各个模块连接起来时,穿越模块接口的数据是否会丢失。

  2.各个子功能组合起来,能否达到预期的要求的父功能。

  3.一个模块的功能是否会对另一个模块的功能产生不利的影响。

  4.全局数据结构是否有问题,会不会被异常修改。

  5.单个模块的误差积累起来,是否会放大,从而达到不可接受的程度。

   (3)集成测试的模式:

     ① 非增殖式集成方式。先分别测试每个模块,再把所有模块按设计要求一次全部组装起来所要的系统,然后进行整体测试。使用这种方式可能发现一大堆错误,但为每个错误定位和纠正非常困难,并且在改正一个错误的同时又可能引入新的错误,新旧错误混杂,更难断定出错的原因和位置。

  ② 增殖式集成方式。又称渐增式集成方式。首先对一个个模块进行模块测试,然后将这些模块逐步组装成较大的系统,在组装的过程中边连接边测试,以发现连接过程中产生的问题。最后通过增殖逐步组装成为要求的软件系统。 常用的增殖方法有:自顶向下集成测试、自底向上集成测试、核心集成测试等。

  自顶向下的增殖方式:将模块按系统程序结构,沿控制层次自顶向下进行集成。由于这种增殖方式在测试过程中较早地验证了主要的控制和判断点。在一个功能划分合理的程序结构中,判断常出现在较高的层次,较早就能遇到。如果主要控制有问题,尽早发现它能够减少以后的返工。

  自底向上的增殖方式:从程序结构的最底层模块开始组装和测试。因为模块是自底向上进行组装,对于一个给定层次的模块,它的子模块(包括子模块的所有下属模块)已经组装并测试完成,所以不再需要桩模块。在模块的测试过程中需要从子模块得到的信息可以直接运行子模块得到。

    自顶向下增殖的方式和自底向上增殖的方式各有优缺点。自顶向下增殖方式的缺点是需要建立桩模块。要使桩模块能够模拟实际子模块的功能将是十分困难的。同时涉及复杂算法和真正输入/输出的模块一般在底层,它们是最容易出问题的模块,到组装和测试的后期才遇到这些模块,一旦发现问题,导致过多的回归测试。而自顶向下增殖方式的优点是能够较早地发现在主要控制方面的问题。自底向上增殖方式的缺点是“程序一直未能做为一个实体存在,直到最后一个模块加上去后才形成一个实体”。就是说,在自底向上组装和测试的过程中,对主要的控制直到最后才接触到。但这种方式的优点是不需要桩模块,而建立驱动模块一般比建立桩模块容易,同时由于涉及到复杂算法和真正输入/输出的模块最先得到组装和测试,可以把最容易出问题的部分在早期解决。此外自底向上增殖的方式可以实施多个模块的并行测试。

  核心集成测试:核心系统先行集成测试法的思想是先对核心软件部件进行集成测试,在测试通过的基础上再按各外围软件部件的重要程度逐个集成到核心系统中。每次加入一个外围软件部件都产生一个产品基线,直至最后形成稳定的软件产品。核心系统先行集成测试法对应的集成过程是一个逐渐趋于闭合的螺旋形曲线,代表产品逐步定型的过程。  

③ 混合增殖式测试


  3. 系统测试

    (1)定义:系统测试是在所有单元、集成测试后,对系统的功能及性能的总体测试。

    (2)系统测试内容:系统不仅仅包括软件本身,而且还包括计算机硬件及其相关的外围设备、实际运行时大批量数据、非正常操作(如黑客攻击)等。通常意义上的系统测试包括压力测试、容量测试、性能测试、安全测试、容错测试等。


  · 压力测试(s"esstest):也称为强度测试、负载测试。压力测试是模拟实际应用的软硬件环境及用户使用过程的系统负荷,长时间或超大负荷地运行测试软件,来测试被测系统的性能、可靠性、稳定性等。压力测试的目的就是在软件投入使用以前或软件负载达到极限以前,通过执行可重复的负载测试,了解系统硼J靠性、性能瓶颈等,以提高软件系统的可靠性、稳定性,减少系统的宕机时间和因此带来的损失。


  · 容量测试(c印ac时test):预先分析出反映软件系统应用特征的某项指标的极限值,如某个web站点可以支持多少个并发用户的访问量、网络在线会议系统的与会者人数。知道了系统的实际容量,如果不能满足要求,就应该寻求新的解决方案, 以提高系统的容量。若一时没有新的解决方案,就有必要在产品发布说明书上明确这些容量的限制,避免引起软件产品使用上的纠纷。如果实际容量已满足要求,就能帮助用户建立对产品的信心。


  · 性能测试(pe晌nllance test):通过测试确定系统运行时的性能表现,如得到运行速度、响应时间、占有系统资源等方面的系统数据。对丁那些实时或嵌入式系统,系统有时满足了功能要求,但未必能够满足性能要求,如某个}{_9站可以被访问, 而且司以提供预先设定的功能,但每打开一个页面都需要1~2分钟,用户不可忍 受,其结果没有用户愿意使用这个网站所提供的服务。


  · 安全测试(securhyten):检查系统对非法侵入的防范能力。安全测试期间。测试人员假扮非法入侵者,采用各种办法试图突破防线。系统安全设计的准则是,使非法侵入的代价超过被保护信息的价值。


  · 容错测试(recovervtest):主要检查系统的容错能力。当系统出错时,能否在指定时间间隔内修正错误并重新启动系统。容错测试首先要通过各种手段,让软件强制性地发生故障,然后验证系统是否能尽快恢复。对于自动恢复需验证熏新初始化、检查点、数据恢复和重新启动等机制的正确性

4.确认测试

    (1)定义:确认测试又称有效性测试。有效性测试是在模拟的环境下,运用黑盒测试的方法,验证被测软件是否满足需求规格说明书列出的需求。任务是验证软件的功能和性能及其他特性是否与用户的要求一致。对软件的功能和性能要求在软件需求规格说明书中已经明确规定,它包含的信息就是软件确认测试的基础。

      确认测试的目的是向未来的用户表明系统能够像预定要求那样工作。经集成测试后,已经按照设计把所有的模块组装成一个完整的软件系统,接口错误也已经基本排除了,接着就应该进一步验证软件的有效性,这就是确认测试的任务,即软件的功能和性能如同用户所合理期待的那样。

    (2)基本方法:

   通过集成测试之后,软件已完全组装起来,接口方面的错误也已排除,确认测试即可开始。确认测试应检查软件能否按合同要求进行工作,即是否满足软件需求说明书中的确认标准。

  1. 确认测试标准

  实现软件确认要通过一系列黑盒测试。确认测试同样需要制订测试计划和过程,测试计划应规定测试的种类和测试进度,测试过程则定义一些特殊的测试用例,旨在说明软件与需求是否一致。无论是计划还是过程,都应该着重考虑软件是否满足合同规定的所有功能和性能,文档资料是否完整、准确人机界面和其他方面(例如,可移植性、兼容性、错误恢复能力和可维护性等)是否令用户满意。

  确认测试的结果有两种可能,一种是功能和性能指标满足软件需求说明的要求,用户可以接受;另一种是软件不满足软件需求说明的要求,用户无法接受。项目进行到这个阶段才发现严重错误和偏差一般很难在预定的工期内改正,因此必须与用户协商,寻求一个妥善解决问题的方法。

  2. 配置复审

  确认测试的另一个重要环节是配置复审。复审的目的在于保证软件配置齐全、分类有序,并且包括软件维护所必须的细节。

  3. α、β测试

  事实上,软件开发人员不可能完全预见用户实际使用程序的情况。例如,用户可能错误的理解命令,或提供一些奇怪的数据组合,亦可能对设计者自认明了的输出信息迷惑不解,等等。因此,软件是否真正满足最终用户的要求,应由用户进行一系列“验收测试”。验收测试既可以是非正式的测试,也可以有计划、有系统的测试。有时,验收测试长达数周甚至数月,不断暴露错误,导致开发延期。一个软件产品,可能拥有众多用户,不可能由每个用户验收,此时多采用称为α、β测试的过程,以期发现那些似乎只有最终用户才能发现的问题。

  α测试是指软件开发公司组织内部人员模拟各类用户行对即将面市软件产品(称为α版本)进行测试,试图发现错误并修正。α测试的关键在于尽可能逼真地模拟实际运行环境和用户对软件产品的操作并尽最大努力涵盖所有可能的 用户操作方式。经过α测试调整的软件产品称为β版本。紧随其后的β测试是指软件开发公司组织各方面的典型用户在日常工作中实际使用β版本,并要求用户报告异常情况、提出批评意见。然后软件开发公司再对β版本进行改错和完善。

你可能感兴趣的:(软件测试)