01引言
自从上世纪七八十年代全面爆发软件危机起,软件产业的发展过程中始终伴随着巨大的管理难题。整个软件产业存在着软件代价高、难于控制开发进度、软件工作量估计困难、质量低,以及软件修改、维护困难等问题。而要解决这些问题,在很大程度上取决于提高软件的设计、开发和测试质量。
随着软件开发规模的增大,软件的质量问题越来越突出。软件测试是提高软件质量的有效途径,在软件测试工作中投入的人力、物力、财力逐渐加大,国外有些软件公司的测试人员和开发人员的比例甚至达到1:1或2:1的程度,因此如何提高软件测试效率是每个软件研发单位和研发项目面临的严峻问题。
本文结合工程实践,从软件的可测试性和软件测试组织两个方面进行分析,探讨提高软件测试效率的方法。
02影响软件测试效率的因素
影响软件测试效率的因素很多,本文只论述被测软件质量和软件测试组织对软件测试效率的影响。通过软件测试可以发现软件中的某些问题,软件中存在的某些潜在问题由于受测试工具、测试方法和测试时间的限制而无法发现,测试中发现的问题最终需要通过软件开发人员进行纠正,从某种角度来看,软件测试并不能从根本上提高软件质量,软件质量的高低直接取决于软件开发人员的设计与编程水平,好的软件开发人员编写完成的软件具有问题少、易维护等特点,但有时会出现修改完成了一个软件缺陷,同时又引人多个软件缺陷的情况,需经过多轮回归测试才能够完成问题归零。所以,虽然软件测试是提高软件质量的有效途径,但提高软件开发人员的水平,提高反映软件设计质量和开发质量的软件的可测试性是提高软件质量的根本途径。
软件测试人员对项目需求的理解程度,对测试理论、测试工具和测试方法的掌握程度,以及对被测软件模块在项目中的重要程度和成熟程度的认识,对软件测试效率同样有很大的影响,所以在工程中需合理组织软件测试,提高软件测试效率。
03软件的可测试性
3.1 可测试性软件的特征
可测试软件具有以下特征:
(1)可操作性。可操作性是指:被测软件的错误很少,可以避免重复测试的开销;没有阻碍测试连续执行的错误;在软件设计时应允许在开发阶段进行部分测试活动。
(2)可观察性。可观察性包括:每个输入有唯一的输出;系统状态和变量可见,或在运行中可查询;过去的系统状态和变量可见,或在运行中可查询;所有影响输出的因素都可见;容易识别错误输出;自动报告内部错误;可获取源代码。
(3)可控制性。可控制性是指:所有可能的输出都产生于某种输入组合;通过某种输入组合,所有代码都可能被执行;软件测试人员可直接控制软件和硬件的状态及变量;输入和输出格式保持一致且有规范的结构;能够便利地对测试进行说明,以及方便地执行和重构测试。
(4)可分解性。软件系统由众多独立模块构成,每个软件模块均可独立进行测试。
(5)简单性。简单性包括功能简单性、结构简单性、代码简单性。
(6)稳定性。软件的变化是不经常的,变化是可控制的,软件的变化不影响已有的测试,失效后能够得到良好恢复。
(7)易理解性。易理解性包括:设计能够被很好地理解;内部、外部和共享构件之间的依赖性能够被很好地理解;测试人员可方便获取技术文档,并及时掌握设计更改情况;技术文档组织合理、明确详细。
3.2 提高软件可测试性的途径
在实际工作中,可通过以下几个途径提高软件的可测试性:减少并控制需求的变更;加强软件可测试性的设计;重视并规范技术文档的编写。
3.2.1 减少并控制需求的变更
用户需求可分为如下三个层次:基本需求、预期需求和扩展需求三类。其中预期需求是明示的,而基本需求和扩展需求是非明示的。所谓扩展需求是指这些特征在用户的期望范围之外,并且当其存在时将是非常令人满意的。由于种种原因,软件的需求不确定性是客观存在的,是不可避免的,软件规模越大,研制周期越长,需求的不确定性就越大。软件需求不确定性原因主要包括:用户在表述需求时常常带有不确定性与模糊性;随着开发进程的推进,用户对所建应用系统理解的不断深入,对原来模糊的或非明示的需求有了新的认识,随时会提出需求的变更;由于开发人员的领域知识的局限性,导致引发对需求的误解;用户需求的获取过程与描述形式往往采用非形式化的自然语言,以及自然概念中存在的本质矛盾,使需求的规范描述发生困难。
(1)识别项目需求
识别项目需求是项目成功的关键,为了减少需求的不确定性,首先应充分认识确定需求的重要性,通过与用户的沟通,使用户能充分认识到软件需求的变更对软件质量、进度和成本的影响,积极参与到确定软件需求的活动中,达到在进行软件设计前尽量确定软件需求的目的。同时在识别项目需求时,除了用户明示的需求外,还需关注用户基本需求,用户基本需求常常体现在项目的领域知识、项目所在行业的相关标准等方面。实践证明,开发人员对领域知识掌握的程度直接影响到项目需求的确定,开发人员通过对领域知识的积累有助于项目需求的确定。
(2)需求文档化及需求评审
按照软件工程化要求,用户应该向研制方正式提交需求文档,研制方根据用户需求进行需求分析形成产品需求,用户需求及产品需求均需文档化并经过评审,以尽早发现不合理的需求。
(3)需求管理、需求变更的控制
在系统研制过程中应对需求进行管理,首先建立需求库及需求跟踪矩阵,在需求跟踪矩阵中反映研制各阶段工作产品与需求的对应关系,并对需求进行需求的双向跟踪。
(4)采用软件需求管理工具
采用需求管理工具,可以提高需求管理工作流程的自动化程度,使需求管理可以在项目实施过程中得到有效地推行。需求管理工具可以在整个项目生命周期内,帮助团队有效地协作,将需求的变更信息及时传送到团队的每个成员,可以使跨项目团队的所有成员都能掌握必要的需求详细信息,并对软件项目规划、项目跟踪与监督实施管理。
3.2.2 加强软件可测试性设计
在项目设计阶段应注重对软件可测试性的设计。项目负责人可根据项目具体情况对软件可测试性提出具体要求,对软件注释率、软件模块规模、模块圈复杂度、基本圈复杂度、操作数的个数以及过程出口个数等进行规定,在软件设计及编程阶段严格按照规范执行,可有效地提高软件测试效率。实践证明,如果在项目设计阶段不进行软件可测试性的设计,待软件完成后再根据可测试性要求对软件进行修改完善常常需要花费巨大的人力和物力,同时大量修改对软件质量也会带来不利影响。
3.2.3 重视并规范技术文档的编写
技术文档不仅是开发人员进行信息交流的手段,也是测试人员进行测试的依据。所以软件相关文档应描述明确详细,组织合理,并根据需求和设计的变更及时更新。同时为了给独立测试人员提供更多的信息,在技术文档中可增加各软件模块的重要程度、重用性及测试历史等信息,使得独立测试人员可以合理分配精力,对重要软件进行重点测试,减少不必要的重复劳动,提高测试效率。
3.3 软件测试方法与组织
3.3.1 软件测试方法
软件模块级测试分为白盒测试和黑盒测试。黑盒测试注重于测试软件的功能性需求,试图发现功能缺陷或遗漏、界面错误、数据结构或外部数据库访问错误、性能错误及初始化和中止等类型的错误。白盒测试依赖对程序细节的严密检验,对软件的逻辑路径进行测试,在不同的程序点检验“程序的状态”以判定预期状态或待验证状态与真实状态是否相符。在软件测试中,常常结合黑盒和白盒两种测试方法,相互补充。
3.3.2 软件测试人员
软件测试可由软件开发人员、独立测试人员或用户进行。在组织软件测试时,可根据不同人员的特点进行组织,使得各类测试相互补充。
软件开发人员熟悉软件需求及被测软件,清楚各软件模块的重要程度和相互关系,了解各软件模块以前的测试及修改等历史情况,可以有针对性地进行测试;软件开发人员和用户交流较为方便,在测试中能够发现与需求不一致的软件错误。但是开发人员急于证明他们的程序是毫无错误的,是按照用户的需求开发的,而且完全能够按照预定的进度和预算完成,这将影响开发人员完成相关测试任务。
独立测试人员应具备较强的测试理论水平和测试经验,熟练掌握软件测试工具,并知悉被测软件的功能需求才能够对软件进行系统全面的测试。但独立测试人员有时会缺乏相应领域的专业知识,主要测试依据是用户的技术要求及开发人员在软件研制过程中形成的文档,一方面这些文档中缺乏对用户基本需求的描述;另一方面,独立测试人员常常需通过开发人员来进行需求的理解,因此在软件测试中有时无法发现软件不满足需求方面的错误。但这种错误往往从用户角度来看是最严重的。同时,独立测试人员由于对各软件模块的重要性及相互关系了解不深。有时会影响测试效率。
在条件允许的情况下,软件完成后可提交用户试用。用户在试用中根据实际使用需求进行操作,其中包括各种正常操作流程和非正常操作流程。用户试用可有效检验软件是否满足用户需求,同时在用户试用中对软件的可靠性等方面也同步进行了测试。因为用户试用方式同实际使用方式非常接近,所以通过用户试用获得好评的软件基本可以满足今后的实际使用要求。
3.3.3 提高软件测试效率的方法
为了提高软件测试效率,测试人员需要熟悉掌握软件涉及的领域知识,了解软件各项功能的重要程度和成熟程度,掌握测试理论和工具;用户是验证需求正确性的主导力量,应充分发挥用户的积极作用。
在组织软件测试时,可通过以下几个方面提高软件测试效率:
● 根据不同测试人员的特点进行测试分工,单元测试应以软件开发人员为主进行,以保证每个单元能够完成设计的功能。在很多情况下,集成测试也可以开发人员为主进行。当软件体系结构完成后,独立测试机构介人;
● 软件测试人员应注重与用户的沟通,及早发现需求分析、理解不合理的问题,避免今后花费大量的资源和时间进行改正;
● 对于软件开发人员,需加强测试方法的培训,提高自我测试的效率;
● 在选择独立测试人员时,尽量选择比较熟悉了解被测软件相关领域知识的人员;
● 独立测试人员应该在软件开发的需求阶段就参与项目的研制,以便更好地制定测试计划、确定测试目标及编写测试用例。通过找出项目中关键的模块和出错率高的模块,可使测试首先集中在最重要的部分,避免发生把过多时间花费在非重要模块的测试而没有时间测试重要的模块的情况;
● 被测软件在测试中发现了问题,要进行有组织的分析研究,然后权衡利弊进行规范化修改,避免反复修改,反复测试;
● 规范软件配置管理,通过管理及技术手段,对软件和文档版本进行控制,软件测试的有效性。
04结束语
实践证明,通过提高被测软件的可测试性,以及合理组织软件测试工作,可以有效地提高软件测试效率。随着软件测试的重要性得以承认,软件测试阶段在整个软件开发周期中所占的比重也日益增大。为了将缺陷和错误消灭在萌芽之中,软件测试将逐步发展成为软件开发每一阶段都要进行而且需要反复进行的活动。软件测试中大量的工作是机械的、重复的、枯燥的和非智力的,但逐步加强软件自动化测试的研究和推广将是今后软件产业的发展趋势。