Macaca Macaca wd.java 业务脚本里指定运行 server 的 host 和 port 与驱动多安卓设备并行

老马 · 2016年12月01日 · 最后由 mumu 回复于 2018年03月19日 · 2496 次阅读

测试目的

满足多真机驱动执行业务流脚本的目的,需要针对指定业务流脚本对应的 server 的 host 和 port

参考样例

macaca-multi-task-sample nodejs 版的多机驱动样例。

macaca-multi-task-sample

[基于 Node.js 的自动化测试-Macaca] - 原来程序员都是这么聊天的

看样例思路就是在脚本初始化的时候,获取并传递了 server 的相关属性。

试验过程

在脚本代码里尝试添加指定 server 的 desiredCapabilities 属性。于是首先想到的是添加到,porps.put() 之后

但是然并卵。

最后,分析下 macaca java 脚本的整个执行处理流程,应该是先初始化 server 的属性,如果不赋值就是默认的 3456 端口,然后是找到 porps.put 这些要运行的 app 属性值,然后才是去通过 adb 来联通设备,这样来初始化

那么好了,初始化 server 的这段代码在该处:

JSONObject desiredCapabilities = new JSONObject();
desiredCapabilities.put("desiredCapabilities", porps);
driver.initDriver(desiredCapabilities);

所以我们应该写到这里,去赋值 server 的 host 和 port 属性值。
然后尝试如下:

public class AndroidAcpTest {
    MacacaClient driver = new MacacaClient();
    @BeforeMethod
    public void setUp() throws Exception {
        //Logger logger = Logger.getLogger(getClass()); 
        JSONObject porps = new JSONObject();
        porps.put("autoAcceptAlerts", true);
        porps.put("javascriptEnabled", true);
      //porps.put("deviceName", "iPhone 6s"); //ios 需要指定设备名
        porps.put("platformName", "Android"); // Android or ios
        porps.put("version", ""); //系统版本 ios需要指定系统版本
        porps.put("reuse", 3);
        /* 0: Launch the simulator and install the app. 
        1 (default): Uninstall the app and reinstall the app. 
        2: Only reinstall the app. 
        3: Keep the simulator and app after testing.*/

      //porps.put("udid", "your udid"); //ios udid 唯一设备识别符
      //porps.put("bundleId", "zx.ios-app-bootstrap"); //ios bundleId App应用标识符
      //porps.put("app", "D:\\Install\\apk\\acp_***.apk");
        porps.put("package", "com.***");//appPackage   
        porps.put("activity", ".***");//appActivity 

        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);

    }

这样再在 Eclipse 中右键 Run as->TestNG Test 看下执行情况,就发现成功指定了该段业务脚本需要运行的 server 端口为 3457 了 。

效果如下图:
启动了两个 macaca server --verbose 同时启动了个设备虚拟机,再执行业务流脚本.

我们便看到真正跑脚本的是 3457 的那个端口的 server

多设备执行不同或相同的业务脚本

接着改造 testng.xml 来传递参数 port 和 udid,同时控制用例脚本执行顺序的话,遇到个并行驱动设备 server 报错的问题。

社员 @adfghzhang 已经研究解决了,添加 server 延时,可解决 server 并行执行报错的问题。

请参考使用 Macaca 进行 Android 多设备测试

最终和同事一起改成了这样:

testng.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="AndroidAcpTestMulti" parallel="tests" thread-count="2">
    <test name="AndroidAcpTest1"> 
        <parameter name="port" value="3456" />
        <parameter name="udid" value="192.168.97.101:5555" /> 
        <classes>
            <class name="uiauto.AndroidAcpTest " />
        </classes>
    </test> 


    <test name="AndroidAcpTest2"> 
        <parameter name="port" value="3457" />
        <parameter name="udid" value="192.168.97.102:5555" /> 
        <classes>
            <class name="uiauto.AndroidAcpTest " /> //该段你也可以改为执行另一个业务流程比如注册 登录 访问首页等class name
        </classes>
    </test>   
</suite> 

部分业务脚本初始化段

public class AndroidAcpTest {

    MacacaClient driver = new MacacaClient();

    String port;
    String udid;
    @Parameters({"port","udid"})

    @BeforeTest
    public void beforeSuite(String port, String udid) {
          this.port = port;
          this.udid = udid;
      }

    @BeforeClass
    public void setUp() throws Exception {
        //Logger logger = Logger.getLogger(getClass()); 
        JSONObject porps = new JSONObject();
        porps.put("autoAcceptAlerts", true);
        porps.put("javascriptEnabled", true);

      //porps.put("deviceName", "iPhone 6s"); //ios 需要指定设备名
        porps.put("platformName", "Android"); // Android or ios
        porps.put("version", ""); //系统版本 ios需要指定系统版本
        porps.put("reuse", 3);
        /* 0: Launch the simulator and install the app. 
        1 (default): Uninstall the app and reinstall the app. 
        2: Only reinstall the app. 
        3: Keep the simulator and app after testing.*/

        porps.put("udid", udid);// custom devices udid 

      //porps.put("udid", "your udid"); //ios udid唯一设备识别符
      //porps.put("bundleId", "zx.ios-app-bootstrap"); //ios bundleId App应用标识符

        //porps.put("app", "D:\\Install\\apk\\***-***.apk");
        porps.put("package", "com.***.***");//appPackage   
        porps.put("activity", ".BootUI");//appActivity 


        JSONObject desiredCapabilities = new JSONObject();
        desiredCapabilities.put("host", "127.0.0.1"); // custom server host 
        desiredCapabilities.put("port", Integer.parseInt(port)); // custom server port 
        desiredCapabilities.put("desiredCapabilities", porps);

          if(port.equals("3457"))
            {
                Thread.sleep(1000);
            }
        driver.initDriver(desiredCapabilities);

    }

然后自己又在 ubuntu 下尝试了下执行不同的业务流:

更多信息请参考 wiki 汇总

小马的 macaca 入门指引合集

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 7 条回复 时间 点赞

如果一台电脑插两台手机,可以同时跑一套脚本?

#2 楼 @guoqx 可以 不是还可以指定 udid 的 只要业务脚本 两台手机上的数据不冲突 应该可以同一业务脚本 跑在两台机器上.

就是可以指定两个 udid 然后指定两个端口,这样两套脚本可以在一台电脑上可以同时运行在两台手机上,这样吗

@harsayer 小马哥,你好,我按照您的步骤参数化端口了,但是还是只执行端口 3456 这个服务

1.-----------------------------------------testNG 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<! DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
















![]





2.-----------------------------------------java 代码:

@Parameters({ "port", "udid" })
/** 这边参数化数据通过 testng 来获取 */
@BeforeClass
public void setUp(String port, String udid) throws Exception {
JSONObject porps = new JSONObject();
porps.put("platformName", "android");// 平台名称 android or ios
porps.put("package", "com.txtw.green.one");// 已安装直接启动
// com.github.android_app_bootstrap
porps.put("autoAcceptAlerts", true);
porps.put("javascriptEnabled", true);
porps.put("udid", udid);// 参数化 adb 设备名称
porps.put("reuse", 3);// 0:启动模拟器并安装应用程序。 1(默认):卸载应用程序并重新安装应用程序。 2:只重装应用。
// 3:保持模拟器和应用程序经过测试
JSONObject desiredCapabilities = new JSONObject();
desiredCapabilities.put("host", "172.168.40.41"); // custom server host
desiredCapabilities.put("port", Integer.parseInt(port)); // custom
desiredCapabilities.put("desiredCapabilities", porps);
// 要写后面一个
if (port.equals("11850") | port.equals("11664")) {
Thread.sleep(2000);
}
driver = driver.initDriver(desiredCapabilities);
long id = Thread.currentThread().getId();
System.out.println("Before test-method. Thread id is: " + id);
}

3.-----------------------------------------macaca 服务窗口三个:

老马 关于 Macaca 的并发测试 (iOS) 中提及了此贴 02月16日 16:44
老马 关于 Macaca 的并发测试 (iOS) 中提及了此贴 02月20日 09:50

@leyili1988 我也遇到了这个问题,请问问题解决了吗?如何解决的?

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