软件测试基础理论
软件概念
软件(Software)是一系列按照特定顺序组织的计算机数据和指令的集合。一般来讲,软件被划分为系统软件、应用软件和介于这两者之间的中间件。在国标中对软件的定义是与计算机系统操作有关的计算机程序、规程、规则以及可能有的文件、文档及数据等。
软件生命周期
生命周期(Life Cycle)的概念应用很广泛,简单说就是指一个对象的“生老病死”。对一个软件产品或软件系统而言也需要经历同样阶段,一般称为软件生命周期。软件生命周期大致分为六个阶段
项目计划阶段
此阶段主要是确定软件开发的总体目标,通过市场调研并给出功能、性能、接口等方面的设想以及项目的可行性分析,同时对项目开发使用的资源、成本、进度做出评估,制定项目实施的计划(项目一级计划)。
需求分析阶段
需求俗称软件的主体,所以需求分析阶段作为一个非常重要的阶段,它由需求分析人员和用户共同对软件需要实现的各个功能进行详细的分析并给予确切的描述,并编写软件需求规格说明书(PRD)
软件设计阶段
该阶段俗称软件的核心,主要是由系统分析组(架构师和系统分析人员)根据需求分析的结果,对整个软件进行系统架构的设计,编写概要设计说明书(High Level Design,简称HLD)。接下来由数据库设计员和开发人员根据需求说明书和概要设计说明书进行系统数据库设计以及编写详细设计说明书(Low LevelDesign,简称LLD)。
程序编码阶段
把软件设计的结果转换为计算机可运行的程序代码,使用RDBMS工具建立数据库。程序编码必须符合标准和编码规范,以保证程序的可读性、易维护性,保证程序运行的效率。
软件测试阶段
此阶段主要是测试人员来检测软件是否符合客户的需求,是否达到质量的要求。一般在软件设计完成后,项目开发人员构建测试版本,以便测试团队进行测试,整个测试过程大致分为:单元测试、集成测试、系统测试、验收测试。
运行与维护阶段
此阶段是软件生命周期中最长的阶段。在软件开发完成并正式投入使用后,可能有很多原因需要对软件进行修改,如软件错误、系统升级、增加功能、提高性能等。
软件测试基本概念
测试(Test)就是为检测特定的目标是否符合标准而采用专用的工具或者方法进行验证,并最终得出特定的结果。软件测试(Software Testing)伴随着软件的诞生而产生。对软件而言,软件测试就是在有限的时间内提高软件质量的保证,是软件开发过程中非常重要的一部分。
软件测试发展
以调试为主
早在20世纪50年代,计算机刚诞生不久,只有科学家级别的人才会去编程,需求和程序本身也远远没有现在这么复杂多变,相当于编程人员承担需求分析、设计、开发、测试等所有工作,当然也不会有人去区分调试和测试。然而有些比较严谨的科学家们已经在开始思考“怎么知道程序满足了需求?”这类问题了。
以证明为主
在1957年,在《软件测试发展》(作者Charles Baker)一书中强调了调试和测试区分:1)调试(Debug),确保程序做了程序员想让它做的事情。
2)测试(Testing),确保程序解决了它该解决的问题。
这也是软件测试史上一个重要的里程碑,它标志软件测试终于自立门户了。随着计算机应用的数量,成本和复杂性都大幅度提升,其经济风险也大大增加,测试就显得很有必要了,这个时期测试的主要目就是确认软件是满足需求的,也就是我们常说的“做了该做的事情”。
以破坏为主
在1979年,测试界的经典之作《软件测试之艺术》(作者C.J.Myers)一书中给出了软件测试的经典定义:测试是为发现错误而执行程序的过程。这个观点较之前证明为主的思路,是一个很大的进步。我们不仅要证明软件做了该做的事情,也要保证它没做不该做的事情,这会使测试更加全面,更容易发现问题。
在书中,Myers还指出两点:好的测试用例是发现迄今为止尚未发现的错误的测试用例;成功的测试执行是发现了至今为止尚未发现的错误的测试执行。相对于“程序测试就是证明程序中不存在错误的过程”而言,Myers的定义是对的,但定义的测试范围过窄。
以评估为主
在1983年,美国国家标准局提出了测试界很有名的两个名词:验证(Verification)和确认(Validation),也就是我们常说的V&V理论。
人们提出了在软件生命周期中使用分析、评审、测试来评估产品的理论。软件测试工程在这个时期得到了快速的发展:相继出现了测试经理、测试分析师等职称以及发表大量测试刊物,发布相关国际标准。
同时IEEE提出的软件工程标准术语中给软件测试定义是:“使用人工或自动手段来运行或测定某个软件系统的过程,其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别”。也就是这个时期人们开始关注工具对测试的影响。
以预防为主
预防为主是当下软件测试的主流思想之一。STEP(产品模型数据交互规范,Systematic Test and Evaluation Process,简称STEP)是最早的一个以预防为主的生命周期模型,STEP认为测试与开发是并行的,整个测试的生命周期也是由计划、分析、设计、开发、执行和维护组成,也就是说,测试不是在编码完成后才开始介入,而是贯穿于整个软件生命周期。
软件测试目的
从上述测试的发展来看,软件测试的目的也有一个阶段性的变化,我们通过下图来分析一下软件测试目的的演进。如图1-7所示。
证明
保证软件产品是完整的并且可用或可被集成,同时需要尝试在非正常情况下的功能和特性是否可用,评估系统的风险承受能力。
检测
发现缺陷、错误和系统不足的地方,定义系统的能力和局限性,并提供相关的组件、工作产品和系统质量信息。
预防
提供预防和减少可能导致错误的信息,在过程中尽早地检测错误,确认问题和风险,并且提前确认解决这些问题和风险的途径。
软件测试目的往往包含如下内容:
1)测试并不仅是为了找出错误,而且要通过分析错误产生的原因和错误的发生趋势,帮助项目管理者发现当前软件开发过程中的缺陷,以便及时改进。
2)需要测试工程师设计出具有针对性的测试方法,以改善测试的有效性。
3)没有发现错误的测试也是有价值的,完整的测试是评估软件质量的一种方法。
综上来看软件测试目的是指尽可能早的发现软件中存在的缺陷并提高软件质量。
软件测试原则
软件测试理论经过几十年的发展,在测试界提出了很多测试的基本原则,概括出以下8条软件测试基本原则。
1.所有的测试要追溯到用户的需求
在所有测试活动的过程中,测试人员都应该从客户的需求出发,想用户所想。正如我们所知,软件测试的目标就是验证产品开发的一致性和确认产品是否满足客户的需求,与之对应的任何产品质量特性都应追溯到用户需求。简单说就是一切从用户角度出发。
2.测试应尽早地介入
根据统计表明,在软件开发生命周期早期引入的错误占软件过程中出现所有错误(包括最终的缺陷)数量的50%~60%。此外,IBM的一份研究结果表明,缺陷存在放大的趋势。所以越是测试后期,为修复缺陷所付出的代价就会越大。因此,软件测试人员要尽早地且不断地进行软件测试,以提高软件质量,降低软件开发成本。
3.测试无法穷举
在整个测试过程中,测试人员无法考虑到所有可能输入值和它们的组合以及结合所有不同的测试前置条件;所以穷举测试是不可能的,当测试满足一定的出口准则时,测试就应当终止。因此,想要控制测试工作量,在测试成本、收益和风险之间求得平衡;需要通过风险分析、优先级分析以及软件质量模型和不同测试的方法来确定测试关注点,从而代替穷举测试,提高测试覆盖率。
4.避免开发者自测
测试工作需要严谨的作风、冷静的分析。心理学告诉我们,每个人都具有一种不愿否定自己工作的心理,这种状态导致测试自己程序的障碍。同时,程序员对需求规格说明的错误理解而引入的错误是很难被发现。因此,程序员应避免测试自己的程序,为达到最佳的效果,应由独立的测试小组、第三方来完成测试。
5.群集现象
Pareto Principle帕累托法则(二八定律)表明:80%的错误集中在20%的程序模块中。也就是说,测试所发现的大部分缺陷和软件运行失效是由少数程序模块引起的。因此,测试过程中要充分注意群集现象,对发现错误较多的程序段或者软件模块,应进行反复的深入的测试。
6.杀虫剂悖论
杀虫剂用得多了,害虫就有免疫力,杀虫剂就发挥不了效力。同样在测试中,如果测试用例被反复使用时,发现缺陷的能力就会越来越差。为了避免克服这种现象出现,测试用例需要进行定期评审和修改,不断增加新的不同的测试用例来测试软件或系统的不同部分,从而发现更多潜在的缺陷。作为专业的测试人员来说,要具有探索性思维和逆向思维。同理,测试方法也需要不断地变化。
7.不存在缺陷的谬论
通过测试可以减少软件中存在未被发现缺陷的可能性,但即使测试没有发现任何缺陷,也不能证明软件或系统是完全正确的。也就是说,测试只能证明软件存在缺陷,不能证明软件不存在缺陷。比如,不能满足用户期望的或用户不满意,也是一种缺陷。
8.测试活动依赖于测试背景
针对不同的测试背景,进行的测试活动也不同,测试策略和测试方法在选取上也有所不同。比如,银行产品和电商平台。在银行产品中要将安全放到首位;在电商平台中要把兼容性、性能放到首位。在实际测试过程中,测试人员应该在测试原则指导下进行测试活动。
软件测试原则有助于测试人员进行高质量的测试,尽早尽可能多的发现缺陷,并负责跟踪和分析软件中的问题,对存在的问题和不足提出质疑和改进,从而持续改进测试过程。