pytest 并发,pytest并发执行多部手机

  pytest 并发,pytest并发执行多部手机

  本文介绍了pytest多线程和多设备并发应用,并通过示例代码进行了详细介绍。对大家的学习或者工作都有一定的参考价值,有需要的朋友可以参考一下。

  

1、appium+python 实现单设备的 app 自动化测试

 

  启动appium服务器,使用4723端口连接计算机和设备,通过adb设备用python代码获取连接的设备,编写启动参数,通过pytest编写测试用例,进行自动测试。

2、若要多设备并发,同时执行自动化测试,那么需要:

 

  确定设备的数量。每台设备对应appium服务器的端口号,启动appiumpytest获取每台设备的启动参数,然后进行自动测试。

  

3、实现策略

 

  步骤1:从设备池中获取当前连接的设备。如果设备池为空,则没有设备连接。

  步骤2:如果设备池不为空,则启动一个线程来启动appium server。它对应于设备的数量。

  服务器的起始端口是4723,每增加一台设备,默认端口号为4。

  步骤3:如果设备池不为空,启动多个线程执行app自动化测试。

  

4、具体实现步骤

 

  

4.1 通过 adb 命令,获取当前已连接的设备数、设备名称、设备的安卓版本号。

 

  定义一个ManageDevices类。

  1.重新启动adb服务。

  2.通过adb devices命令获取当前平台中已连接设备的数量和设备的uuid。

  3.通过adb -P 5037 -s设备UUID shell get propro . build . version . release获取每个设备的版本号

  4.将所有连接设备的设备名称和设备版本号存储在列表中。

  5.通过调用get_devices_info函数,可以在4。

  实现的部分代码是:

  @ title3360app多设备并发-appium pytest

  @作者:柠檬班-简

  @邮箱: lemonban_simple@qq.com

  类别管理设备:

  1.重新启动adb服务。

  2.通过adb devices命令获取当前平台中已连接设备的数量和设备的uuid。

  3.通过adb -P 5037 -s设备UUID shell get propro . build . version . release获取每个设备的版本号

  4.将所有连接设备的设备名称和设备版本号存储在列表中。

  5.通过调用get_devices_info函数,可以在4。

  def __init__(self):

  自我。__devices_info=[]

  #重新启动adb服务

  自我。_ _ run _ command _ and _ get _ stout( ADB kill-server )

  自我。_ _ run _ command _ and _ get _ stout( ADB start-server )

  def get_devices_info(自身):

  获取连接设备的uuid和版本号。

  :返回:所有连接设备的uuid和版本号。

  自我。__get_devices_uuid()

  打印(自我。_ _设备信息)

  自我。_ _获取设备平台版本()

  回归自我。_ _设备信息

  

4.2 定义一个设备配置池。

 

  启动设备参数管理池。

  每个设备:对应一个启动参数和应用服务的端口号。

  1.启动参数模板存储在desired _ caps _ config/desired _ caps . YAML文件中。

  2.从1中的模板读取启动参数。

  3.从设备列表中获取每个设备的uuid和版本号,并与2中的启动参数合并。

  4.为每个设备指定一个应用服务端口号。从4723开始,每增加一个设备,默认增量为4。

  5.对于每个设备,指定与设备进行tcp通信的本地端口号。从8200开始,每增加一个设备,默认增量为4。

  在启动参数中,它由systemPort指定。

  r />因为appium服务会指定一个本地端口号,将数据转发到安卓设备上。
默认都是使用8200端口,当有多个appium服务时就会出现端口冲突。会导致运行过程中出现socket hang up的报错。

  实现的部分代码:

  

def devices_pool(port=4723,system_port=8200):

 

  特别注意事项:2 个及 2 个以设备并发时,会遇到设备 socket hang up 的报错。

  原因是什么呢:

  在 appium server 的日志当中,有这样一行 adb 命令:adb -P 5037 -s 08e7c5997d2a forward tcp:8200 tcp:6790

  什么意思呢?

  将本地 8200 端口的数据,转发到安卓设备的 6790 端口
所以,本地启动多个 appium server,都是用的 8200 端口,就会出现冲突。

  解决方案:

  应该设置为,每一个 appium server 用不同的本地端口号,去转发数据给不同的设备。
启动参数当中:添加systemPort= 端口号来设置。
这样,每个设备都使用不同的本地端口,那么可解决此问题。

  

4.3 appium server 启停管理 。

 

  (ps 此处可以使用 appium 命令行版,也可以使用桌面版)

  

  • 在自动化用例运行之前,必须让 appium server 启动起来。

  • 在自动化用例执行完成之后,要 kill 掉 appium 服务。这样才不会影响下一次运行。

 

  代码实现如下:

  

import subprocess

 

  

4.4 pytest 当中根据不同的启动参数来执行自动化测试用例

 

  在使用 pytest 执行用例时,是通过 pytest.main()会自动收集所有的用例,并自动执行生成结果。

  

 

  这种情况下,appium 会话的启动信息是在代码当中给定的。

  

 

  

 

  以上模式当中,只会读取一个设备的启动信息,并启动与设备的会话。

  虽然 fixture 有参数可以传递多个设备启动信息,但它是串行执行的。

  需要解决的问题的是:

  

  • 可以传递多个设备的启动参数,但不是通过 fixture 的参数。

  • 每传递一个设备启动参数进来,执行一次 pytest.main()

 

  解决方案:

  

  • 通过 pytest 的命令行参数。即在 pytest.main()的参数当中,将设备的启动信息传进来。

  • 使用 python 的多线程来实现。每接收到一个设备启动参数,就启动一个线程来执行 pytest.main

 

  

4.4.1 第一个,pytest 的命令行参数。

 

  首先需要在 conftest.py 添加命令行选项,命令行传入参数--cmdopt。

  用例如果需要用到从命令行传入的参数,就调用 cmdopt 函数。

  

 

  

def pytest_addoption(parser):

 

  

4.4.2 使用多线程实现: 每接收到一个设备启动参数,就启动一个线程来执行 pytest.main

 

  定义一个 main.py。

  

run_case 函数。

 

  此方法主要是:接收设备启动参数,通过 pytest.main 去收集并执行用例。

  

# 根据设备启动信息,通过pytest.main来收集并执行用例。

 

  

每有一个设备,就启动一个线程,执行 run_cases 方法。

 

  

# 第一步:从设备池当中,获取当前连接的设备。若设备池为空,则无设备连接。

 

  到此这篇关于pytest多线程与多设备并发appium的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: