软件测试技术
第 1 章 软件工程与软件测试 1.1 软 件 工 程 1.2 软 件 质 量 1.3 软 件 测 试 1.4 软件测试人员的基本素质
严格地说,软件工程是应用计算机科学、数学及管理科学等原理开发软件的工程。通俗地说,软件工程是实现一个大型程序的一套原则方法,即按工程化的原则和方法组织软件开发工作。 软件测试是软件工程的一个重要环节,相当于工程领域中的质量检验部分,是确保软件工程质量的重要手段。
1.1 软 件 工 程 1.1.1 软件工程的目标及其一般开发过程 一个软件产品从形成概念开始,经过开发、使用和维护,直到最后退出使用的全过程称为软件生存周期。软件生存周期根据软件所处的状态,以及软件开发活动的目的和任务,可划分为若干个阶段。一般软件生存周期包括软件定义、软件开发以及软件使用与维护3个部分。
1.软件定义 可行性分析的任务是了解用户的要求及实现环境,从技术、经济和社会等几个方面研究并论证软件系统的可行性。 需求分析的任务是确定所要开发软件的功能需求、性能需求和运行环境约束,编制软件需求规格说明、软件系统的确认测试准则。软件的性能需求包括软件的适应性、安全性、可靠性、可维护性错误处理等。
2.软件开发 软件开发是按照需求规格说明的要求,由抽象到具体,逐步生成软件的过程。软件开发一般由设计、实现和测试等阶段组成。
3.软件使用和维护 软件的使用是在软件通过测试后,将软件安装在用户确定的运行环境中移交给用户使用。软件的维护是对软件系统进行修改或对软件需求变化做出反应的过程。
1.1.2 软件过程模型 软件开发过程中存在各种复杂因素,为了解决由此而带来的种种问题,软件开发者们经过多年的摸索,给出了多种实现软件工程的方式——软件过程模型,如瀑布过程模型、螺旋过程模型和增量过程模型等。
1.瀑布过程模型 瀑布过程模型反映了人们早期对软件工程的认识水平,是人们所熟悉的一种线性思维的体现。 瀑布过程模型强调阶段的划分及其顺序性、各阶段工作及其文档的完备性,是一种严格线性的、按阶段顺序的、逐步细化的开发模式,如图1-1所示。
图1-1 瀑布过程模型
2.螺旋过程模型 螺旋过程模型的基本思路是,依据前一个版本的结果构造新的版本,这个不断重复迭代的过程形成了一个螺旋上升的路径,如图1-2所示。
图1-2 螺旋过程模型
3.增量过程模型 有些时候可能会用一种几乎连续的过程小幅度地推进项目,这就是增量过程模型,如图1-3所示。
图1-3 增量过程模型
1.2 软 件 质 量 软件质量是软件的生命,它直接影响软件的使用与维护。 通常软件质量由以下几方面进行评价。
① 软件需求是衡量软件质量的基础,不符合需求的软件就不具备质量。设计的软件应在功能、性能等方面都符合要求,并能可靠地运行。 ② 软件结构良好,易读、易于理解,并易于修改、维护。 ③ 软件系统具有友好的用户界面,便于用户使用。 ④ 软件生存周期中各阶段文档齐全、规范,便于配置、管理。
1.2.1 质量与质量模型 软件的质量因素很多,如正确性、精确性、可靠性、容错性、性能、效率、易用性、可理解性、简洁性、可复用性、可扩充性、兼容性等。 软件质量因素也称为软件质量特性,反映了质量的本质。讨论一个软件的质量,问题最终要归结到定义软件的质量特性。
面对众多的质量因素如何取折衷,这实际上就是区分质量因素对软件质量影响程度轻重的问题,这个问题已经有了解决方案,即软件质量模型。 图1-4所示为ISO/IEC 9126-1991标准规定的软件质量度量模型。它由3层组成,其中第1层称为质量特性,第2层称为质量子特性,第3层称为度量。
图1-4 ISO软件质量度量模型
软件质量评价的目的是为了直接支持开发并获得能满足用户要求的软件。最终目标是保证产品能提供所要求的质量,即满足用户明确的和隐含的要求。软件产品的一般评价过程是,确定评价需求,然后规定、设计和执行评价,如图1-5所示。
图1-5 软件评价过程
1.2.2 软件质量保证 为了在软件开发过程中保证软件的质量,软件的质量保证活动应贯穿整个软件生存周期的每一个阶段。软件的质量保证的措施主要有检查、评审和测试。 如图1-6所示,软件质量保证的工作从项目一开始就应介入。
图1-6 质量保证活动
1.3 软 件 测 试 1.3.1 软件测试的定义及目的 简单地说,软件测试就是为了发现错误而执行程序的过程。
在IEEE提出的软件工程标准术语中,软件测试被定义为:“使用人工和自动手段来运行或测试某个系统的过程,其目的在于检验它是否满足规定的需求或弄清楚预期结果与实际结果之间的差别。” 软件测试是与软件质量密切联系在一起的,归根结底,软件测试是为了保证软件质量。
软件测试是一个找错的过程。软件测试的过程亦是程序运行的过程。程序运行需要数据,为测试设计的数据称为测试用例。测试用例的设计原则是尽可能暴露程序中的错误。
软件是由人来完成的,所有由人做的工作都不会是完美无缺的。软件开发是个很复杂的过程,期间很容易产生错误。无论是软件从业人员、专家和学者做了多大的努力,软件错误仍然存在。因而大家也得到了一种共识:软件中残存着错误,这是软件的一种属性,是无法改变的。所以通常说软件测试的目的就是为了发现尽可能多的缺陷,并期望通过改错来把缺陷统统消灭,以期提高软件的质量。一个成功的测试用例在于发现了至今尚未发现的缺陷。
软件测试的目的是以最少的人力、物力和时间找出软件中潜在的各种错误和缺陷,通过修正各种错误和缺陷提高软件质量,回避软件发布后由于潜在的软件缺陷和错误造成的隐患所带来的商业风险。
1.3.2 软件测试信息流 为进一步说明软件测试的过程,这里给出软件测试的信息流示意图,如图1-8所示。 图1-8 软件测试信息流
1.3.3 软件测试与软件开发过程的关系 对于软件测试与软件开发过程之间的关系,套用固定的模型不是聪明之举。比如“程序设计”与“测试”之间的关系,习惯上总以为程序设计在先,测试在后,如图1-9(a)所示。而对于一些复杂的程序,将测试分为同步测试与总测试更有效,如图1-9(b)所示。
图1-9 程序设计与测试的关系
现在还有一种全新的软件开发模式——以测试驱动软件开发,总的思想是:软件测试是贯穿于软件开发过程的。软件生存周期的各个阶段中都少不了相应的测试,软件生存周期各个阶段的测试分别对应于软件测试过程中的单元测试、集成测试、系统测试和确认测试,如图1-10所示。这种对应关系有利于软件开发过程的管理和软件质量的控制。
图1-10 软件测试与软件开发的关系
1.3.4 软件测试与质量保证的区别 1.质量保证 质量保证(QA)工作通过预防、检查与改进来保证软件质量。QA采用“全面质量管理”和“过程改进”的原理开展质量保证工作。
2.软件测试 测试虽然也与开发过程紧密相关,但关心的不是过程的活动,而是对过程的产物以及开发出的软件进行剖析。测试人员要“执行”软件,对过程中的产物——开发文档和源代码进行走查,运行软件,以找出问题,报告质量。测试人员必须假设软件存在潜在的问题,测试中所做的操作是为了找出更多的问题,而不仅仅是为了验证每一件事是正确的。
对测试中发现的问题的分析、追踪与回归测试也是软件测试中的重要工作,因此软件测试是保证软件质量的一个重要环节。 软件质量保证活动与软件测试的关系可用图1-11说明。
图1-11 软件质量保证活动与测试的关系
1.3.5 软件测试的发展历程及趋势 软件测试是伴随着软件的产生而产生的,有了软件的生成和运行就必然有软件测试。在早期的软件开发过程中,测试的含义比较窄,将测试等同于“调试”,目的是纠正软件中已经知道的故障,常常由软件开发人员自己完成这部分工作。对测试的投入极少,测试介入得也晚,常常是等到形成代码,产品已经基本完成时才进行测试。
直到1957年,软件测试才开始与调试区别开来,成为一种发现软件缺陷的活动。 直到20世纪80年代早期,“质量”的号角才开始吹响。软件测试的定义发生了改变,测试不单纯是一个发现错误的过程,而且包含软件质量评价的内容。软件开发人员和测试人员开始坐在一起探讨软件工程和测试问题。制定了各类标准,包括IEEE标准、美国ANSI标准和ISO国际标准。
20世纪90年代,测试工具终于盛行起来。到了2002年,Rich和Stefan在《系统的软件测试》一书中对软件测试做了进一步定义:“测试是为了度量和提高被测软件的质量,对测试软件进行工程设计、实施和维护的整个生命周期过程”。这些经典论著对软件测试研究的理论化和体系化产生了巨大的影响。
近20年来,随着计算机和软件技术的飞速发展,软件测试技术的研究也取得了很大的突破,测试专家总结了很好的测试模型,如著名的V模型,在单元测试、自动化测试等方面涌现了大量优秀的软件测试工具。
虽然软件测试技术的发展很快,但是其发展速度仍落后于软件开发技术的发展速度,使得软件测试在今天面临着很大的挑战,主要体现在以下几个方面。 ① 软件在国防现代化、社会信息化和国民经济信息化领域中的作用越来越重要,由此产生的测试任务越来越繁重。 ② 软件规模越来越大,功能越来越复杂,如何进行充分而有效的测试成为难题。
③ 面向对象的开发技术越来越普及,但是面向对象的测试技术却刚刚起步。 ④ 对分布式系统的整体性能还不能进行很好的测试。 ⑤ 对实时系统缺乏有效的测试手段。 ⑥ 随着安全问题的日益突出,对信息系统的安全性如何进行有效的测试与评估,成为世界性难题。
根据国内外软件测试的发展现状,可以看到软件测试有以下的发展趋势。 ① 测试工作将进一步前移。 ② 软件架构师、开发工程师、QA人员、测试工程师将进行更好的融合。 ③ 测试职业将得到充分的尊重。
④ 设置独立的软件测试部门将成为越来越多的软件公司的共识。软件测试部门将和开发部、质量保证部一样作为一个重要的独立部门存在。 ⑤ 测试外包服务将快速增长。和软件开发外包一样,软件测试外包将成为全球化的一种趋势。可以利用职业测试专家队伍与机构为自己的产品进行测试,而且可以节省测试费用。
1.4 软件测试人员的基本素质 1.具有良好的计算机编程基础 2.具有创新精神和超前意识 3.不懈努力,追求完美 1.4 软件测试人员的基本素质 软件测试人员应具备下列基本素质。 1.具有良好的计算机编程基础 2.具有创新精神和超前意识 3.不懈努力,追求完美 4.具有整体观念,对细节敏感 5.团队合作精神