软件质量保证的优化方法浅析
摘要:在软件测试技术的不断发展过程中,自动化测试技术作为软件测试技术的一个分支,被越来越多的使用在软件测试的各个阶段,大大节省了软件测试成本、提高了测试效率、缩短了软件开发周期。本文结合自动化测试理论与技术,基于现有的自动化测试技术、测试框架以及自动化测试工具进行了研究,提出了一种基于当前较成熟的软件测试自动化技术一关键字驱动的自动化测试技术而构建的自动化测试框架模型,并在此框架模型的基础上,设计实现了基于Selenium 的自动化测试框架。
关键词:自动化测试;Selenium;测试框架
0、引言
在现代化管理中,如优化问题、信息系统、决策支持系统等,都要广泛地应用软件。软件质量的优劣是通过对软件的功能、性能和可靠性等质量要素进行验证的,发现软件缺陷并帮助定位和修复缺陷,确保软件系统功能满足需求的活动。根据多年软件工程研究和实践经验,认为通过在软件项目中执行如下最佳经验,可以有效提高软件质量,确保项目进度:
a)强化开发人员测试;
b)尽早引入性能测试;
c)实施测试管理自动化;
d)引人功能测试执行自动化。
可以说,实施测试自动化是软件行业一个不可逆转的趋势,如果在这个领域走在了前列,无论从企业的核心竞争力还是个人的工作技能来说,都有巨大的优越性。
自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常,在设计了测试用例并通过评审之后,由测试人员根据测试用例中描述的规程一步步执行测试,得到实际结果与期望结果的比较。在此过程中,为了节省人力、时间或硬件资源,提高测试效率,便引入了自动化测试的概念。相对于手工测试而言,测试自动化通常具有速度快、执行效率高、测试全面,可连续工作,执行过程受外界因素干扰小、测试结果准确等优点。缺点是前期投入较大,所以在采用测试自动化之前需做好相应的评估工作。本文以Selenium 自动化测试框架为应用背景,对测试自动化在系统测试过程中的应用做了初步的研究。
1、软件测试的优化分析
随着人们对软件质量重视程度的提高,软件测试的地位逐步提高,软件测试技术也随之快速发展,逐渐从过去手工式的测试向测试自动化方向发展,引发了软件测试自动化的研究和应用热潮。目前,软件测试自动化的研究领域主要集中在软件测试流程的自动化管理以及动态测试的自动化(如单元测试、功能测试以及性能测试方面)。在这两个领域,与手工测试相比,测试自动化的优势是明显的。首先,自动化测试可以提高测试效率,使测试人员更加专注于新的测试模块的建立和开发,从而提高测试覆盖率;其次,自动化测试更便于测试资产的数字化管理,使得测试资产在整个测试生命周期内可以得到复用,这个特点在功能测试和回归测试中尤其具有意义;此外,测试流程自动化管理可以使机构的测试活动开展更加过程化,这很符合CMMI过程改进的思想。根据Oppenheimer Funds的调查,在2001年前后的3年中,全球范围内由于采用了测试自动化手段所实现的投资回报率高达1500%。
然而,存在优势并不一定意味着选择自动化测试方案都能为企业带来效益汇报,在决定是否引人自动化测试或使用合适的自动化测试方案以前,需从以下方面进行分析:
(1)选择合适的自动化测试方案测试自动化的引进和实施,不仅涉及测试工作本身流程上、组织结构上的调整与改进,甚至也包括需求、设计、开发、维护及配置管理等其他方面的配合。如果对这些必要的因素没有考虑周全的话,必然在实施过程中处处碰壁,既定的实施方案也无法开展。
(2)尽管自动化测试可以降低人工测试的工作量,但并不能完全取代手工测试。100% 的自动化测试只是一个理想目标,即便一些如SAP、Oracle ERP等测试库规划十分完善的套件,其测试自动化率也不会超过70% 。所以一味追求测试自动化只会给企业带来运作成本的急剧上升。再次,实施测试自动化需要企业有相对规模的投入,对企业运作来说,投入回报率将是决定是否实施软件测试自动化的最终指挥棒,因此企业在决定实施软件测试自动化之前,必须要做量化的投资回报分析。
(3)实施软件测试自动化并不意味着必须采购强大的自动化软件测试工具或自动化管理平台,在企业内部通常存在许多不同种类的应用平台,应用开发技术也不尽相同,甚至在一个应用中可能就跨越了多种平台,或同~应用的不同版本之间存在技术差异。所以选择软件测试自动化方案必须深刻理解这一选择可能带来的变动、来自诸多方面的风险和成本开销。毕竟软件质量的保证不是依靠产品或技术,更多的因素在于高素质的人员和合理有效的流程。
2、选型分析
实施自动化测试之前需要对软件开发过程进行分析,以观察其是否适合使用自动化测试。通常需要同时满足以下条件:
1)软件需求变动不频繁
测试脚本的稳定性决定了自动化测试的维护成本。如果软件需求变动过于频繁,测试人员需要根据变动的需求来更新测试用例以及相关的测试脚本,而脚本的维护本身就是一个代码开发的过程,需要修改、调试,必要的时候还要修改自动化测试的框架,如果所花费的成本不低于利用其节省的测试成本,那么
自动化测试便是失败的。
项目中的某些模块相对稳定,而某些模块需求变动性很大,此时可对相对稳定的模块进行自动化测试,而变动较大的仍是用手工测试。
2)项目周期足够长
由于自动化测试需求的确定、自动化测试框架的设计、测试脚本的编写与调试均需要相当长的时间来完成。这样的过程本身就是一个测试软件的开发过程,需要较长的时间来完成。如果项目的周期比较短,没有足够的时间去支持这样一个过程,那么实施自动化测试就变成空谈。
基于上述条件,我们在实际应用中多选取在项目规模较大的回归测试环节,或者增量式开发、持续集成的项目中采用自动化测试。
3、测试框架评估
自动化测试框架从最初简单的脚本录制/回放发展到结构化脚本、数据驱动?(data·driven)脚本,再发展到关键字驱动(keyword.driven)脚本,以及相继出现的各种自动化测试框架,逐渐形成了良好的脚本开发环境或平台,使得自动化测试脚本的开发更具开放性、可视性和层次性,测试人员开发和维护脚本都变得更轻松、容易,从而在整体上进一步提高自动化测试的效率和应用范围。
现有可提供自动化测试解决方案的产品很多,但是其应用结果往往不竞如人意,主要存在:定位控件不方便;验证数据不方便;代码维护不方便等。对于经常涉及手工任务操作的Web应用程序测试,为了尽可能地消除人为因素,节约手工操作的人员成本和时间,实现跨平台的Web测试框架,我们发现了Selenium这个开源的软件自动化测试框架。
a)自动化框架的选择
测试框架的选择是成功实施测试自动化的基础,必须考虑各种因素以使测试自动化更加有效地被使用。Selenium是一种Web应用的自动测试工具,通过模拟用户对Web页面的各种操作,可以精确重现软件测试人员编写的Test Cases步骤。相对于一般的脚本录制自动化框架,其优势在于:
(1)Selenium测试直接在浏览器中运行,就像真实用户所做的一样。Selenium测试可以在Windows、Linux和MacintoshAnd上的Internet Explorer、Mozilla和Firefox中运行。其他测试工具都不能覆盖如此多的平台。
(2)Selenium提供了组件化的测试用例开发方法,建立了灵活的表达方式,很大程度了提高了运行脚本的复用率,节省了脚步开发时间。
(3)通过Selenium开发的自动测试框架,对组件进行了有效封装,大大降低了维护工作量。不会产生传统自动化测试工具录制回放方法中出现的随程序变更,需要重复录制脚本的问题。
(4)Selenium以业务为驱动,可以通过测试数据流的配置,快速、灵活地实现不同的业务流分支的回归测试。
(5)Selenium的测试用例、测试结果数据统一在配置库中管理,实现了测试工具无关性。可以很好的进行移植,并为用户提供了一套完整的测试资产库。
但是Selenium是轻量的测试框架,脚本所处理的测试用例构成简单,其实质就是通过HTTP协议,发送请求(request)来完成测试用例,所以很困难处理业务逻辑关系强的测试用例。
b)选择合适的测试用例
大部分自动化测试项目失败的原因主要归咎于被测试应用程序的快速变化、不恰当的测试用例、不可靠的框架、脚本编程等问题。并非所有的测试用例都可以用自动化来完成,因此需要对用例进行挑选,选择合适的用例作为自动化测试用例。自动化测试的成本是巨大的,一般来说,一个脚本运行6—7次才算收回成本,因此不可寄予自动化测试过高期望。通常需要结合测试用例的复杂度的评估来考虑选择的测试用例以及个数。这样会带来较低的维护成本,实现更重要的业务价值。
首先把测试用例按一定的原则分为简单、中等、复杂3大类。然后从这3大类的测试用例中按一定的比例来抽取需要实现自动化的用例。测试用例的复杂度分组可以通过综合分析测试用例包含的操作步骤,以及测试用例所包含的检查点个数来判定。
c)基于Selenium的分层测试框架
在Selenium环境中组织多个测试模块的测试,每个模块实现特有的功能,有多条测试路径需要覆盖,同时,各个模块功能之间又有共通之处,可以抽取某些部分进行复用。对此,我们假设这样的场景:分别对提交的多个待测组件返回的结果页面中设置相应的检查点,为它们撰写Test Cases用于执行测试。事实上,这些组件的测试由于同质性,还能够合并为一种测试,用不同的输入参数来指定所要测试的那个待测组件。
表中针对上述各待测组件做自动化测试,以一个经验丰富的测试人员做3次回归做一个成本对比。
通过上面表格的对比,可以很明显看出很多模块功能都包含一些公共检查点,例如:文本框、DBGrid列表信息、showModalDialog自定义控件、修改信息保存成功、树形节点、各种级别菜单选择等等。把这些公共检查点封装在公共函数库中,任何新功能模块的验证都只需要调用公共函数、配置测试数据,组合调试好测试脚本就可以进行测试了,这样大大提高了测试效率和测试覆盖率。
d)集成运行框架
构造一个适当的集成环境,会极大地提高自动化的效率。例如,通过数据库服务器来存储和管理测试用例和测试结果,以提高过程管理的质量。同时生成统计所需要的数据,供Web服务器使用,显示测试结果、生成统计报表、结果曲线。运行一个自动化测试项目时,客户端先通过Web服务器查询所用的测试用例和资源;然后提交任务,Web服务器负责向控制机发出指令,开始执行测试任务。测试结果经控制器存储到数据库中测试自动化运行环境,如图1所示。
图1 测试自动化的集成运行框架
e)脚本维护
测试脚本的开发和维护直接关系到软件测试自动化的成败,至少对自动化测试的投入产出存在巨大的影响。同时对不同的测试库的权限应该有很明确的定义。一个好的方案会将测试库的组织划分为三个级别:
级别1:全局的,这个一个通常的级别,被存储在这个级别的测试功能能够被所有的项目访问。通用的功能如,登陆、创建一个用户都是这个级别很好的候选者。
级别2:项目的,在这个级别的测试功能是与特定的测试项目相关的,但是通常在项目中有用的。通用的功能如,项目中自定义控件等。通常级别2是级别1的功能的提供者。
级别3:脚本的,功能被直接关联到特定的测试脚本。在这个级别中,通常一个测试功能的第一个版本是被开发的。在新的测试脚本的创建期间已有测试功能的重用性被发现,并被移到了级别2中。在这个级别上尽量最小化功能的数量,因为它将增加维护工作量。
4、结语
从软件测试的优化来看,如何实现软件的自动化测试是一个很吸引人的技术问题,由于不同企业在组织架构、人员能力以及管理水平等方面的不同,我们很难用一个实例、一两句话来说明不同解决方案的适用性,具体如何选择,需要仔细权衡。