什么是软件测试?人们常常回答:软件测试就是发现软件产品中的Bug(缺陷)。也有人说,不对,软件测试是验证软件产品特性是否满足用户的需求。实际上,上述回答都没错,是对软件测试的正反两个方面的解释。
(1)软件测试就是发现软件产品中的Bug,强调测试人员以逆向思维方式,不断思考开发人员可能存在的误区、不良的习惯、系统的边界条件、异常输入和操作、系统弱点和漏洞等,更快地发现软件系统的问题。毕竟开发人员力求构造软件,以正向思维方式为主,所以测试人员从逆向思维出发,可以获得更高的测试效率。
(2)软件测试是验证软件产品特性是否满足用户的需求,是以正向思维方式针对软件系统的所有功能点,逐个验证其正确性,这是传统工业的质检工作在软件业的自然延伸。
但仅仅这样理解软件测试还不够,需要更全面的理解软件测试,就可以更好地做好工作,也可以适应不同的软件开发过程所带来的挑战,包括敏捷方法带给软件测试的极大挑战。
将近30年前,G.J.Myers在其经典著作《软件测试之艺术》(The Art of Software Testing)一书中,给出了测试的定义:“程序测试是为了发现错误而执行程序的过程”。那时对软件测试的认识还非常具有局限性,这也是受软件开发瀑布模型的影响,认为软件测试是编程之后的一个阶段。只有等待代码开发出来之后,通过执行程序,像用户那样操作软件发现问题,这就是“动态测试”。
如果在此时发现功能设计不合理或性能不好,就需要修改需求或修改设计,那就不得不返工到需求定义或系统设计阶段,造成很大的代价。所以,有必要将软件测试延伸到需求、设计阶段,即对阶段性成果——需求定义文档、设计技术文档进行验证,从而将动态测试延伸到静态测试,尽早地发现问题,把问题消灭在萌芽之中,将每个阶段产生的缺陷及时清除,极大地提高产品的质量,有效地降低企业的成本。静态测试就是在不运行软件系统时对软件或阶段性成果进行评审,包括需求评审、设计评审、代码扫描、代码评审等。
软件测试从“ 动态测试 ”延伸到“ 静态测试 ”,是从 狭义的软件测试 发展到 广义的软件测试 , 也使“软件测试”不再停留在编程之后的某个阶段上,而是贯穿整个软件开发生命周期(Software Development Life Cycle,SDLC)的质量保证活动。有了广义软件测试的概念,在敏捷开发中, 软件测试就能被解释为对软件产品质量的持续评估 。 在敏捷方法中,不仅提倡持续集成,而且提倡持续测试,持续集成实际上也是为了持续测试。
从国际标准对软件测试的定义来看,软件测试被看做是“验证(Verification)”和“有效性确认(Validation)”这两类活动构成的整体,缺一不可。如果只做到其中一项,测试是不完整的。
(1)“验证”是检验软件是否已正确地实现了产品规格书所定义的系统功能和特性。验证过程提供证据表明软件相关产品与所有生命周期活动的要求相一致,即验证软件实现(即交付给客户的产品)是否达到了软件需求定义和设计目标。
(2)“有效性确认”是确认所开发的软件是否满足用户实际需求的活动。因为软件需求定义和设计可能就不对,上述一致性不能保证软件产品符合客户的实际需求,而且客户的需求也是在变化的,当需求定义是半年前确定的,这种变化的可能性就比较大。
软件不同于硬件,软件一般都是应用系统,常常和人们的娱乐、事务处理、商业活动、社区交流等紧密联系在一起,所以软件具有很强的社会性,所以有测试专家把测试和社会性、人类学等联系起来,认为软件测试是跨学科的(interdisciplinary)活动,以系统为焦点(systems-focused),通过不断调查(investigative)和讲故事(storytelling)方式完成软件质量的评估。通过其社会性,强调测试人员的思维能力和探索能力,强调测试的有效性和可靠性,在测试中要理解用户的行为、人们活动的背景和目的(上下文关系),不断观察,不断学习,发现和质量相关的信息(差异或质疑),从客户利益出发来守护产品的价值。
概括起来,究竟什么是软件测试呢?可以这样说,软件测试是贯穿整个软件开发生命周期、对软件产品(包括阶段性产品)进行验证和确认的活动过程,也是对软件产品质量持续的评估过程,其目的是尽快尽早地发现在软件产品(包括阶段性产品)中所存在的各种问题,尽最大可能地消除软件开发过程中所存在的产品质量风险。