测试目的

满足多真机驱动执行业务流脚本的目的,需要针对指定业务流脚本对应的 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 入门指引合集


↙↙↙阅读原文可查看相关链接,并与作者交流