当程序无法实现最终用户要求的合理功能时,就会发生一个软件错误。
根据这个定义,即使完成了一次非常完美的模块测试,仍然不能保证已经找出了程序的所有错误。因此,要结束整个测试任务,必须进行其他形式的更深入的测试,将这些新型形式的测试称为“更高级别的测试”
软件开发周期的文档说明:
●要求规格说明定义了为什么要开发程序
●目标定义了程序要做什么,以及做得怎样
●外部规格说明了程序对用户的准确表现
●与后续阶段相关的文档越来越详细地规定了程序是如何建立起来的
确定软件开发周期7个阶段包括了信息的沟通,理解和转换,以及大多数的软件错误都源于信息处理中的故障,现在有三个方法来预防和识别这些错误。
- 可以是软件开发过程更加精密,以防其中有很多错误。
- 引入独立的验证过程,在进入下一阶段前尽可能多地发现错误。
- 对不同的阶段的采用不同的测试方法,应该在开发和测试过程之间建立一对一的联系。
●模块测试的目的是是发现程序与规格说明之间的不一致
●功能测试的目的是为了说明程序未能符合其外部规格说明
●系统测试的目的是为了证明软件产品与其初始目标不一致
注:我们讨论功能测试,系统测试,验收测试和安装测试的过程。这里忽略了集成测试。因为集成测试往往不是作为独立测试步骤,而且在增量模块测试中,它是模块测试的隐含部分。
1.功能测试
功能测试是一个试图发现程序与其外部规格说明之间存在的不一致的过程。外部规格说明是一份最终的用户角度对程序行为的精确描述。
功能测试通常是一项黑盒操作,也就是说,依赖早期的模块测试过程来实现理想的白盒逻辑规则。
在功能测试时,需要对规格说明进行说明以获取测试用例集,如等价类划分,边界值分析,因果图分析和错误猜测法。最后应该牢记测试的目的是为了暴露程序的错误以及规格说明不一致之处,而不是为了证明程序符合外部说明。
2.系统测试
系统测试并不是测试整个系统或程序功能的过程。因为有了功能测试这样会显得多余。系统测试有着特定的目的:将系统或程序与其初始目标进行比较,给定这个目标后,隐含两方面的含义:
- 系统测试并不局限于系统,如果产品是一个程序,那么系统测试就是一个试图说明程序作为一个整体是如何不满足其目标的过程。
- 根据定义,如果产品没有一组书面的,可度量的目标,系统测试将无法进行。
再寻找程序与其目标不一致的过程中,应重点注意那些设计外部规格说明所犯的错误。这也暗示了与功能测试不同,外部规格说明不能作为系统测试用例的基础,否则就破坏了系统测试的目标。另一方面,也不能用文档本身表示测试用例,因为这些文档并不包含对接口的准确描述。
克服方法:利用程序的用户文档,通过分析目标文档来设计系统测试,分析用户文档来阐明测试用例。
目标虽已阐明,但没有确认生成测试用例的方法,仅含一些含糊却有用的指南来指导如何编写测试用例,以证明程序与中的目标文档每一句都存在不一致性。事实上,设计好的系统测试用例比设计系统或程序需要更多的创造性。
2.1能力测试
最明显的系统测试类型是判断目标文档提及的每一项能力是否确实以实现,能力测试的语句是逐条检查目标文档,语句定义了一个“要做什么”,就判断该程序是否满足,这种类型的测试常常在不同的计算机情况下运行,又是人工对目标文档和用户文档进行比较久足够了。
2.2容量测试
是使程序经受大容量数据的检验,例如:编译器可能要处理编译规模非常大的源程序,编译器可能需要处理一个包含上千模块的程序等等。而操作系统的作业队列可能已经达到饱和容量。如果程序需要处理跨越不同的卷,则应产生足够的数据使程序从一个卷转到另一个中。故:容量测试的目的是为了证明程序不能处理目标文档中规定的数据容量
2.3强度测试
强度测试使程序承受高负载或强度的检验。所谓高强度就是指在短时间间隔内达到数据或操作的数量峰值。类似一名打字员,容量测试是判断打字员能否处理大篇幅的稿子,而强度测试是判断打字员能否达到每分钟50个单词的速度。
基于web的应用程序是最长接受强度测试的软件之一,在这里,我们需要确信是应用程序以及硬件能够处理一定容量 的并发用户,但有人会狡辩说,也许数百万人在同一时刻访问该站点,但这是不现实的,我们需要弄清用户群,然后设计一个强度测试,体现出可能访问站点的最大人群的情况。
2.4易用性测试
今天的软件系统,尤其那些广大的商业市场而设计的软件。通常有广泛的人为因素的研究。列举测试中的一些问题:
- 每个用户界面是否能够根据最终用户的智力,教育背景和环境进行了调整
- 程序输出是否有意义,不模糊且没有计算机杂乱信息
- 诊断错误(如错误信息)是否直接。
- 整体的用户界面是否在语法,惯例,语义,格式,风格和缩写方面展现出相当程度的概念完整性。
- 在准确性极为重要的环境中,如网上银行系统,输入中是否有足够的冗余信息例如:该系统可能会要求输入账号,用户名和PIN来验证访问账号信息是合法用户。
- 系统是否包含过多或不大可能遇到的选项?
- 对于所有的输入,系统是否返回了某些类型的及时的确认消息。
- 程序是否易用。如输入是否区分大小写这一点对用户来说是否清楚。此外,如果需要浏览一系列的菜单操作,返回主菜单的方法是否清楚。
2.5安全型测试
安全性测试是设计测试用例来破坏程序安全性检查的过程。举例来说,我们可以设计测试用例来规避操作系统的内存保护机制,破坏数据库管理系统的数据安全机制。设计这种测试用例的方法之一是研究类似系统中已知的安全问题,然后生成测试用例,尽量暴露被测系统存在的相似问题。
基于web的应用程序常常比绝大多数程序所需的安全测试级别更高,对于电子商务网站尤其如此,尽管已经有了足够多的技术(密码学)允许客户在因特网上安全地完成交易,但不能单纯地依赖技术的应用来确保安全。
2.6性能测试
很多软件都有特定的性能或效率目标,这些特性描述在特定负载和配置环境下程序响应时间和吞吐量,再一次强调,由于系统测试的目的是为了证明程序不能实现其目标,因此,应设计测试用例来说明程序不能满足其性能目标。
2.7存储测试
类似的,软件可能偶尔有存储目标,举例来说,可能描述了程序使用内存和辅存的容量,以及临时文件或溢出文件的大小,应用测试用例来证明这些存储目标没有得到满足。
2.8配置测试
诸如操作系统,等都支持多种硬件配置,包括I/O设备,通信线路,或不同的存储容量。通常可能配置的数量非常大,无法面面俱到,但至少有一种类型的设备,以最大最小的配置来测试程序。如软件本身的配置可忽略掉某些程序组件,或可运行在不同的计算机上,软件所有可能的配置都应测试到。
如今的软件都设计在可运行的多种操作系统环境下,因此如果设计此类程序,应该在该程序面向的所有操作环境中进行测试。
2.9兼容性/配置/转换测试
大多数开发软件并不是全新的,常常为了替换掉某些不完善的软件,往往有着特定的目标,设计现有系统的兼容以及现有系统的转换过程。针对这些目标测试程序,测试用例的目的是为了兼容性目标未被满足,转换过程为生效。将数据从一个系统转换到另一个系统时,应尽力发现这些错误。升级数据库管理就是一个例子。很多不同的方法测试这个过程,但这些方法都高度依赖于所用的数据库系统。
2.10安装测试
有些类型的软件系统安装过程非常复杂,测试安装过程是系统测试中一个重要的部分,对于包在软件安装包的自动安装系统而言,尤其重要,安装如果出现错误,可能会影响用户对软件的成功体验。
2.11可靠性测试
当然,所有类型的测试是为了提高软件的可靠性,但软件的目标中包含了对可靠性的特别描述,就必须专门设计可靠性测试。此种类型的软件证明或测试听起来很复杂,但是对于那些必须维持非常高的正常时间运行时间的系统。重要性日益增加。
2.12可恢复性测试
诸如操作系统,数据库管理系统,和远程处理系统等软件,通常有可恢复性目标,说明系统是如何从错误、硬件失效和数据错误中恢复过来,系统测试的一个目标是为了证明这些恢复机制不能够正常发挥作用。我们可以故意将程序错误步入某个系统中,判断系统是否可以从中恢复。诸如内存错误,I/O错误等硬件错误可以模拟。而如通信中的线路噪音或数据库中的无效指针等数据错误也可以模拟出来。以分析系统的反应。
2.13适用性测试