所有的故事都来自于一个群的技术探讨,争论的内容无非是自动化是否能够万能。
当然笔者的定义是“技术上是万能的,成本上不是万能的”!
首先,何为自动化?
其实对于自动化的理解有宏观和微观之分。
所谓宏观就是指能够代替人工完成整个所有工作的执行,从而实现无人值守;而微观就是对某一种情况下的部分内容通过代码来自动完成。可以说其实无论是最早的DOS下的bat还是Linux下的Shell都可以算是自动化的一种,因为通过命令体系可以帮助我们一键或者后台任务自动完成业务。这个概念和某些股票自动交易是一个道理。
微观自动化就是测试人员常常理解的自动化,也就是UI自动化,通过模拟键盘鼠标或者对象识别来实现对被测对象的运行。这不过只是实现自动化的一种手段通过UI识别或者高级的OCR识别,而接口消息自动化和单元代码自动化也是不过是对象和引擎发生了变化而已。
而宏观自动化就要上升到框架级别,自动的用例生成,持续集成,甚至消息推送等,但这些自动化背后其实还会涉及到人工的部分,比如程序员点击提交或者保存(触发机制),代码才会提交到配置管理库,自动化代码才会遍历或者通知得到要走下面的步骤流程。
所以我们所做的自动化是在努力的将繁琐的重复的工作从人工变为自动,而且在越来越智能的自动(参考Alphago)。
其次,自动化万能?
技术这个东西那么多年下来了,可以说自动化在技术领域并不存在什么瓶颈,也就是只要人能做的自动化都能做,可能在某些方面可以做的更好。例如在汽车无人驾驶方面,很早就有非常成熟的方案了,但是现实上并不允许这个问题,因为这里有个道德悖论的问题。
既然说到这里,那么有个问题可以提出给大家思考:
“有几个调皮的孩子在铁轨上玩,还有一个孩子在另外一根安全的铁轨上玩,突然来了一列火车,正常运行的话就会撞上几个调皮的孩子,你现在有个选择可以搬动铁轨的变道器让火车开到边上的辅道上,但是这样原本在辅道上玩耍的那个孩子就不能幸免,这个时候你该如何选择?”
调皮的孩子自己是有错误的,你不能为了保护这几个孩子去牺牲那个无辜的原本安全的孩子,但是你又会觉得一个生命和一群生命比可能会渺小,到了这里你可能已经无法做出选择了!就像"蝙蝠侠之黑暗骑士"一样,不能因为对面是罪犯就能够按下爆炸的按钮,认为自己是无辜的。
上面为什么去提这个问题呢,我只是想说明在技术上并没有任何问题可以阻止自动化。这个时候争论点就来了,有人就问“云层,微信界面的友好怎么用自动化来测试?”下面我就来正面的回答这个问题。
首先何为测试?就是验证被测对象和原始需求满足或者达到一定的标准(例如合同),如果有过基本的需求概念就会知道我们测试的依据是依赖于需求规格说明书的,何为需求规格说明书?就是要定量而不是定性,一个系统的友好不是一个概念而是一个具体的数据,好比我们说黄金分割会比较好看,而所谓的黄金分割是一个具体的数据0.618,也就是在一条直线上的一个固定点。既然有了这个固定的值,自动化测试就变得可以实现并且可以超出人类的实现了。为了进一步来证明自动化的技术万能论,下面再给一个例子:
在上图中A方块和B方块的颜色是否相同的?
这个例子中自动化才能正确的解决问题,并且验证事实!基本上肉眼看到的结果都是A与B不同色,但是如果用PS去提取图片的颜色就会发现这两个颜色是完全相同的,人因为肉眼的错觉会得出错误的结果。当然有人会说既然肉眼看到的有误差,为啥我们不做成肉眼没有误差的东西?这个问题是需求决定的,不是你觉得我看着没有误差就是对的,而是系统设计是不是要考虑肉眼误差来做假同色。
回过来再次回答“微信界面是否友好的自动化测试”问题,所谓的友好压根就不是一个定量的东西,这只是一个概念,每个人心中都有自己所谓友好的概念,也就是意味着这个东西连手工测试也是无法实现的,因为这就不是一个可以验证的对象,那么何来自动化测试无能呢?而是否友好的本质无非是一些大众的调查和对友好的定义,我记得在“移动动漫基地”做用户体验测试培训的时候说过友好来自于以下几个点:
清晰明了的功能(按钮、文字)
短操作路径
快速的响应
各种提示,向导
把最常用的放在用户最方便用的地方
所以在做用户体验测试上都会有用户的眼球跟踪来理解对应用户的操作习惯及热点分布,从而给出调整建议。当年Office2007才出来的时候,大家都不习惯标准菜单式转化为新的图形化模式,但是随着使用的过程,慢慢就发现在操作上的提升,因为常用的功能变大了,不用的功能被隐藏了,综合操作步数在下降;同理Windows7才出来的时候也被大家诟病UI,现在大家都觉得好用了。
所以所谓的用户体验是针对特定环境、特定人群、特定时间的一种属性,只要能把属性量化,那么自动化就不是问题了。韩国就是制造了“美”的定义和属性,并且自动化批量生产美女的国家。
那么有了属性后怎么自动化呢?简单拿个网页说明一下吧。
这是云层天咨公司网站的一部分,在这里有一个<div>块,如何自动化测试其是否美观友好呢?
根据css调用,依次检查css文件中对应的class属性正确,例如背景颜色是否是#323a47,对齐方式是否是居中及宽度是用百分比%模式还是像素px模式。
测试div是否正确的应用了对应的css
扩展的style是否符合规范
微信的二维码文件是否是正确的文件
文字的内容是否合格
这些都是基于代码级别可以自动化的,当然作为UI自然会有设计原型,所以某些时候自动化只需要截图然后对比设计图和实际界面图是否相等即可。
各种复杂的验证码的出现正是为了防范自动化,不过这只能降低自动化成功率,并不能阻止,更何况还有“打码平台”这样的高级伪自动化,通过人工在后台快速处理验证码,从而实现系统的自动化。
自动化万能论的基础是人可以定量的验证的内容,既然人可以做到,自然就可以设计机器自动做到。而且由于机器是不存在个人误差、疲劳、心态等生物问题,加上执行效率又高很多,所以可以通过遍历来解决一些思考的过程,从而将自动化实现(自动化能做到什么级别不是技术问题而是设计问题,也就是如何告诉机器在什么情况下应该怎么做的逻辑,这也是只要有手工用例,自然就能自动化的原因)。
最后,自动化不万能!
前面说了很多自动化万能的地方,最后来说一下为什么自动化不万能。其实道理也很简单,"成本"也就是ROI投资回报比,甚至来说是国情需要,因为人太多了。
还是先来个例子,公交售票大家都知道,以前需要一个司机一个售票,现在都刷交通卡了,那么售票员就不需要了。当然这很好,但是有考虑过么?又少了一个就业机会,IT的发展迅速其实正是利用了这点,通过网上银行可以极大的削减人力需求,本质上是在吸底层的血。有了自动扫地机,连扫地的人都不需要了,万一哪天谁无聊发明了一个自动写代码的工具,这下IT都失业了。
上面的内容其实不是危言耸听,有很多快速原型工具,基本上改几个参数写几个表就能生成系统,大家所写的很多东西也是有人专门写好框架的,回头想想连造*的机会都没了,一个人要全栈干以前十个人的活,不就是自动化带来的结果么。但是自动化不能万能的原因也正在此,至少现在在国内不合算!简单来说招3个手工测试的工资也许也就是一个高级自动化工程师的工资,而且从发现bug的效果来说,可能前者还好点!无限的自动化会导致随着自动化的深入ROI投资回报比越来越低,每增加一个点的自动化覆盖比例所带来的投入可能会增长好几倍,并且后期维护会更麻烦,这也是为啥最安全的保险柜都还是需要物理锁的原因之一。
所以如何有效的利用自动化降低成本才是我们做自动化的目的,而不是为了证明技术!
综上所述
自动化到底能做啥应该大家都有了自己的看法了,最后我想说的是:
人类发明电饭煲是因为它可以自动煮饭(根据温度和时间),但是不会发明自动加米、加水、出饭、加菜的烹饪机,因为没有性价比!
人类会发明真空抽血管(利用大气压来抽血),但是不会发明自动抽血(用户无法接受)、验血(已实现)、诊断(部分实现)、打针(用户无法接受)的机器,因为用户没安全感,当然更没有性价比。
到了某一个阶段,也许自动化技术已经可以把成本降到很低的时候,上面的东西就会被发明出来了!