zoukankan      html  css  js  c++  java
  • 【原创】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,那么就可以参考这个,进行本地多线程启动驱动。
    走出了这个误区后,解决我之前执行测试的执行错乱,还有报告监控类监控错误的问题。完成了我想实现的目标:多线程多机连接,多设备执行,根据用例分线程输出执行日志,执行完成后,可以直接数据库出报告,每一次的执行都有数据保留。
      整个框架还有没有完善的地方,后续需要做的还有很多,我会持续把我设计框架过程中遇到的问题写出来给大家分享。感谢在这个过程中帮助我的所有的老师,朋友,同事,谢谢你们。


    你再不自己敲代码,你的四肢就退化了
  • 相关阅读:
    javascript模拟枚举
    javascript实现命名空间效果
    js数组去重
    文件上传插件
    script标签的defer属性
    js数组复制
    更改visual studio2010的主题
    关于json格式在.net前后台传值的详细示例
    where T : class泛型类型约束
    JavaScript模仿鼠标拖动选择功能
  • 原文地址:https://www.cnblogs.com/boqinyaxin/p/13579424.html
Copyright © 2011-2022 走看看