前言
我们知道,单台 PC 上用 Appium 连接多个 Android 终端进行测试时,需要同时用不同的端口号启动不同的 Appium Server,例如启动两个服务器:
node main.js -p 4723 -bp 4724 -chromedriver-port 9515 -U emulator1
node main.js -p 4725 -bp 4726 -chromedriver-port 9516 -U emulator2
然后测试代码的 AppiumDriver
连接到对应的端口,然后就可以并发地执行测试。
这就意味着有很多环境数据需要配置,包括各种端口号,终端的UDID等,同时也需要为不同的终端分发测试用例,这些数据最好是与 Java 测试代码分离。另外服务器的启动和关闭最好也能通过代码自动执行。
之前我用的是 Junit4 单元测试框架,感觉功能不够强大,难以实现上述要求,后来了解了下 TestNG 框架,它自带的 xml 方式,参数化测试,并发执行等功能,刚好可以用来实现我设想的功能。
完整代码地址: https://github.com/zhongchenyu/AppiumTest ,下面就来介绍一下思路。
效果展示
首先看下最终实现的效果,只需配置好测试套的 xml 文件,将环境信息作为参数,指定好要执行的用例,执行 RunSuite 类,即可完成从启动服务器开始的所有测试过程。
1. 配置测试套 xml 文件,每个xml对应一个终端:
环境参数通过 parameter 标签配置,其中包含:
node:node.exe 的路径,如果配置了系统环境变量,直接填 node 就行。
appium.js:appium.js的路径,新版本的Appium应该是main.js的路径。和node参数配合,用来执行启动Appium 服务器。
port、bootstrap_port、chromedriver_port:Appium服务器的端口。
udid:终端名称,可以通过 adb devices
查到。
剩下的参数为 DesiredCapabilities 需要的参数。
第一个终端 testng1.xml
:
<suite name="WebViewSuit1" >
<parameter name="suitName" value="WebViewSuit1"/>
<parameter name="node" value="node"/>
<parameter name="appium.js" value="C:\Users\chenyu\AppData\Local\Programs\appium-desktop\resources\app\node_modules\appium\build\lib\main.js"/>
<parameter name="port" value="4725"/>
<parameter name="bootstrap_port" value="4726"/>
<parameter name="chromedriver_port" value="9516"/>
<parameter name="udid" value="127.0.0.1:21503"/>
<parameter name="platformName" value="Android"/>
<parameter name="platformVersion" value="4.4.4"/>
<parameter name="deviceName" value="127.0.0.1:21503"/>
<parameter name="appPackage" value="chenyu.memorydemo"/>
<parameter name="appActivity" value=".MainActivity"/>
<parameter name="noReset" value="false"/>
<parameter name="app" value="chenyu.memorydemo-debug-v1.2.apk"/>
<test name="WebView">
<classes>
<class name