Appium Device 管理队列

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

在携程使用 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 条回复 时间 点赞

#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,可能有更直接的方式。

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

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

赞~~~

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

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

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册