Appium Device 管理队列

Bluesky Yao · 2015年01月27日 · 最后由 卡农Lucas 回复于 2015年01月27日 · 2453 次阅读
本帖已被设为精华帖!

在携程使用 TestNG/JUnit 并行跑 Appium 有两个关键的地方:

  • 独立使用的 Appium Server Wrapper
  • 控制并行的 Device Store Queue

Word is Cheap,示例代码如下 (公布这些代码是希望大家更多的精力放到改进 Appium 本身):

public abstract class AbstractDeviceStore<T extends Device> implements
        DeviceStore<T> {

    protected static final Logger log = LoggerFactory
            .getLogger(AbstractDeviceStore.class);

    protected final ReentrantLock lock;
    protected final Condition notEmpty;
    protected final TreeSet<Device> devicesInUse = new TreeSet<>();
    protected final Set<T> devices = new TreeSet<>();

    protected AbstractDeviceStore() {
        lock = new ReentrantLock(true);
        notEmpty = lock.newCondition();
    }

    @Override
    public Device take() throws InterruptedException {
        final ReentrantLock lock = this.lock;
        lock.lockInterruptibly();
        try {
            // log.debug("devices in use size {}", devicesInUse);
            while (devicesInUse.isEmpty()) {
                log.debug("take need wait ....");
                notEmpty.await();
            }
            return devicesInUse.pollFirst();

        } finally {
            lock.unlock();
        }
    }

    @Override
    public void put(Device device) {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            devicesInUse.add(device);
            notEmpty.signal();
        } finally {
            lock.unlock();
        }

    }

    @Override
    public Set<T> getDevices() {
        return new TreeSet<T>(devices);
    }

}

共收到 7 条回复 时间 点赞

沙发~哈哈。感谢分享。
上周就在想怎么让 udid 脱离 case 那一层,现在知道了,线程互斥锁搞起。
目测 Python 版本的 wrapper 也不远了..【。

兰天同学,不错的分享。
👏

赞~~~

@monkey 抓住这个同学~ 让他分享~

正在预研 appium 代码和设备远程部署,现在考虑使用 appium Grid 方案,目前有几个问题没有解决,看了你的几个贴子。
希望楼主能帮忙解决,
1.获取 appium Grid 主各结点的运行状态?
2.appium hub 上的各结点 node 上的 appium 服务器使用前先重启下?
3.远程执行 adb 命令

#6 楼 @springs412
我的几个帖子,其实就是和 appium/selenium grid 的方式相反了,通过在一台 node 上,并行启动 appium,让 testng 去管理。当时是鉴于 appium 的不稳定,所以这样做。

  1. gird 各节点状态,selenium grid 应该可以获取到,或者只是投递到 hub,hub 负责分发。
  2. 我的方式是 case 级别,或 suite 级别重启 appium。但对于 grid,显然不能经常重启。selenium grid 就有个grid-extra 来协助管理状态.显然应该有个 device 的管家,来做各种杂事。
  3. 我的方式是在每个 node 上运行一个服务,来接收 adb 命令,然后发送到特定 device,但如果深入研究 adb,可能有更直接的方式。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册