appium 多线程还是多进程(转)
https://www.cnblogs.com/zouzou-busy/p/11440175.html
在前面我们都是使用一个机器进行测试,在做app自动化的时候,我们要测不同的机型,也就是兼容性测试,如果一台一台设备去执行,那就显的太麻烦了。所以经常需要我们启动多个设备,同时跑自动化测试用例,要跑多个设备时,首先要启动多个appium服务。
启动多个appium服务
在之前我们都是在命令行里输入appium来启动appium服务,这样启动的默认端口是4723,我们可以使用-p参数来指定端口号,输入appium等价与appium -p 4723

启动另一个服务
appium -p 4725

这样我们就启动了两个appium服务。
服务要隔一个数字,如端口为4723,则4724为连接安卓设备的端口号,所以下个服务为4725
appium的参数
appium不止一个参数-p,还有其他的参数
| 参数 | 默认值 | 含义 |
| -U,--udid | null | 连接物理设备的唯一设备标识符 |
| -a,--address | 0.0.0.0 | 监听的ip地址 |
| -p,--port | 4723 | 监听的端口 |
| -bp,--bootstrap-port | 4724 | 连接Android设备的端口号(Android-only) |
| -g,--log | null | 将日志输出到指定文件 |
| --no-reset | false | session之间不重置应用状态 |
| --session-override | false | 允许session被覆盖(冲突的话) |
| --app-activity | null | 打开Android应用时,启动的Activity的名字 |
| --app | null | 本地app的路径或远程的安装包 |
其他的参数可以使用appium -h查看

多设备启动
前提条件:
1.连接两个机器

2.启动两个服务
yaml文件

platformName: Android
platforVersion: 6.1.1
deviceName: 127.0.0.1:62001
appPackage: com.jgw.csca
appActivity: com.jgw.csca.view.activity.LoginActivity
unicodeKeyboard: True
resetKeyboard: True
noReset: False
ip: 127.0.0.1
port: 4723

脚本

from appium import webdriver
import yaml devices_list = ['127.0.0.1:62001', '127.0.0.1:62025'] # 两个设备 '''
udid是设备的,如果是真机,这个必须有,有udid后deviceName就可以随便写一个
port是appium服务的端口,我启动的是4723和4725
'''
def desiredCaps(udid, port):
with open('../conf/capability.yaml', 'r', encoding='utf-8') as file:
data = yaml.load(file, Loader=yaml.FullLoader)
desired_caps = {}
desired_caps['platformName'] = data['platformName']
desired_caps['platforVersion'] = data['platforVersion']
desired_caps['deviceName'] = data['deviceName']
desired_caps['udid'] = udid
desired_caps['appPackage'] = data['appPackage']
desired_caps['appActivity'] = data['appActivity']
desired_caps['unicodeKeyboard'] = data['unicodeKeyboard']
desired_caps['resetKeyboard'] = data['resetKeyboard']
desired_caps['noReset'] = data['noReset']
driver = webdriver.Remote('http://' + str(data['ip']) + ':' + str(port)+ '/wd/hub', desired_caps)
'''
第一次启动
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
第二次启动
driver = webdriver.Remote('http://127.0.0.1:4725/wd/hub', desired_caps)
'''
return driver if __name__ == '__main__':
desiredCaps(devices_list[0], 4723)
desiredCaps(devices_list[1], 4725)

这样,第一台设备执行结束之后就会在第二台设备上执行
多进程启动多个设备
可以使用python的多线程或者多进程实现,推荐使用多进程,原因如下
多进程中,同一个变量,各自有一份拷贝存在于每个进程中, 互不影响。而多线程中,所有变量都由所有线程共享,所以,任何一个变量都可以被任何一个线程修改, 因此,线程之间共享的数据量最大的危险在于多个线程同一时间修改一个变量,容易把数据给改乱了
前置条件,和上面的一样

from appium import webdriver
import yaml
import multiprocessing devices_list = ['127.0.0.1:62001', '127.0.0.1:62025'] # 两个设备 def desiredCaps(udid, port):
with open('../conf/capability.yaml', 'r', encoding='utf-8') as file:
data = yaml.load(file, Loader=yaml.FullLoader)
desired_caps = {}
desired_caps['platformName'] = data['platformName']
desired_caps['platforVersion'] = data['platforVersion']
desired_caps['deviceName'] = data['deviceName']
desired_caps['udid'] = udid
desired_caps['appPackage'] = data['appPackage']
desired_caps['appActivity'] = data['appActivity']
desired_caps['unicodeKeyboard'] = data['unicodeKeyboard']
desired_caps['resetKeyboard'] = data['resetKeyboard']
desired_caps['noReset'] = data['noReset']
driver = webdriver.Remote('http://' + str(data['ip']) + ':' + str(port)+ '/wd/hub', desired_caps) return driver desired_process = [] # 存储多设备 for i in range(len(devices_list)):
port = 4723 + 2*i
desired = multiprocessing.Process(target=desiredCaps, args=(devices_list[i], port))
desired_process.append(desired) # 将设备添加到里面,ip和端口 if __name__ == '__main__':
for desired in desired_process:
desired.start() for desired in desired_process:
desired.join()

appium 多线程还是多进程(转)的更多相关文章
- 深入解析PHP中的(伪)多线程与多进程
本篇文章是对PHP中的(伪)多线程与多进程进行了详细的分析介绍,需要的朋友参考下 (伪)多线程:借助外力利用WEB服务器本身的多线程来处理,从WEB服务器多次调用我们需要实现多线程的程序.QUOTE: ...
- c++的多线程和多进程
一.多进程和多线程对比 多进程:进程不止一个,开销比较大,通信方式比较复杂(可以用过管道.文件.消息队列进行通信),维护成本不高. 多线程:利用共享内存的方式进行指令的执行,开销比较低,但是维护起来比 ...
- python多线程和多进程对比
1.多线程:开启一个进程test.py ,占用两个cpu 共占用45%左右(top -c ,按1) 多进程:开启两个进程test.py 用两个cpu 90%*2左右 test.py # codi ...
- python 多线程和多进程基本写法
#coding=utf-8 def aJob(arg): """ 提供给多线程调用 """ import threading t = thr ...
- 多线程 or 多进程?[转]
在Unix上编程采用多线程还是多进程的争执由来已久,这种争执最常见到在C/S通讯中服务端并发技术的选型上,比如WEB服务器技术中,Apache是 采用多进程的(perfork模式,每客户连接对应一个进 ...
- 多线程、多进程、协程、缓存(memcache、redis)
本节内容: 线程: a:基本的使用: 创建线程: 1:方法 import threading def f1(x): print(x) if __name__=='__main__': t=thread ...
- 多线程 or 多进程 (转强力推荐)
在Unix上编程采用多线程还是多进程的争执由来已久,这种争执最常见到在C/S通讯中服务端并发技术 的选型上,比如WEB服务器技术中,Apache是采用多进程的(perfork模式,每客户连接对应一个进 ...
- tcp 多线程与多进程调用close
http://blog.csdn.net/russell_tao/article/details/13092727 大家知道,所谓线程其实就是“轻量级”的进程.创建进程只能是一个进程(父进程)创建另一 ...
- Python串行运算、并行运算、多线程、多进程对比实验
转自:http://www.redicecn.com/html/Python/20111223/355.html Python发挥不了多核处理器的性能(据说是受限于GIL,被锁住只能用一个CPU核心, ...
随机推荐
- 【MySQL】你以为设置了并行复制就降低延迟了?这个你绝对想不到!
在MySQL官方版本中,为了保证其的高可用性,一般情况我们会采用主从复制的方式来解决.当然,方法很多.而我们今天所要处理的是采用GTID方式并且开了多线程复制后,仍然延迟的情况,糟糕的是,延迟还在不断 ...
- Js获取url问号(View_Detail?data='+data.zjb_ID+'&'+data.D_Name)传值
Js逻辑 View_Detail?data='+data.zjb_ID+'&'+data.D_Name <script> $(function () { var url = dec ...
- [ipsec][crypto] 有点不同的数字证书到底是什么
前言 前言是在写完了全文之后回头补的.本意是想完全抽象的把证书的抽象逻辑意义表达出来,因为你能找到的大部分 资料都深陷在技术细节与行业规范里.只有其型没有其理,没有什么比理解一个事物的内在合理性更有乐 ...
- Python标准库-datatime和time
Python标准库-datatime和time 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.标准库datatime 1>.datatime模块 #!/usr/bin/e ...
- Luogu P1970 花匠
Luogu P1970 花匠 本质上就是找最长的波浪序列. 因为考虑到第一个必选,所以可以让$lst=h[1]$. 此外,注意到$n=1$是要特判,其他情况下显然$ans\geq 2$,所以把$dir ...
- 《CoderXiaoban》第八次团队作业:Alpha冲刺5
项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 实验十二 团队作业8:软件测试与ALPHA冲刺 团队名称 Coderxiaoban团队 作业学习目标 (1)掌握软件测试基 ...
- 《BUG创造队》作业8:软件测试与Alpha冲刺(第三天)
项目 内容 这个作业属于哪个课程 2016级软件工程 这个作业的要求在哪里 实验十二 团队作业8:软件测试与ALPHA冲刺 团队名称 BUG创造队 作业学习目标 (1)掌握软件测试基础技术.(2)学习 ...
- 原生js获取display属性注意事项
原生js获取diaplay属性需要在标签上写行间样式style='display:none/block;' <div style="display:block;">&l ...
- *.net框架 - IEnumerable类 & IQueryable类
什么使用IQueryable<T> 查询返回类型为什么用IQueryable<T>,而不用 IEnumerable<T>类型? IQueryable接口实现IEnu ...
- #define的一个小技巧
/* atof example: sine calculator */ #include <stdio.h> /* printf, fgets */ #include <stdlib ...