软件测试在软件生命周期中占据重要的地位,在传统的瀑布模型中,软件测试处于编码之后、运行维护阶段之前,是软件产品交付用户使用之前软件质量保证的最后手段。这是一种误导,软件生命周期每一阶段中都应包含测试,从静态测试到动态测试,要求检验每一个阶段的成果是否符合质量要求和达到定义的目标,尽可能早地发现错误并加以修正。如果不在早期阶段进行测试,错误的不断扩散、积累常常会导致最后成品测试的巨大困难、开发周期的延长、开发成本的剧增等。
对于软件来讲,不论采用什么技术和方法,软件中仍然会有错误。采用新的语言、先进的开发方式、完善的开发过程,可以减少错误的引入,但是不可能完全杜绝软件中的错误,这些引入的错误需要通过测试来发现,软件中的错误密度也需要测试来进行估计。软件测试是软件工程的重要部分,伴随着软件工程走过了半个多世纪。统计表明,在典型的软件开发项目中,软件测试工作量往往占软件开发总工作量的40%以上。而在软件开发的总成本中,用在测试上的开销要占30%~50%。
一般规范的软件测试流程包括项目计划检查、测试计划创建、测试设计、执行测试、更新测试文档,而软件质量保证(Software Quality Assurance,SQA)的活动可总结为协调度量、风险管理、文档检查、促进/协助流程改进、监察测试工作等。它们的相同点在于二者都是贯穿整个软件开发生命周期的流程。
IEEE 给出的定义,SQA 是一种有计划的、系统化的行动模式,是为项目或者产品符合已有技术需求提供充分信任所必需的,设计用来评价开发或者制造产品的过程的一组活动。ISO 9000及国标GBT 11457—2016指出:质量保证是质量管理的组成部分,提供达到质量要求的可信程度。SQA的职能是向管理层提供正确的可视化的信息,从而促进与协助流程改进。SQA还充当测试工作的指导者和监督者,帮助软件测试建立质量标准、测试过程评审方法和测试流程,同时通过跟踪、审计和评审,及时发现软件测试过程中的问题,从而帮助改进测试或整个开发的流程等,因此有了SQA,测试工作就可以被客观地检查与评价,同时也可以协助测试流程的改进。而测试为SQA提供数据和依据,帮助SQA更好地了解质量计划的执行情况、过程质量、产品质量和过程改进进展,从而使 SQA 更好地做好下一步工作。
人们经常使用质量保证(Quality Assurance,QA)来代指测试,虽然它们是有关联的,但是质量保证并不等于测试。可以用更大的概念把它们联系在一起,即质量管理(Quality Management,QM)。
除其他活动外,质量管理包括质量保证和质量控制(Quality Control,QC),如图1-13所示。质量保证的关注点在于遵循正确的过程,侧重对流程的管理与控制,是一项管理工作,侧重于流程和方法。正确的过程为达到合适的质量等级提供信心。当过程正确开展时,在这些过程中所创造的软件工作产品通常具有更高的质量,有助于缺陷的预防。另外,使用根本原因分析方法来发现缺陷并消除引起缺陷的原因,以及适当应用经验教训会议的结论来改进过程,对于有效的质量保证也很重要。质量控制涉及各种支持达到适当质量等级的活动,包括测试活动。测试活动是整个软件开发和维护过程的一部分。测试是对流程中各过程管理与控制策略的具体执行实施,其对象是软件产品(包括阶段性的产品),即测试是对软件产品的检验,是一项技术性的工作。因为质量保证涉及整个过程的正确执行,所以质量保证会支持正确的测试活动。
SQA是建立一套有计划、有系统的方法,使向管理层拟定的标准、步骤、实践和方法能够正确地被所有项目所采用,目的是使软件过程对于管理人员来说是可见的。通过对软件产品和活动进行评审和审计来验证软件是合乎标准的。软件质量保证组在项目开始时就一起参与创建计划、标准和过程。这些将使软件项目满足机构方针的要求。
软件测试是利用测试工具按照测试方案和流程对产品进行功能和性能测试,甚至根据需要编写不同的测试工具,设计和维护测试系统,对测试方案可能出现的问题进行分析和评估。执行测试用例后,需要跟踪故障,以确保开发的产品适合需求。
图1-13 软件质量保证和测试的关系