满足多真机驱动执行业务流脚本的目的,需要针对指定业务流脚本对应的 server 的 host 和 port
macaca-multi-task-sample nodejs 版的多机驱动样例。
[基于 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 并行执行报错的问题。
最终和同事一起改成了这样:
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 下尝试了下执行不同的业务流: