1.3 软件测试概述
在信息技术飞速发展的今天,各种各样的软件产品越来越多,各个行业的发展都已经离不开软件,为保证软件产品的质量,软件测试工作越来越重要。但是有很多读者对于软件测试的基础知识还不是很了解,本节将针对软件测试的概念、目的与分类进行详细的讲解。
1.3.1 软件测试简介
在早期的软件开发中,软件大多是结构简单、功能有限的小规模软件,那个时候的测试就等同于调试。随着计算机软件技术的发展,调试慢慢成为软件开发不可或缺的工作内容,很多开发工具都集成了一些调试工具,但这个时候的调试还仅仅倾向于解决编译、单个方法的问题。
到20世纪50年代左右,随着软件规模越来越大,人们逐渐意识到仅仅依靠调试还不够,还需要验证接口逻辑、功能模块、不同功能模块之间的耦合等,因此需要引入一个独立的测试组织进行独立的测试。在这个阶段,人们往往将开发完成的软件产品进行集中测试,由于还没有形成测试方法论,对软件测试也没有明确定位与深入思考,测试主要是靠猜想和推断,因此测试方法比较简单,软件交付后还是存在大量问题。
经历这一阶段后,人们慢慢开始思考软件测试的真正意义。1973年,黑泽尔(Hetzel)博士第一次对软件测试进行了定义:软件测试是对程序或系统能否完成特定任务建立信心的过程。这个观点在一段时间内比较盛行,但随着软件质量概念的提出,它又不太适用了。1983年,黑泽尔(Heztel)博士对其进行了修改:软件测试是一项鉴定程序或系统的属性或能力的活动,其目的在于保证软件产品的质量。思想一旦爆发,就会呈现出百家争鸣的景象,这一时期,很多软件工程师或博士都提出了自己对软件测试的理解与定义。
G.J. 梅耶斯(G.J. Meyers)博士认为“软件测试是为了寻找错误而执行程序的过程”,相对于测试是为了证明程序中不存在错误,他的观点是正确的。
1983年,IEEE在北卡罗纳大学召开了首次关于软件测试的技术会议,然后对软件测试进行了如下定义:软件测试是使用人工或自动手段运行或测定某个系统的过程,其目的在于检验它是否满足规定的需求或是弄清楚预期结果与实际结果之间的差异。
IEEE定义的软件测试非常明确地提出了测试是为了检验软件是否满足需求,它是一门需要经过设计、开发和维护等完整阶段的过程。
此后,软件测试便进入了一个全新的时期,形成了各种测试方法、理论与技术,测试工具也开始广泛使用,慢慢地形成了一个专门学科。
虽然软件测试得到了长足的发展,但相比于软件开发,它的发展还是相对不足,测试工作几乎全部是在软件功能模块完成或者整个软件产品完成之后才开始进行,这样发现软件缺陷之后,开发人员再进行修改,会消耗大量的人力、物力成本。20世纪90年代后兴起敏捷模型的软件开发模式,促使人们对软件测试重新进行了思考,更多的人倾向于软件开发与软件测试的融合,即不再是软件完成之后再进行测试,而是从软件需求分析阶段,测试人员就参与其中,了解整个软件的需求、设计等,测试人员甚至可以提前开发测试代码,这也是我们在敏捷模型中所提到的“开发未动,测试先行”。软件开发与测试融合,虽然两者的界限变得模糊,但软件开发与测试工作的效率都得到了极大的提高,这种工作模式至今依然盛行。
归结起来,软件测试的发展过程可使用图1-8表示。
图1-8 软件测试发展过程
如今,随着人工智能与大数据时代的到来,软件测试更是受到越来越多的重视,但现在软件测试工作还依然沿用20世纪的方法、理论与思想成果,并没有突破性、革命性的进展。未来,随着软件开发模型与技术的发展,软件测试的思想与方法势必也会出现里程碑式的变化,这需要更多热爱软件测试的人员积极投入研究。
1.3.2 软件测试的目的
软件测试的目的大家都能随口说出,如查找程序中的错误、保证软件质量、检验软件是否符合客户需求等。这些都对,但它们只是笼统地对软件测试目的进行了概括,比较片面。结合软件开发、软件测试与客户需求可以将软件测试的目的归结为以下几点。
(1)对于软件开发来说,软件测试通过找到的问题缺陷帮助开发人员找到开发过程中存在的问题,包括软件开发的模式、工具、技术等方面存在的问题与不足,预防下次缺陷的产生。
(2)对于软件测试来说,使用最少的人力、物力、时间等找到软件中隐藏的缺陷,保证软件的质量,也为以后软件测试积累丰富的经验。
(3)对于客户需求来说,软件测试能够检验软件是否符合客户需求,对软件质量进行评估和度量,为客户评审软件提供有力的依据。
1.3.3 软件测试的分类
目前,软件测试已经形成一个完整的、体系庞大的学科,不同的测试领域都有不同的测试方法、技术与名称,有很多读者可能也听过类似的黑盒测试、白盒测试、冒烟测试、单元测试等,其实它们是按照不同的分类方法而产生的测试名称。按照不同的分类标准,可以将软件测试分为很多不同的种类。
1. 按照测试阶段分类
按照测试阶段可以将软件测试分为单元测试、冒烟测试、集成测试、系统测试与验收测试。这种分类方式与软件开发过程相契合,是为了检验软件开发各个阶段是否符合要求。
(1)单元测试
单元测试是软件开发的第一步测试,目的是为了验证软件单元是否符合软件需求与设计。单元测试大多是开发人员进行的自测。
(2)冒烟测试
冒烟测试最初是从电路板测试得来的,当电路板做好以后,首先会加电测试,如果电路板没有冒烟再进行其他测试,否则就必须重新设计后再次测试。后来这种测试理念被引入到软件测试中。在软件测试中,冒烟测试是指软件构建版本建立后,对系统的基本功能进行简单的测试,这种测试重点验证的是程序的主要功能,而不会对具体功能进行深入测试。如果测试未通过,需要返回给开发人员进行修正;如果测试通过则再进行其他测试。因此,冒烟测试是对新构建版本软件进行的最基本测试。
(3)集成测试
集成测试是冒烟测试之后进行的测试,它是将已经测试过的软件单元组合在一起测试它们之间的接口,用于验证软件是否满足设计需求。
(4)系统测试
系统测试是将经过测试的软件在实际环境中运行,并与其他系统的成分(如数据库、硬件和操作人员等)组合在一起进行的测试。
(5)验收测试
验收测试主要是对软件产品说明进行验证,逐行逐字地按照说明书的描述对软件产品进行测试,确保其符合客户的各项要求。
2. 按照测试技术分类
按照使用的测试技术可以将软件测试分为黑盒测试与白盒测试。
(1)黑盒测试
黑盒测试就是把软件(程序)当作一个有输入与输出的黑匣子,它把程序当作一个输入域到输出域的映射,只要输入的数据能输出预期的结果即可,不必关心程序内部是怎么样实现的,如图1-9所示。
图1-9 黑盒测试
(2)白盒测试
白盒测试又叫透明盒测试,它是指测试人员了解软件程序的逻辑结构、路径与运行过程,在测试时,按照程序的执行路径得出结果。白盒测试就是把软件(程序)当作一个透明的盒子,测试人员清楚地知道从输入到输出的每一步过程,如图1-10所示。
图1-10 白盒测试
相对于黑盒测试来说,白盒测试对测试人员的要求会更高一点,它要求测试人员具有一定的编程能力,而且要熟悉各种脚本语言。但是在软件公司里,黑盒测试与白盒测试并不是界限分明的,在测试一款软件时往往是黑盒测试与白盒测试相结合对软件进行完整全面的测试。
3. 按照软件质量特性分类
按照软件质量特性可以将软件测试分为功能测试与性能测试。
(1)功能测试
功能测试就是测试软件的功能是否满足客户的需求,包括准确性、易用性、适合性、互操作性等。
(2)性能测试
性能测试就是测试软件的性能是否满足客户的需求,性能测试包括负载测试、压力测试、兼容性测试、可移植性测试和健壮性测试等。
4. 按照自动化程度分类
按照自动化程度可以将软件测试分为手工测试与自动化测试。
(1)手工测试
手工测试是测试人员一条一条地执行代码完成测试工作。手工测试比较耗时费力,而且测试人员如果是在疲惫状态下,则很难保证测试的效果。
(2)自动化测试
自动化测试是借助脚本、自动化测试工具等完成相应的测试工作,它也需要人工的参与,但是它可以将要执行的测试代码或流程写成脚本,执行脚本完成整个测试工作。
5. 按照测试类型分类
软件测试类型有多种,包括界面类测试、功能测试、性能测试、安全性测试、文档测试等,其中功能测试与性能测试前面已经介绍,下面主要介绍其他几种测试。
(1)界面类测试
界面类测试是验证软件界面是否符合客户需求,包括界面布局是否美观、按钮是否齐全等。
(2)安全性测试
安全性测试是测试软件在没有授权的内部或外部用户的攻击或恶意破坏时如何进行处理,是否能保证软件与数据的安全。
(3)文档测试
文档测试以需求分析、软件设计、用户手册、安装手册为主,主要验证文档说明与实际软件之间是否存在差异。
6. 其他分类
还有一些软件测试无法具体归到哪一类,但在测试行业中也会经常进行这些测试,如α测试、β测试、回归测试等,具体介绍如下。
(1)α测试
α测试是指对软件最初版本进行测试。软件最初版本一般不对外发布,在上线之前,由开发人员和测试人员或者用户协助进行测试。测试人员记录使用过程中出现的错误与问题,整个测试过程是可控的。
(2)β测试
β测试是指对上线之后的软件版本进行测试,此时软件已上线发布,但发布的版本中可能会存在较轻微的Bug,由用户在使用过程中发现错误与问题并进行记录,然后反馈给开发人员进行修复。
小提示:根据软件开发版本周期划分软件测试
根据软件开发版本周期进行划分,可以将软件测试分为预览版本Preview测试、内部测试版本Alpha测试、公测版本Beta测试、候选版本Release测试。在这些测试完成之后产品就可以正式发布上线。
(3)回归测试
当测试人员发现缺陷以后,会将缺陷提交给开发人员,开发人员对程序进行修改,修改之后,测试人员会对修改后的程序重新进行测试,确认原有的缺陷已经消除并且没有引入新的缺陷,这个重新测试的过程就叫作回归测试。回归测试是软件测试工作中非常重要的一部分,软件开发的各个阶段都会进行多次回归测试。
(4)随机测试
随机测试是没有测试用例、检查列表、脚本或指令的测试,它主要是根据测试人员的经验对软件进行功能和性能抽查。随机测试是根据测试用例说明书执行测试用例的重要补充手段,是保证测试覆盖完整性的有效方式和过程。