最近有人在群里问并发的问题,我就把我的经验写下来供大家参考,我的这些方法其实都是从社区里的帖子找到的,没有什么新鲜的,但是有群友说还是分享一下更好;
主要参考如下帖子和回复
Appium 主从远程控制执行

连接 2 个设备测试的时候每次都只运行一个设备?

Appium Android ——利用 TestNG 并行执行用例

并发时要启动多个服务,所以端口号要不同,可以通过 GUI 和命令行两种方式启动多个服务并修改端口号
GUI 只要点击多次就可以启动多个服务,
如下第一、第二步选取一种就可以了

1.GUI 更改各种端口号

(1)更改服务端的 ip 和端口号,把 ip 改为服务端的 ip,不要用 127.0.0.1,要不然远程的时候,客户端连不上

(2)更改其他端口号,需要哪个就要更改哪个

2.命令行更改端口号

我的 Appium 是装的 GUI 的,但是也可以通过命令行调。
需要把 Appium 的相关路径加到环境变量里,路径如下
C:\Appium\node_modules.bin

命令类似如下:
appium -p 4492 -bp 2251 --selendroid-port 65222

具体见如下网址:
https://github.com/appium/appium/blob/master/docs/cn/appium-setup/parallel_tests.cn.md

3.代码的修改

(1)Android 的配置里记得加上 desired_caps['udid'] 这项,内容与 deviceNme 一致,通过 adb devices 查询到的,这样能保证找到手机

(2)http://192.168.11.11:4723/wd/hub

这项配置要改成你要连接的服务端的 IP 和端口号

我的各种配置都是通过读配置文件来完成配置的,大家可以参考

def setUp(self):
        desired_caps = {}
        desired_caps['platformName'] = global_list.ini_file.get(global_list.mobile_phone,'OS_type') #测试手机的系统类型
        desired_caps['platformVersion'] = global_list.ini_file.get(global_list.mobile_phone,'OS_version') #该手机系统的版本号
        desired_caps['deviceName'] = global_list.ini_file.get(global_list.mobile_phone,'deviceName') #该手机的deviceName,Android请用adb devices查询
        desired_caps['app'] = global_list.ini_file.get(global_list.mobile_phone,'app') #本地apk或者ipa的绝对路径,如果iPhone上安装了app,则为bundle ID
        desired_caps['udid'] = global_list.ini_file.get(global_list.mobile_phone,'udid') #iphone的udid,通过iTunes查找
        appium_server_ip = global_list.ini_file.get(global_list.mobile_phone,'appium_server_ip')
        appium_server_port = global_list.ini_file.get(global_list.mobile_phone,'appium_server_port')
        if global_list.os_type == 'Android':
            desired_caps['automationName'] = global_list.ini_file.get('android_config','automationName') #选择测试引擎
            desired_caps['appPackage'] = global_list.ini_file.get('android_config','appPackage') #app的包名,可以咨询开发
            desired_caps['appActivity'] = global_list.ini_file.get('android_config','appActivity') #咨询开发
            self.driver = webdriver.Remote('http://%s:%s/wd/hub' % (appium_server_ip,appium_server_port), desired_caps)    
        elif global_list.os_type == 'IOS':
            self.driver = webdriver.Remote(
                command_executor='http://%s:%s/wd/hub' % (appium_server_ip,appium_server_port),
                desired_capabilities = desired_caps
                )  

配置文件如下,用的 ini 文件

[all_need]

[email]
mail_from = 
mail_to= 
smtpserver = 
username =
password =

#capabilities
[android_config]
appPackage = com.ifengxy.ifengxycredit.ui
appActivity = .login.LoginActivity
automationName = Selendroid

#capabilities
[ios_config]

#Android app中各种查找元素用id
[android_id]
phone_number_edt = phone_number_edt
password_edt = password_edt
login_btn = login_btn

#IOS app中各种查找元素用id
[ios_id]
phone_number_edt = phone_number_edt
password_edt = password_edt
login_btn = login_btn

#手机的配置
[iphone6]
appium_server_ip = 192.168.11.11
appium_server_port = 4723
OS_type = IOS
OS_version = 8.3
deviceName =
udid = d66916b4ae8728a55f2e09e65bff579d43892080
app = 

[HUAWEI_MATE7]
appium_server_ip = 192.168.11.11
appium_server_port = 4723
OS_type = Android
OS_version = 4.4.2
deviceName = Y9K0214A14004193
udid = Y9K0214A14004193
app = D:\example\test\Credit_enter00003.apk

[MEIZU_MX4]
appium_server_ip = 192.168.11.11
appium_server_port = 4723
OS_type = Android
OS_version = 4.4.2
deviceName = 750ABLDYL593
udid = 750ABLDYL593
app = D:\example\test\Credit_enter00003.apk

通过以上配置,在不同的用例里连接不同的端口号就可以启动并发了
------------------------------------------------------------------分割线 -------------------------------------------------------- 分割线-----------------------------------------

4.主从远程控制

(1)在第一步已经把服务端上配置的 ip 由 127.0.0.1 改成真正的 ip 了,如果不改在客户端是连接不上的
在客户端的机器上如果能打开这个连接就表示可以了http://192.168.11.11:4723/wd/hub (记得把 IP 和端口号改掉)
显示如下文字就是正确的

(2)在客户端的那台机器上安装相应语言的 Appium 客户端
(3)手机要连接到服务端这台机器上
(4)在客户端上启动测试用例,连接想要的 ip 和端口
Android:self.driver = webdriver.Remote('http://%s:%s/wd/hub' % (appium_server_ip,appium_server_port), desired_caps)


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