Appium自动化测试
活动时间:2016年10月13日 QQ群视频交流
活动介绍:TMQ在线沙龙第十期分享
本次分享的主题是老司机教你玩转Appium自动化测试。
共有128位测试小伙伴报名参加活动,在线观看视频人数65人~想知道活动分享了啥吗?往下看吧!
活动嘉宾
嘉宾简介
钟书成,腾讯高级测试工程师,毕业于中国科学院。加入腾讯前曾在微软等多家外企项目中担任测试开发工作,于2012年加入腾讯腾讯地图项目,主要致力于自动化测试的研究与实施,在Android自动化测试方面有丰富的经验。在腾讯地图项目期间负责了八爪鱼自动化测试平台的设计与开发工作。《腾讯Android自动化测试实战》的作者之一。
分享主题
问答环节
1、提问:请问如何用appium识别X5内核的webview,有成功经验吗?我在把context切换到x5webview之后,就卡住了
答:就我的了解,Appium的对Hybrid App的支持有些限制,首先需要Android版本是4.4或以后的手机(关于此项可以参考appium.io文档中的说明),其次测试Hybrid App需要将WebView类的setWebContentsDebuggingEnabled设为True。另外在Android上我知道仅对Chrome的内核支持,腾讯的X5内核在最近的版本中不清楚是否支持,如果不支持的话可能需要自己定制Appium框架。
2、提问:怎么测试 APP中 即有原生又有H5的页面
答:我理解你问的是如何测试Hybrid App。如果是的话按普通的测试步骤运行到有WebView的画面,然后调用Appium Client的按以下步骤(以python为例):
1. 调用driver.contexts获取到当前可用的context,如果一切OK的话,你能看到两个context,一个为Native,另外一个WebView的Context。
2. 调用driver.switch_to.context(context),将Web的Context传入这个方法,切换到WebView的Context
3. 然后按测试Web页面的步骤通过find_element_*的方法查找页面的element,开始H5的测试。查找使用的方法也都是类似的。
4. 当网页内的测试完毕后要切换为Native的测试时,要将Context切换回来。
3、提问:swipe滑动时有时会报错,尤其是用模拟器时基本都报错
答:不知道这位朋友的错误究竟是什么样的错误,我也无从回答,这位朋友可以私下里联系我一起讨论。另外我们的测试都是在真机上进行的,没在模拟器上运行。
4、提问:我们团队也在用appuim进行安卓自动化测试,但是发现hybrid和reac-native的页面有一些控件元素使用安卓sdk自带的uiautomator无法识别出来,就无法编写appuim case,请问你们有没有遇到类似情况。
答:这样的问题我们也有遇到,请参考问题一和问题二的答案先确定符合Hybrid App的测试条件,另外WebView里面的内容需要用Chrome浏览器通过Debug方法连接到被测得WebView来查看里面的内容。最后再看是否是方法的问题。
5、提问:react.js开发的H5页面怎么用appium测试 做UI测试
答:如果是纯网页App的话,那测试方法和Selenium测试网页的方法一致,可以参考下这个视频https://www.youtube.com/watch?v=b9fmf9Ka6Zw。如果是H5嵌入到Activity这样的App的话就需要使用Hybrid App的测试方法,这可以参考前面的前面的答案。
6、提问:appium启动应用程序时,会在手机上安装appium setting,这个是什么作用?
答:这个apk的作用主要是用来辅助Appium服务器在运行时对手机的设置功能.比如需要设置网络为wifi,或者关闭网络等。
7、提问:appium怎么实现跨应用测试,能大概说下什么方法吗?
答:这里我不清楚你说的跨应用是不是指一个应用唤起另外一个应用的场景。比如很多程序登录唤起微信,再从微信返回这样的场景。如果是的话,就是当微信被唤起后在当前画面找微信的控件,按普通的流程往下进行就是了,因为Appium是基于当前画面进行自动化的,不是基于某程序的Context进行自动化的。
8、提问:appium怎么模拟滑动的手势
答:不同语言实现的Appium Client参数可能不一样,但大致相同。Python的是“driver.swipe(start_x=75, start_y=500, end_x=75, end_y=0, duration=800)”。 Java的是“driver.swipe(75, 500, 75, 0, 0.8)”,可以参考http://appium.io/slate/en/master/
9、提问:platformversiong为什么必须4.3以上?
答:这里纠正我自己的一个错误,在分享时说成了4.3。这里不是必须4.3,而是建议。 因为4.2以下的版本是使用的Selendroid,4.2及以后的版本使用的是UiAutomator。
10、提问:之前 pip install robotframework-appiumlibrary应该正确的pip库是 Appium-Python-Client 吧?
答:非常感谢这位朋友的纠正,官网上最新的下载命令是“pip install Appium-Python-Client”,请参考https://github.com/appium/python-client。
11、提问:大腾讯有用Uiautomator框架吗?如何对各个机型进行快速适配呢?如何识别控件的颜色?针对地图这种特别依赖网络好坏的应用,除了增加延时外,是否还有其他方法来增加脚本的稳定性?如何实现多机交互?例如蓝牙、接打电话
答:问题1:是的,有不少业务都有用,但各业务用到什么程度就不清楚了。
问题2:个人感觉Appium已经是非常好的适配各种机型了,因为该工具是直接通过控件的信息来查找控件,与手机的分辨率无关,在大屏幕上要显示哪些UI元素,那么在小屏幕手机也应该显示。
问题3:appium是基于UiAutomator实现的,就我所知是没有方法获取控件的颜色,其实我们测试过程中也没关注UI上的颜色,更多关注逻辑上是否OK的。
问题4:对于网络这种不确定因素,我们采用的方法是动态等待,我们封装了一个WaitForElement方法,我们会传入根据业务情况传入一个较长的等待时间,在该方法中是每隔一秒去检查一下控件是否显示,如果显示了就返回,如果没显示就继续等待。我们所有的需要等待的场景都是使用这样的方法,这样避免死等,可以尽可能快返回。
问题5:关于多机交互的情况,我们的业务没有接触到这样的场景。但也不是没有办法,建立搭建两个Appium Server 了或者一台Server多个设备来完成,两个设备分别运行不同的程序,通过同一个测试脚本来整体控制。另外我个人觉得,如果这个功能不是你们的最核心的功能的话,如此复杂的交互场景人工测试可能效率会更高点。
12、提问:公共的业务逻辑,是怎么判断、合理地抽取出来?
答:公共的业务逻辑需要大家对自己的义务和自动化目标非常熟悉,能知道需要实现哪些用例,这些用例中是否有可重复使用的过程,提取出来就是了。就如我举例时说到的取消用户引导页过程。
13、提问:每个用例从程序启动开始会不会增加用例运行时间
答: 这个时间肯定是有所增加的,但是如果脚本运行过程因为状态不对导致的错误比较多的话,后期调研的时间会比这一点时间多出N倍,因此需要测试人员自己去平衡。
14、提问:集成是怎么做的?用的是Android模拟器吗?
答: 我猜测这位朋友说的是 持续集成吧。地图项目有一个自动编译服务器,会定期编译最新的版本。Appium主要用于每个版本的冒烟测试中,用例只覆盖了最主要功能的场景。每天晚上测试服务器发起任务定时去拉取编译服务器上最新的版本到本地进行测试,完毕后将测试结果通过邮件反馈给项目成员,大家在第二天早上来时可以直接看结果。之所以在晚上运行是因为UI的自动化测试运行还是比较慢的,如果对测试运行的快速性要求很高的情况的话,建议选用接口级别的自动化方案,会快很多;或者就是用多台机器同时运行不用的用例,这样也可以缩短时间。
另外我们的所有自动化测试都是使用真机测试的,毕竟模拟器并不是用户真实的使用环境,即使在模拟器上全通过了可能也不能确保在用户真机环境中是OK的。
15、问题: 1. 在自动化测试时,线上怎么保证线上数据不受自动化测试的影响?比如下单,线上不受污染? 2. 测试数据是怎么独立的?
答: 如果你的测试包是直接上线的包的话,难免会有你说的情况。对于交易系统的话尽量还是直接用测试环境测试。或者在包中埋个彩蛋,让程序做某个操作后或者在某个路径放一个特殊内容的文件后就连到测试环境,这样应该可以解决一些问题。
测试数据与UI数据不太一样,当然测试数据也可以像UI数据定义为常量,但测试数据脱离了脚本逻辑的话是很难看出它的含义的;此外即使独立出来后,你敢几个脚本共用一个数据吗?如果这样用了,可能出现改了一个数据可能导致多个脚本失败,所以测试数据我们是没有独立成文件的。不过如果是同一个用例场景,不同的测试数据的话,那是属于数据驱动的测试,这就另当别论。
获奖名单
ID:qiu-财付通--测试(312****46)
ID:晶--人人车--测试(723****95)
ID:小燕子--软通--测试(834****83)
恭喜以上三位同学获得TMQ本次沙龙活动听众奖;
本次奖品是由TMQ 官方出品、本期嘉宾参与编写的《腾讯Android自动化测试实战》新书哦