邵晨影
(上海找油信息科技有限公司,上海,510000)
典型的软件工程项目利用持续集成过程作为自动调整某些任务的方法,以提高软件质量,如自动化测试。然而自动化测试主要侧重于根据项目需求实现的代码构建,不考虑在组织或工程领域之外开发的其他项目,因此项目的代码构建在一种独立的环境中进行自动化测试,因为它们没有充分考虑到不同项目之间的复杂依赖关系,所以自动化测试也不是很准确,虽然项目依赖关系可以通过构建管理机制隐式处理,但项目依赖关系在大部分场合下根本不被考虑,这样就导致了自动化测试潜在的失败。积极考虑和处理依赖关系,发现问题及时向开发者反馈,这个过程是手动完成的,并且是一项耗时的任务。通常情况下,问题只有在变更完成并集成到系统后才能被发现,这对开发人员和用户都是一个问题。本文中将持续集成过程作为一种方法,充分考虑了各种软件工程项目的代码构建之间依赖关系,以提高自动化测试的有效性,完善自动化体系的建设。
软件测试是一项耗资较大并且耗费大量劳动力的活动,因此自动化测试成为测试更加高效的一种方法,自动化测试体系的建设也更加重要,持续集成也是它成功实现的关键,进行频繁执行自动化测试用例,能够尽早的发现系统问题并给予解决,确保系统的正确性。在开发系统时,自动化测试方法包括代码分析和检查,代码驱动自动化测试和图形用户界面的自动化测试[1]。
持续集成起源于极限编程,它是开发技术的最佳实践之一。它要求每个开发人员在几个小时内完成一项任务,并定期将代码提交到版本控制存储库,然后持续集成服务器通过检测代码更改自动启动集成构建,运行代码静态检查和自动测试,试图发现新更改的代码带来的新的潜在缺陷,并确保其他功能不受影响,然后持续集成服务器生成最终的结果报告,并将报告发送给相应的开发人员和管理人员(如图1),并自动生成最终结果。最终结果报告包括构建状态、重复逻辑检查、代码复杂度报告、符合编码标准、单元测试结果、功能测试结果等[2]。
图1 持续集成构成
开发人员必须根据最终结果报告修复新引入的缺陷,如果不能立即执行修复,应该撤回提交的代码以确保其他开发人员能够正常工作,同时也随时了解每次集成的状态构建过程和测试必须足够快地完成,以便持续集成服务器能够跟上这些变化并向软件工程师及时反馈,同时他们对变化的记忆仍然是最新的,据说一个软件项目中有50人的开发团队开发了200,000行代码,通常每天发布大约20次基于持续集成的自动化测试。目前,越来越多的公司在软件系统开发中采用这种方式,如Google,Facebook,百度,阿里巴巴等。
降低风险。当服务器检测到程序员提交源代码更改时,它会自动重新编译,运行单元测试、功能测试与集成测试,并在短时间内反馈结果。服务器自动发送电子邮件或短信通知给引入缺陷的开发人员,让开发人员可以轻松找出构建失败或测试失败的根本原因,并在早期解决问题。因此避免了传统软件开发中广泛存在的风险。
节省成本。在软件开发过程中,发现缺陷越早,解决的成本就越低。根据国外软件质量部门的统计数据,发现和解决软件缺陷需要花费大约 100美元在单元测试阶段,而在市场上发布的产品中解决软件bug需要约10,000美元。持续集成可以使缺陷得到及时检测和解决,从而大幅度节省成本。
提高效率。软件开发集成过程中,人工集成最新代码,手工代码复审,手工测试等操作的反复手工劳动会随机引入一些不确定因素,使得缺陷检测和修复极其困难。每次在干净的环境中运行(重新编译构建模块,而不是重新使用上次编译的结果),使用相同的过程和脚本来构建和测试软件,从而降低系统级的不确定性,提高整个开发团队的工作效率。例如一个项目开发过程中,有许多重复性的活动,其包括代码编译,数据库集成,部署,测试,问题反馈等等,通过自动化集成在构建脚本时,将依次执行编译,自动测试等动作,减少提交重复代码冲突的排查时间,从而减少了重复性劳动。
传统的软件开发方法通常包括以下几个阶段:需求收集和分析,模块化设计,实施,集成测试和系统测试。最常见的问题是每个模块都可以单独开发和测试,一切都很正常,但是当它们集成在一起时会出现很多意想不到的问题。例如:开发人员在进行某些更改时会影响其他人的代码,但他不知道该代码,因此会出现软件缺陷。由于上述两人之间的交叉模块化,这类软件缺陷很难调查。随着时间的推移,问题会逐渐恶化,缺陷通常发生在整合阶段,但实际上已经存在了几周甚至几个月,所以开发人员需要花费大量的时间和精力来找出这些缺陷的根本原因,这又会影响项目发布的成功。另一方面,项目的日常工作中有许多重复的工作,如代码审查,单元测试,代码覆盖率检查,静态代码分析,动态代码分析,重复构建,发布版本变更等,他们消耗开发人员大量的重复性工作时间,如果持续集成在项目开发中引入,不仅可以大大提高项目团队的响应时间,而且还可以让开发人员免于重复工作。此外,还有足够的时间用于产品创新和高质量软件的开发。
在设计和建立自动化测试体系之前首先要确定测试的需求,自动化测试架构师完成全面的软件结构,需要进一步的考虑工程师的测试需求,优先确定软件测试的各种限制因素,其中测试需求又可分为多种,如测试范围的确定,同时除了现在的测试需求以外,还需要评估未来的需求,其次预算与时间、测试系统的期望寿命、错误诊断功能等其他测试需求、操作员的技术水平、产量等等均应考虑在内[3]。
硬件的选择以及测试系统的设计是一件棘手的任务,必须做出正确的选择,以避免在被测试系统的使用寿命中花额外的费用。例如,没有在机柜预留足够的闲置空间会导致整个测试系统的重新设计,这样会花费数千美元造成数月的停工。当设计安装机柜系统时,一些关键的因素是必须考虑的,包括用于机壳,固定装置,互连系统及开关的机柜类型、机柜尺寸、及配电系统[4]。
在测试系统设计和开发过程中,软件扮演了非常重要的角色,一般架构工程师推荐采用的测试系统架构前三层都是面向软件的,而软件设计的最佳实践主要是测试执行的最佳实践,测试执行利用它按预定义流程来快速持续地执行一系列的测试(比如各功能模块)。对所有设备都相同的操作(例如生成报告、序列号输入)应当利用测试执行程序来处理针对特定待测设备的操作则应该在代码模块内开发。由于测试执行程序可以处理通用的操作,因此无需再为多个设备编写相同的代码,然而可以帮助开发人员节省时间[5]。
持续集成在自动化测试体系中至少有六点要做到自动化,它们分别是自动化的运行测试、自动生成可部署的二进制成品、自动将代码部署到预发布环境、自动为CodeBase打上标签、自动运行回归测试、自动生成报告等[6]。
持续集成的自动化测试部署可提高开发团队的生产力,改善代码质量并降低项目执行风险。而且它为开发团队带来了一个新的发展机会,当开发人员开发新功能时,他们开始考虑如何将它们构建为几个小任务并定期进行工作,而不是在长期开发分支上开发新的项目,最终提交大量的代码,鼓励开发人员在提交源代码时提交相应的自动化测试用例。在未来的工作中,首先对部署持续集成的自动化测试做准备;其次考虑通过增加测试来增加自动测试覆盖率,并通过计算性能瓶颈来减少持续集成构建中的持续时间。持续集成系统能够为项目构建和质量指标给予及时的反馈,有些集成可以反馈功能完成度和产品缺陷率。通过持续集成开发人员能够清楚的知道自己对软件修改之后与其它功能造成的影响程度,并及时给予最优解决方案,从而可以提高开发团队对产品的信心度。可见持续集成在自动化测试体系建设中是非常重要的。
[1]Daniel J.Mosley.软件测试自动化[M].机械工业出版社, 2003.10.
[2]马雪英, 姚砺, 叶澄清.回归测试自动化工具研究[J].计算机科学,2005.
[3]李念强, 孙传伟, 王玉泰.分布式测试平台的应用研究[J].计算机测量与控制, 2003, 11(12): 931-933.
[4]杜庆峰.高级软件测试技术[M].北京: 清华大学出版社, 2011.
[5]温素剑.零成本实现 Web自动化测试--基于Selenium和 Bromine[M]..北京: 电子工业出版社, 2011.