前言
蛇油还是银弹?
Snake oil 在英谚中指“骗人的万灵油”,用来指那些宣称万灵却实际没什么用处的骗人把戏。
silver bullet则指能解决难题的特殊的有效手段。来源于银弹可杀死吸血鬼的传说。
而在软件研发领域,针对自动化测试,也常常能听到类似这两种说法的不同观点:
一种认为自动化测试是测试领域的银弹,是加快测试进度和压缩测试成本的必行手段,是测试领域的必然发展趋势,测试人员甚至会因为自动化测试的发展而失业。
另一种观点则完全相反,认为自动化测试不过是为了KPI而编造出来的额外负担,实际上根本无法承担大部分的测试功能,反而引入了更多工作和投入。
笔者作为在软件测试领域十五年的老兵,且专职从事自动化测试相关工作超过10年,借本文来谈谈自动化测试到底是什么?自动化测试应该做什么?
何为自动化测试
自动化测试与测试自动化
这里我们必须要厘清两个概念,自动化测试(automated testing)和测试自动化(test automation),它们其实是两个含义差别比较大的概念。
自动化测试(automated testing),这里的测试是动名词,更多指测试的完整流程,覆盖测试的各方面。而自动化测试是测试全流程中各个环节自动化的程度。
测试自动化(test automation),这里的测试是名词,是测试这个具体的行为,更像是Testing的实例。测试自动化把测试这个行为进行了自动化。
通过以上两个概念的解释,我们可以看到,自动化测试比测试自动化涵盖的范围要更加广泛。国内软件测试行业一般不太提测试自动化这个说法,所以我们简单把自动化测试分为广义和狭义来对应automated testing和test automation。
实际上大家在说到自动化测试时往往更多指的其实是test automation。本文提到自动化测试时一般也理解为狭义的自动化测试即test automation。
定义
百度百科对自动化测试的定义
自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常,在设计了测试用例并通过评审之后,由测试人员根据测试用例中描述的规程一步步执行测试,得到实际结果与期望结果的比较。在此过程中,为了节省人力、时间或硬件资源,提高测试效率,便引入了自动化测试的概念。
Wikipedia对Test Automation的定义
测试自动化是使用特殊的软件(区别于被测软件)来控制测试执行并且对实际输出及预期结果进行比对的行为。测试自动化能将正式测试流程中一些必要但重复的任务自动化,或提供更多人力很难完成的测试工作。测试自动化对持续发布和持续测试至关重要。
(test automation is the use of special software(separate from the software being tested) to control the execution of tests and the comparison of actual outcomes with predicted outcomes.[1]Test automation can automate some repetitive but necessary tasks in a formalized testing process already in place, or perform additional testing that would be difficult to do manually. Test automation is critical for continuous deliveryand continuous testing.)
从以上定义,我们可以认为自动化测试(狭义)就是把测试执行中一些工作自动化的过程。
自动化测试的优缺点
自动化测试目前在测试行业,其实是整个软件行业可以说是如日中天,大有无自动不研发之势。但是我们还是要理性地看待自动化测试,下面简单谈谈自动化测试的优缺点
缺点
软件行业发展到现阶段,特别是人工智能、机器学习的发展,可以看到机器智能化的趋势已成。而自动化测试的发展,在软件测试行业似乎也成了这一趋势的最佳注脚。但自动化测试真的能代替人力测试么?至少现阶段及可预见的未来多年还不现实。
软件测试是一系列创造性活动的集成,包括探索、挖掘、分析、沟通等一系列依赖人类创造性的技能。而自动化测试,从上文定义中我们也可看到,目前还只能更多在测试执行这个层面帮助完成一些重复性的任务。在实践中,我们也知道,自动化测试在软件测试的核心能力-缺陷发现能力上表现并不好。
所以可以说,至少现阶段,自动化测试存在一个最大的缺点:缺乏创造性,难以承担软件测试中的核心任务-发现缺陷。
除此之外,自动化测试当然还有些其他的缺点如:
• 建设成本较高,包括启动成本和维护成本
• 被测对象对自动化测试影响较大,而成功实施自动化测试往往需要被测对象提供额外支撑
• 工具、环境依赖大
优点
自动化测试虽然有重大缺点,但是却在软件研发中变得越来越重要,自然有它不可替代的独到之处。
和历史上所有的进化类似,无论是从刀耕火种到铁犁牛耕,从珍妮机到蒸汽机,还是从生产作坊到流水线,无不伴随生产效率的巨大进步。
自动化测试的最大优点就是两个字:效率
自动化测试在执行效率上的巨大优势是其得以壮大的立身之本。通过自动化测试,可以快速完成已有功能的快速验证并给出反馈,这在现代快速研发时代至关重要。后文我们还会展开来谈。
除此之外,自动化测试还有如下一些不可忽视的优点:
• 精确,可靠。自动化测试不会因为不同时间、不同设备上执行产生不同的行为路径。
• 不需要休息,24小时干活不嫌累。
• 高复用性、继承性。知识沉淀是自带属性
黄金圈法则看自动化测试
黄金圈法则是西蒙·斯涅克发现的一个著名行事准则。在其畅销书《从为什么开始:乔布斯让Apple红遍世界的黄金圈法则》中提出。
即一般人做事往往先从外向内思维,先看要做啥,再想怎么做,最后才会想为什么去做。而很多成功的领袖人物会先从内圈向外圈进行思考:
• WHY:我的目标是什么?先搞清楚愿景、要达到的目的
• HOW:如何实现我的目标?解决怎么做的问题,确定方法、策略
• WHAT:要做什么?这就是执行层面上怎么去具体地实施。
具体到自动化测试上,我们也参照此法则来梳理一下自动化测试的思路
为何实施自动化测试?(WHY)
上篇分析自动化测试的优缺点已经谈到,自动化测试有其重大缺点,也有显著优点。那为什么我们要推行自动化测试呢?
首先我们要确认一个事实:那就是在软件研发中,开发和测试工作是相辅相成的,但却并不对等。产品发布时开发的工作是增量的,但测试却不是增量。产品每个版本发布,功能在原有基础上是增量的,但是测试工作是对完整的产品质量进行检验,所以历史版本的功能在每次发布时也会包含在测试范围内,这个意义上来说,测试工作任务量更多。
另外我们再看目前软件业界的产品现状和测试目标。随着互联网、移动互联网、物联网的发展,现在的产品研发强调快速迭代,传统软件动辄几个月的发布周期被压缩到每周发布甚至每天发布。那产品质量如何保证?怎么最大程度保证产品更新不出问题?
正因如此,自动化测试尽管在测试工作的核心功能-缺陷发现能力上表现不佳,但是因其高效执行、快速反馈结果的特点成为现代软件研发体系如敏捷研发、持续集成中的不二之选。非吾愿往,实不得不往矣。
那么WHY就很清楚了:实施自动化测试,目标是要提升软件研发中测试的执行效率,快速反馈结果,提供对变更对历史功能影响的质量信心(扩大覆盖率)。
如何实施自动化测试?(HOW)
确定自动化测试的目标了,下一步我们来看如何开展自动化测试呢?
要分析这个问题,我们需要先看看软件测试需要做些什么,软件测试按阶段一般分成单元测试、集成测试、系统测试、验收测试。按类型又可分为功能测试、性能测试、兼容性测试、部署安装测试、易用性测试、安全测试、本地化测试、文档测试、可靠性测试、无障碍测试等(以上测试概念可以参看我的免费公开课《软件测试基础-概念篇》,此处不展开了)。结合测试阶段、测试类型其实可以确定我们实施自动化测试的时机和范围。
再回到目标:提升执行效率,扩大覆盖率。所以HOW需要围绕这个目标,不能因为自动化的实施影响效率或者对效率提升微小,另外需要尽可能优先实施覆盖率高的部分。
这里我们再来看看著名的自动化测试金字塔:
测试金字塔基于这样的观点:测试是分层的,从上到下对应测试对象的不同层级,分别是上层的UI界面测试,中层的服务测试和底层的单元测试。而实施自动化测试的效果是由上到下越来越好,即越接近底层的自动化测试收益越高。
这也很容易理解,越接近底层的自动化,越为稳定,受到的干扰越少,所以其效率越高,成本越少。
那么再结合WHY的几个关键词:效率、结果、信心, HOW的结论可以如下:
自动化测试优先针对稳定的,少干扰的部分实施,通过各种手段提升效率为主,平衡测试覆盖率和实施成本,并清晰快速地给出执行结果
自动化测试做些什么?(WHAT)
进入实施层面,那就是针对自动化测试策略(HOW)来确定我们具体使用的自动化工具,然后借助自动化测试框架或平台来保证实施效率、执行效率和结果输出。
这里有如下一些重要工作:
虽然测试金字塔显示了自动化测试的选择原则,但是并是不说我们只需要关注Unit自动化测试即可,不同层面的测试对象对最终质量信心的建立都有重大影响,所以自动化测试在每层上都有实施必要,只是侧重点可以有所区别。
然后就是针对测试对象来确定对应的工具。不同测试对象会有大量不同的工具可以选型。一般提到自动化测试主要是针对功能测试,因为功能测试是软件测试的绝对主要范围。所以工具的选型就很重要。
Unit功能测试更多会借助不同编程语言的Xunit来实施。
API层面会有不同的接口测试工具如各种工具库以及postman、fiddler、soapui等工具
UI层面的功能测试工具就更多了,
web应用有
Selenium,QTP,移动应用自动化测试有UiAutomator、Robotium、Appium,桌面应用有QTP,Autoit,sikuli等等。
而除了功能测试外,还有如
性能测试、稳定性测试、安全测试这样必须要借助工具完成的测试类型。
性能测试可选工具有LoadRunner、Jmter、Tsung、Locust等,安全测试有appscan、webinspect、fotify、webscarab等。
不同自动化测试工具的使用是自动化测试中的一个重要方面,但不是本文介绍重点,大家可以根据需要选择对应测试类型的工具重点学习。
构建自动化测试框架或平台
确定实施自动化的工具后,为了进一步提高自动化测试的效率,我们还需要通过自动化测试框架或者更高一层的自动化测试平台来对自动化测试的开发、实施过程进行管理、整合。当然上面提到的很多自动化测试工具也提供了一些框架层面的功能,但是真正重心在框架层面的还是如STAF/X、RobotFramework、Cucumber这样的框架工具。当然很多框架本身也会内建许多工具层面的功能。
通过测试框架的使用,能大幅提高复杂业务测试场景的组织和管理,减少自动化测试的启动成本和维护成本。
测试框架一般通过不同的分层来完成自动化测试的组织。
-
适配层:适配不同类型的测试对象,如GUI界面、API接口、web service、database、通信协议等
-
执行层:完成测试任务的调度执行,log记录、结果报告
-
测试设计层: 包括设计测试用例(脚本)、测试环境配置、初始化配置、测试数据、测试库等
-
测试输入层:对接外部输入如测试场景定义、测试模板
通过测试框架或平台,自动化测试还可以和外部系统如
项目管理、配置管理、测试管理系统实现良好的交互和集成。
自动化测试实施
工具、框架层面确定并完成构建后,则需要针对具体的业务场景来进行实施。包括测试脚本的开发,调试,测试环境的部署、测试结果的输出、报告。这部分工作也是我们自动化测试的主体部分。
在自动测试实施中,通过本人对大量项目实施情况的观察,有以下几点推荐关注的关键:
-
自动化测试不能脱离业务,需要比较紧密地和需求、测试点进行关联或通过内建文档形式体现。此处推荐 《实例化需求》一书,其主导思想对于自动化测试在研发流程中发挥价值有很强的实践意义。
-
自动化测试必定是和测试环境紧密相关的。所以针对环境、初始数据等的处理在自动化测试中应该作为一个非常重要的部分。自动化脚本受环境影响越小,执行越稳定,则价值越高。
-
按测试金字塔原则来确定实施优先级。API层面的自动化测试可以作为实施重点。兼顾业务逻辑和ROI。作为最终表现层面的case,GUI层面的自动化也不可或缺,只是覆盖面尽可能覆盖smoke test即可。单元测试是代码层面的基础,覆盖率越高越好,但是需要有ROI的平衡考量。
-
自动化测试本身也体现到代码上,所以和代码管理相关的实践和要求,对自动化测试同样适用。包括版本管理、配置管理,忽略这部分对自动化测试代码的长期维护是非常不利的。
-
自动化测试不应是某些专职自动化测试人员的工作,应该是所有项目成员工作的一部分。它只是测试工作的一个实现手段,不应该单独独立出来脱离实际测试人员的思路来单独实施。
良好的自动化实施是自动化测试是否成功的关键
接入研发流程工具链
自动化测试不可能脱离研发整体流程,需要为整理流程服务。软件研发流程在推进持续集成中必然会引入相关的工具链。自动化测试接入工具链是发挥自动化测试价值和提升研发效率的重要措施。
持续集成工具不管是Jenkins、teamcity还是bamboo、codeship其实作用基本类似,对于自动测试接入来说。重点做好以下几点:
-
方便地调度控制。尽可能通过shell或cmd脚本来触发调用,复杂些的调度控制如分布式测试可以通过一个专门的调度代理来完成
-
可视化的测试报告反馈和通知机制。测试结果在运行后及时反馈到CI工具并通过邮件、短信等通知机制告知干系人。
-
异常定位、分析手段。包括日志、监控、异常状态应对清单等对于出现问题时的快速解决意义重大
结语
自动化测试是现代软件研发流程中不得不为地必要组成部分,但是其不是万能药,把自动化测试用好,重点是聚焦在其能发挥最大价值的所在。通过合理地规划和框架设计,有效地实施和流程控制,为团队共赢提供助力。
展望未来,借助人工智能的发展,自动化测试或许会向更聪明,覆盖范围更广泛的方向发展,但一切都需要我们立足当下,逐步探索,最终实现生产力地充分解放