【原创】Appium驱动跳跃问题解决

在进行app自动化时多线程启动多机执行,碰到了一个驱动跳跃的问题,表现形式就是A脚本启动的驱动A1执行A脚本的过程中去执行了B脚本,而B脚本启动的驱动B1执行了A脚本。

这样的执行导致了我的脚本一直跑不成功。

单个执行脚本的时候是没有问题的,然后我仔细检查了自己的脚本,发现了很多问题。

第一个是共用变量太多,之前为了少写代码,我把很多变量都定义成全局的了。

改变之前,共享变量太多,这些变量都不是线程安全的。多线程执行的时候,前一个线程的赋值会被后一个线程覆盖,线程之间相互干扰,导致脚本执行错乱。

 

 

 

为了解决这个问题,我为去掉了很多共享变量,只有全局需要的数据才留着,更改后如下:

 

 

 

这里面最主要的就是AndroidDriver<WebElement> driver和WebElement element两个共享变量被我去掉了。这两个是最影响脚本。

去掉了这两个共享变量后,我还对一些方法做了同步

/**
* 增加同步块,保证拿到的数据不是重复的。
*
* @param excelPathParm
* @throws Exception
*/
public synchronized void getDevices(String excelPathParm) throws Exception {……}

/**
* 设置改方法为同步方法,保证往缓存里存放的用例和驱动数据唯一
* 让多线程执行的时候只能有一个线程写数据,不会出现数据错乱
* 让多线程执行的时候从缓存里拿驱动执行脚本,保证脚本执行的时候不跳跃
*
* @param excelPathParm
* @throws Exception
*/
public synchronized void getDriver(String excelPathParm) throws Exception{……}

全局缓存数据存数据和读数据也做了同步,为什么会用到全局缓存?解决用例执行过程中用到的常用数据,比如执行的用例所用的设备,还有执行的驱动,都会放里面,方便后面用例执行完成后,
根据用例去恢复执行设备状态和关闭驱动链接,以及测试报告数据生成都会用到。

 

 

 

在解决这个问题的过程中,我一直进入到了一个误区,我一直参考了这篇文章

解决TestNG多线程并发时,线程不安全问题

https://www.cnblogs.com/qianjin100/p/6424617.html

一直做本地驱动启动的多线程,其实这个问题解决的是单机上驱动多个浏览器驱动,像pc端的ui测试,需要启动多个浏览器,执行不同脚本,要求每个启动的浏览器数据不共用,不相互干扰。
而我要达成的目的是多机启动,执行一个app,本质上就是执行的测试只是单机上启动一个链接,然后创建一个链接驱动。用了两周时间突然想明白了这个问题,然后我的问题就解决了。
  如果后面,我需要多机连接,然后在机器上启动多个驱动,连接多个app,那么就可以参考这个,进行本地多线程启动驱动。
走出了这个误区后,解决我之前执行测试的执行错乱,还有报告监控类监控错误的问题。完成了我想实现的目标:多线程多机连接,多设备执行,根据用例分线程输出执行日志,执行完成后,可以直接数据库出报告,每一次的执行都有数据保留。
  整个框架还有没有完善的地方,后续需要做的还有很多,我会持续把我设计框架过程中遇到的问题写出来给大家分享。感谢在这个过程中帮助我的所有的老师,朋友,同事,谢谢你们。


posted @ 2020-08-28 18:34  博琴雅心  阅读(249)  评论(0编辑  收藏  举报