记一次测试用例的自动化解决方案实现过程

最近接到一个云服务的测试用例,虽然属于非常规业务,但也有一定的代表性。把过程记录下来方便同仁批评指正共同提高。

关键词
云主机、VNC、Selenium、Java Robot库、 Bash、FTP服务、 OCR、数字图像处理

背景

   某私有云拥有几十个隔离虚拟网络,需要在不同的虚拟网络中分别创建主机,并登录进去检查自动分配的IP地址是否有效绑定到虚拟主机。目前已经有了创建的自动化执行脚本。检测方式是逐台登录进去,通过ifconfig命令检查IP地址。


  初次拿到的需求就上面描述的这些。第一反应就是通过云平台的控制节点上,通过Expect脚本逐台登录执行ifconfig将结果重定向到文件,再将文件通过scp或者ftp的方式汇总再做检查。分分钟搞定的问题,撸起袖子加油干,十来分钟写完加抽样测试,打完收工。结果现实打脸打的那叫一个响亮:在控制节点上只能对其中的部分网络节点可达,剩余的云主机虽然正确创建,但由于网络是隔离的,连ping都ping不通,更别谈用Expect连接再执行命令了。
  怎么办?又找到需求方,询问人工是如何登录进去检查的?答:只能通过web控制台上的VNC连接可用。
  这可做了难,Web自动化测试要识别控件的,但VNC连接的页面上就是一个窗体,也不太可能去对vnc内部做解析识别内部的操作过程。驱动搜索引擎铩羽而归。难道前人就没遇到过这种恶心问题?
  自己琢磨一番,渐渐有了眉目:Java提供的Robot库可以模拟一些键盘鼠标操作,通过Selenium把VNC页面打开,直接按照流程输入对应的命令序列不就好了。
  说干就干,又抄起搜索引擎和IDE,现学现卖的把VNC页面打开和键入命令字符序列的过程都实现了,虽然写的比较难看但也勉强能用了。
  但是,由于网络的不同,有的很快就连上,有的等会儿才能连上,由于没做相关判断,还没连上的发起一段按键序列简直智障。想祭出sleep大法,但不能都按最慢的等吧?那还不到地老天荒。那怎么知道是已经是能登录的状态,人一眼就能看到终端,脚本怎么搞起?总不至于做图像识别吧?想来想去也就图像识别能最快解决问题,终端连上之前是一个渐变的灰色界面,一旦vnc连上主机等待登录时,界面就转成终端的漆黑一片。只要每隔一段时间截张图,然后检查图片是不是漆黑一片不就行了,由于连上之后还有提示符,就只截屏幕中间一小块就好。import库加一个for循环做逐像素检查分分钟搞定,简直666。又是搜索引擎找现成的代码,复制粘贴改一改。再次跑起,然而问题又来了,连上vnc了,输入用户名,等password的提示符又是一个随机时间长度的过程,sleep大法还是有傻等的问题。怎么办?还是图像比对帮帮忙。键入用户名后截张图,每隔段时间截张图和原图比对,如果有差异就是password出来了。然而一闪一闪的光标对图像的完全比对就是裹乱。做阈值控制的话,全屏截图比较简直是坑。既然变化的就那么一小块区域,干脆截图也用那么一小片得了。这回不能再中间找了,只能是哪块变化截哪里,换台主机分分钟歇菜,先不管这许多,代码撸起,成果斐然。登录这一步可算是处理了。
  接着就是敲命令,ifconfig一大片的显示显然不方便后续处理,然后就是管道awk走起,虽然Robot库只能逐个字符的press release有点恶心,好歹能解决当下的问题不是。一坨恶心的代码就这样造就了。后续想到也可以把命令写到系统剪切板然后到VNC终端粘贴,当时智障了。
  IP在终端显示了怎么取出来又是个问题,网络不通真是要命。转念一想,既然是纯文本,截个图直接用个图片文字识别工具不就好了吗?又撸起袖子加油干了半天有个雏形了。得意的喝口凉咖啡,找到一个ocr库飞起。又然而,由于终端的字体是一种非常老旧的字体,识别正确率真是要人命。0给识别成8,1给识别成4也是无语。怎么办,图像预处理呗。锐化,灰度图像颜色二值化,放大总算把正确率提高了那么一点。imagemagick 真神器也。
  心想总算消停点了,没想到又出幺蛾子。主机太多,后面连接的主机由于连接时间与vnc地址获取时间间隔过长,其中的token参数不能用了,还得倒回到控制台去重新查一遍。脚本执行主机对控制主机之间又没法直接访问也是醉了。怎么办?试了一下两边都对一台开发服务器的ftp能够访问,那还说什么?怎么方便怎么来。然而互相之间怎么通讯又是问题。要通知那边重新取后续的全部地址,取完还得在脚本执行端能拿到,又是一通私下格式约定。Java、Python对于这种小事就是牛刀。虽然也能写,就是略微麻烦些,总得去调用终端命令,还不如让shell直接来战个痛快。新地址的交互终于通过文件互通信息加脚本处理解决了。接着就是更新地址往下跑。最后结果收集下来和预期的数据比对因为识别率不是太高,还得打印出来人工确认一下,不得不说是本次测试留下的遗憾。
  至此一个看似简单的检查总算通过脚本实现了。累计耗时两人天的工作时间,用人工检查差不多耗时大半天吧。虽然多耗费了些时间,但将来如果遇到类似的检查或者要复查也就改改脚本分分钟就可以复查一遍了。自动化的好处就在于可复用性。虽然还留有人工检查的遗憾,但比起一台台的登录敲命令,判断,下一台的这种方式,要省些功夫吧。
  后续重构

  命令行的连续输入不能单个字符的处理,还是写一个方法来对一长串的命令直接转换成对应的按键操作。但对中文这种需要选词的可能就得费些功夫了。没准写个五笔输入中文的方法?
  留待以后优化

  1、vnc终端的边缘检测,方便精准定位文字提示符的显示区域。由于没有专门做过数字图像处理,这块要是专门做过也就是分分钟的事情。
  2、ocr的文字识别,限于本地多张截图的文字识别,暂时没找到更优的解决方案,解析出来的结果和实际结果还有偏差,如果能把这块优化了,就可以直接加断言语句了。
  经验教训
  1、需求开始要能收集的更全面就不要一知半解就开干。
  2、办法总比问题多,一种方式不行,换种思路没准就通了,不能认死理儿。
  3、多学点专业技术没准哪天就用上了。
  4、技术没有好的坏的,只有适合的不适合的。
  用到的工具技术
  1、Selenium
  2、Java语言的Robot库,数字图像处理库
  3、Bash脚本
  4、FTP服务
  5、Tesseract OCR文字识别工具
  6、imagemagick工具

原文地址:https://www.cnblogs.com/youngchance/p/8320240.html