1.4.4 软件测试的分类
软件测试的技术和方法是多种多样的,对于软件测试技术,可以从不同的角度加以分类。
1. 按测试方式分类
按测试方式进行分类,软件测试可分为静态测试和动态测试。
(1)静态测试。不需要执行所测试的程序,查询代码是否符合规范,对程序的数据流和控制流进行分析。
(2)动态测试。选择实际测试用例运行所测试程序,模拟用户输入。
2. 按测试方法分类
按测试方式进行分类,软件测试可分为白盒测试和黑盒测试。
(1)白盒测试。已知软件的实现流程,按照该流程测试,白盒测试又叫结构测试、白箱测试、玻璃盒测试、基于代码的测试或基于设计的测试。耗费大量的财力、物力,对所有代码进行白盒测试的可能性比较小,且对测试人员的要求比较高,所以一般只进行重点部分的白盒测试。
(2)黑盒测试。通过对照软件的规格说明书,基于系统应该完成的功能进行测试,测试人员必了解该产品的设计思路,黑盒测试又叫行为测试、功能测试或基于需求的测试。
(3)灰盒测试。灰盒(Gray Box)是一种程序或系统上的工作过程被局部认知的装置。灰盒测试,也称作灰盒分析,灰盒测试是介于白盒测试和黑盒测试之间的一种测试方法,或者说是两者的结合,是基于对程序内部细节有限认知上的软件调试方法。测试者可能知道系统组件之间是如何互相作用的,但缺乏对内部程序功能和运作的详细了解。它关注输出对于输入的正确性,同时也关注内部表现,但这种关注不像白盒测试那样详细、完整,只是通过一些表征性的现象、事件、标志来判断内部的运行状态。灰盒测试可以避免过度测试,精简冗余用例。
3. 按测试过程分类
在软件交付周期的不同阶段,通常需要依据不同类型的目标对软件进行测试,从独立程序模块开始,到最终进行验收测试,共分为4个过程。
(1)单元测试。单元测试在早期实施,侧重于核实软件的最小可测试元素,对单项功能或一段子程序进行测试,包括对每一行代码进行的基本测试。单元测试通常应用于实施模型中的构件,核实是否已覆盖控制流和数据流,以及构件是否可以按照预期工作,测试的内容包括界面测试、局部数据结构测试、边界条件测试、覆盖条件测试、出错处理等。
(2)集成测试。集成测试是将模块按照设计要求组装起来进行测试,主要目标是发现与接口有关的问题,主要测试模块之间的数据传输是否正确、模块集成后的功能是否实现、模块接口功能与设计需求是否一致。集成测试紧接在单元测试之后,当单元测试通过后,便可开始配置集成测试环境。
(3)系统测试。系统测试是将被测试的软件,作为整个基于计算机系统的一项元素,与计算机硬件、外部设备、支持软件、数据和人员等其他系统元素结合在一起,在实际运作环境下,对计算机系统进行一系列的测试,全面查找被测试系统的错误,测试系统的整体性、可靠性、安全性等,该类测试是从客户或最终用户的角度来看待系统的。
(4)验收测试。验收测试是为了检验接受测试的系统是否满足需求,测试的重点是测试产品在常规条件下的使用情况,主要由市场、销售、技术支持人员和最终用户一起按规定的需求,逐项进行有效性测试,检验软件的功能和性能及其他特性是否与用户的要求相一致,验收测试一般采用黑盒测试法。验收测试的基本事项包括功能确认(以用户需求规格说明为依据,检测系统对需求规定功能的实现情况)和配置确认(检查系统资源和设备的协调情况,确保开发软件的所有文档资料编写齐全,能够支持软件运行后的维护工作)。配置确认的文档资料包括设计文档、源程序、测试文档和用户文档等。
上述4个过程相互独立且顺序相接,依次进行。测试人员最初需要分别完成每个单元的测试任务,以确保每个模块能正常工作,单元测试大量地采用白盒测试方法,尽可能发现模块内部的程序差错。单元测试结束后,测试人员把已测试过的模块组装起来,进行集成测试,其目的在于检验与软件设计相关的程序结构问题,这时较多地采用黑盒测试方法来设计测试用例。完成集成测试以后,为检验被测试的软件能否与系统的其他部分(如硬件、数据库及操作人员)协调工作,需要进行系统测试。最后进行验收测试,是按规定的需求,对开发工作初期制定的确认准则进行检验。验收测试是检验所开发的软件能否满足所有功能和性能需求的最后手段,通常采用黑盒测试方法。
4. 按测试目的分类
按测试目的对测试进行分类的方法很多,大概有30多种测试类型,但是在实际工作中很多测试目的是互相交叉的。按照测试目的分类,测试主要包含下面的类型。
(1)功能测试。功能测试主要针对产品需求说明书对软件进行测试,验证软件功能是否符合需求,包括对原定功能的检验以及测试软件是否有冗余功能、遗漏功能。
(2)健壮性测试。健壮性测试侧重于对程序容错能力的测试,主要是验证程序在各种异常情况下是否能正确运行,包括数据边界测试、非法数据测试、异常中断测试等。
(3)接口测试。接口测试是对各个模块进行系统联调的测试,包括程序内接口测试和程序外接口测试。在接口测试中,测试人员在单元测试阶段进行一部分工作,大部分工作是在集成测试阶段完成的。
(4)性能测试。性能测试主要测试系统的性能是否满足用户要求,即在特定的运行条件下验证系统的能力状况。性能测试主要是通过自动化的测试工具模拟正常、峰值以及异常负载状况,对系统的各项性能指标进行测试,测试中得到的负荷和响应时间等数据可以被用于验证软件系统是否能够达到用户提出的性能指标。
(5)强度测试。强度测试是一种性能测试,强度测试总是迫使系统在异常的资源配置下运行。强度测试的目的是找出因资源不足或资源争用而导致的错误,例如,如果内存或磁盘空间不足,测试对象就可能会表现出一些在正常条件下并不明显的缺陷,这些缺陷可能由于争用共享资源(如数据库锁或网络带宽)而显现出来。一个系统在366MB内存下可以正常运行,但是降低内存容量后就不可能运行,系统提示内存不足,这个系统对内存的要求就是366MB。
(6)压力测试。压力测试是一种性能测试,主要是在超负荷环境中,检验程序是否能够正常运行。压力测试的目的是检测系统在资源超负荷的情况下的表现,是通过极限测试方法,发现系统在极限或恶劣环境中的自我保护能力。压力测试的目标是确定并确保系统在超出最大预期工作量的情况下仍能正常运行。此外,压力测试还要评估软件的性能特征,例如响应时间、事务处理速率和其他与时间相关的性能特征。例如,在B/S结构中,用户并发量测试就属于压力测试,测试人员可以使用Webload工具,模拟上百人客户同时访问网站,看系统响应时间,处理速度如何?
(7)用户界面测试。用户界面测试主要对系统的界面进行测试,测试用户界面是否友好、软件是否方便易用、系统设计是否合理、界面位置是否正确等问题。
(8)安全测试。安全测试主要测试系统防止非法侵入的能力,例如测试系统在没有授权的内部或者外部用户对系统进行攻击或者恶意破坏时如何运行,是否能够保证数据的安全。
(9)可靠性测试。可靠性测试是指为了保证和验证软件的可靠性水平是否满足用户的要求而进行的测试,即确定软件是否满足软件规格说明书中规定的可靠性指标。软件可靠性测试的目的是给出可靠性的定量估计值,通过对软件可靠性测试中观测到的失效数据进行分析,可以评估当前软件可靠性的水平,验证软件可靠性是否达到要求。软件可靠性测试是一项高投入的测试工作,通常需要进行大量的测试。
(10)安装/反安装测试。安装测试主要检验软件是否可以正确安装,安装文件的各项设置是否有效,安装后是否影响整个计算机系统;反安装测试是逆过程,测试软件是否被删除干净,删除后软件是否影响整个计算机系统等。
(11)文档测试。文档测试主要检查内部/外部文档的清晰性和准确性,对外部文档而言,测试工作主要针对用户的文档,以需求说明、用户手册、安装手册等为主,检验文档是否和实际应用存在差别,而且还必须考虑文档是否简单明了,相关的技术术语是否解释清楚等问题。
(12)恢复测试。恢复测试主要测试当出现系统崩溃、硬件错误或其他灾难性问题时系统的表现情况,以及系统从故障中恢复的能力。
(13)兼容性测试。兼容性测试主要测试软件产品在不同的平台、不同的工具软件或相同工具软件的不同版本下的兼容性,其目的是测试系统与其他软件、硬件兼容的能力。
(14)负载测试。负载测试是通过测试系统在资源超负荷情况下的表现,以发现设计上的错误或验证系统的负载能力。在这种测试中,将使测试对象承担不同的工作量,以评测和评估测试对象在不同工作量条件下的性能行为,以及持续正常运行的能力。负载测试的目标是确定并确保系统在超出最大预期工作量的情况下仍能正常运行。此外,负载测试还要评估性能特征。例如,响应时间、事务处理速率和其他与时间相关的方面。