Macaca 关于 Macaca 的并发测试 (iOS)

sixleaves · 2017年02月16日 · 最后由 Aaron 回复于 2019年07月23日 · 2848 次阅读

在测试 macaca 的并发,思路是开启两个线程。然后给每个线程上的任务分别设置不同的 udid 和端口号。
然后看是否能并发执行。
先用命令行开启两个 macaca server

1. macaca server -p 3456 --verbose
2. macaca server -p 3457 --verbose

端口 3457 对应 iPhone 7 Plus
端口 3456 对应 iPhone 6s
java 测试代码如下

import com.alibaba.fastjson.JSONObject;

/**
 * Created by sixleaves on 2017/2/16.
 */
public class MClient implements Runnable{

    private String port;
    private String udid;
    private macaca.client.MacacaClient driver = new macaca.client.MacacaClient();
    public void run() {
        JSONObject porps = new JSONObject();
        porps.put("platformName", "ios");
        porps.put("reuse", 1);
        porps.put("udid", getUdid());
        porps.put("platformVersion", "10.1.1");
        porps.put("deviceName", "iPhone 7 plus");
        porps.put("bundleId", "com.netdragon.quicktest");
        porps.put("host", "127.0.0.1");
        porps.put("port", getPort());
        JSONObject desiredCapabilities = new JSONObject();
        desiredCapabilities.put("desiredCapabilities", porps);
        try {
            driver.initDriver(desiredCapabilities);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public String getUdid() {
        return udid;
    }

    public void setUdid(String udid) {
        this.udid = udid;
    }

    public String getPort() {
        return port;
    }

    public void setPort(String port) {
        this.port = port;
    }
}
public class Main {

    public static void main(final String[] args) {

        String[] udids ={"1de34bc9fca390771d274bd72cd61ec85c750f02",
                "55c36c2ae2c7da2091d4b07ef275a7a80cb31167"};
        String[] ports = {"3456", "3457"};
        for (int i = 0; i < 2; i++) {
            MClient client = new MClient();
            client.setPort(ports[i]);
            client.setUdid(udids[i]);
            new Thread(client).start();
        }
    }

}

运行后,能在 iPhone 6s 编译成功并启动对应程序,但是对于 iPhone 7Plus 只看到驱动编译到手机上,但是没法启动应用程序。并且 iPhone 7Plus 对应的服务端并没输出,而是输出到了 6s 那台服务器上。注意到日志的一个细节Proxy: /session:POST to http://127.0.0.1:8900/., 两次的 POST 请求对应的端口号都一样? 这边是不是有问题,怎么解决?

共收到 20 条回复 时间 点赞

3456 服务器终端的日志输出

>> proxy.js:56:14 [master] pid:13272 Proxy: /session:POST to http://127.0.0.1:8900/session:POST with body: {"desiredCapabilities":{"bundleId":"com.netdragon.quicktest","platformVersion":"10.1.1","platformName":"ios"}}
>> proxy.js:84:20 [master] pid:13272 Got response with status 200: {"value":{"sessionId":"DBB9A8A9-008D-4C3F-9D7B-56DA8A847ACB","capabilities":{"device":"iphone","browserName":"思维大学","sdkVersion":"10.1.1","CFBundleIdentifier":"com.netdragon.quicktest"}},"sessionId...
>> responseHandler.js:47:14 [master] pid:13272 Send HTTP Respone to Client: {"sessionId":"b77bcfa0-513d-49dc-ba37-6c4ad7bb6bd9","status":0,"value":"{\"reuse\":1,\"port\":\"3456\",\"platformVersion\":\"10.1.1\",\"bundleId\":\"com.netdragon.quicktest\",\"host\":\"127.0.0.1\",\"platformName\":\"ios\",\"udid\":\"1de34bc9fca390771d274bd72cd61ec85c750f02\",\"deviceName\":\"iPhone 7 plus\"}"}
>> proxy.js:56:14 [master] pid:13272 Proxy: /session:POST to http://127.0.0.1:8900/session:POST with body: {"desiredCapabilities":{"bundleId":"com.netdragon.quicktest","platformVersion":"10.1.1","platformName":"ios"}}
>> proxy.js:84:20 [master] pid:13272 Got response with status 200: {"value":{"sessionId":"F37C9C77-BC69-4852-93B2-7BD8A25A994F","capabilities":{"device":"iphone","browserName":"思维大学","sdkVersion":"10.1.1","CFBundleIdentifier":"com.netdragon.quicktest"}},"sessionId...
>> responseHandler.js:47:14 [master] pid:13272 Send HTTP Respone to Client: {"sessionId":"77911724-a4eb-4aa6-9bd9-d590d285d2ba","status":0,"value":"{\"reuse\":1,\"port\":\"3457\",\"platformVersion\":\"10.1.1\",\"bundleId\":\"com.netdragon.quicktest\",\"host\":\"127.0.0.1\",\"platformName\":\"ios\",\"udid\":\"55c36c2ae2c7da2091d4b07ef275a7a80cb31167\",\"deviceName\":\"iPhone 7 plus\"}"}


求个解释,现在是支持还是不支持,就一句话。

#4 楼 @harsayer 这是安卓,你有试过 iOS 的么?

#4 楼 @harsayer 我们经过测试,加个延迟,偶尔能两部机器同时启动。但是经常是不行,而且就算可以,接下来跑的脚本全部会串到同一部机器上。而且安卓的底层和 iOS 是不一样的。iOS 这边他们用了端口映射工具,这边有点问题。

#5 楼 @sixleaves 当然试过的。你参考下我 mac 部署那篇。也都是 testng 驱动多执行。

#7 楼 @harsayer 那我这边这样写为啥不行~, 我关心的是问题的本质。我这样做也没错啊~

#7 楼 @harsayer 你说的部署是哪一篇。能给个连接参考么~

#4 楼 @harsayer 而且 macaca 这边明显存在问题,你怎么解释他们是根据真机的监听的端口来映射本机的端口这个问题。如果要解决这个问题,要么改服务端的机制。要么改手机上 WDA 的端口监听机制。

sixleaves Macaca Android 和 iOS 并行测试 中提及了此贴 02月17日 16:25

#9 楼 @sixleaves https://testerhome.com/wiki/macaca
https://testerhome.com/topics/6507
https://testerhome.com/topics/6532

“加个延迟,偶尔能两部机器同时启动。但是经常是不行,而且就算可以” 我这儿也会偶发 怎么讲 加了 server 延迟 是不太稳定,但
我们这实际结果只是头 2 次偶发而已 后边就会很稳定了。指定 port 是放在利用 testng 来控制的 。
具体原理 你参考 https://testerhome.com/junhe 或者 进钉钉群问原作者 xdf

#10 楼 @sixleaves https://testerhome.com/topics/6810 该人在 Mac 系统下 这种方式 你也可以说试下 mac 系统连安卓和 ios 真机

#13 楼 @harsayer 不想试了,连这种最基本的简单的测试代码都跑不了。现在我们换方案先替代了。

IOS 的指令都默认代理到 mac 的 8900 端口,我觉得这个逻辑改下应该可以,不知道有没有人解决,我回头研究研究

还有上面初始化的方式不对

应该是

JSONObject desiredCapabilities = new JSONObject();
       desiredCapabilities.put("host", "127.0.0.1"); // custom server  host 
       desiredCapabilities.put("port", 3457); // custom server  port 
       desiredCapabilities.put("desiredCapabilities", porps);
       driver.initDriver(desiredCapabilities);
Baozhida 回复

主要是我也不熟悉 node.js 但是大概看了下逻辑,好像是有先检查 8900 有没有被占用,有的话就会使用其他端口。具体我也不清楚,现在没空搞这个了,后面有时间再来看。如果你研究出来了,记得和我分享下啊~ @utopia

Baozhida 回复

但问题确实是每次都使用了 8900。

sixleaves 回复

启动两台 iphone 真机,我这边已经修改 macaca 里面的代码实现了,现在并发执行遇到点问题,解决了会共享出来

Baozhida 回复

嗯嗯,你只要能把它映射到 PC 端口,改成不一样应该就没问题了。但是我不知道从何下手去改。

10 台安卓设备并行任务的话,得起 10 个 macaca server?

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