前言:

之前通过重写unittest的初始化方法加入设备参数进行并发,实现了基于unittest的appium多设备并发,但是考虑到unittest的框架实在过于简陋,也不方便后期的Jenkins的持续集成,所以想换一个框架来使用。

那么通过调研,pyhon+pytest+allure 这套框架很不错,pytest是一个单元测试框架,他可以集成很多插件,包括出错重试,参数化,等。在此特别是基于他的allure插件,能够和Jenkins完美兼容,生成美观强大的测试报告。

改造思路:

pytest框架和unittest框架明显不同,通过命令行启动,读取响应目录下的test开头的文件,进行执行用例。

而unittest却是通过将用例加载到TestSuite中,运行随测试集来执行用例

所以这边多进程就要换一种思路进行了。

基于pytest的结构和运行方式,那么思路如下:

运行方式:

1. pytest目录下会先加载conftest.py运行。

2. 该目录下加载test开头的py文件

3. 加载文件中Test开头的类

4. 加载Test类下test开头的方法

5. 通过命令行pytest.main([1, 2 ,3])带入1 2 3参数进行运行

解决思路:

1. 通过命令行把不同设备的参数传递给conftest.py

2. conftest中,使用传递过来的设备参数,连接设备到appium,并生成driver对象

3. 在各自的测试类和测试方法中,调用driver对象,进行测试操作

4. 生成allure测试报告

实现:

1. 通过命令行传递参数:

run中的设备池:

def devices_Pool():
devices_list = []
for i in range(0, len(getDevices())):
_initApp = {}
_initCaps = {}
_initApp["devices"] = getDevices()[i]
_initCaps["deviceName"] = getDevices()[i]
_initCaps["platformVersion"] = getPhoneInfo(devices=_initCaps["deviceName"])["release"]
_initCaps["platformName"] = "Android"
_initApp["port"] = str(random.randint(4700, 4900))
_initApp["bport"] = str(random.randint(4700, 4900))
_initApp["systemPort"] = str(random.randint(4700, 4900))
_initCaps["automationName"] = "UiAutomator2"
_initCaps["appPackage"] = 'cn.vsx.vc'
_initCaps["appActivity"] = '.activity.RegistActivity'
_initApp["Caps"] = _initCaps
devices_list.append(_initApp)
print(len(getDevices()))
print(len(devices_list))
return devices_list

run中,多进程调用启动命令行,并传递参数:

def runnerPool(device_list):
getdevice = getDevices()
with ProcessPoolExecutor(len(getdevice)) as pool:
pool.map(runPytest, device_list) def runPytest(device):
print(f"cmdopt is {device}")
report = f"report-{device['Caps']['deviceName']}".split(":", 1)[0]
try:
os.system(f"del /s /q E:\\appium-pytest\\{report}")
time.sleep(1)
os.system(f"rd /s /q E:\\appium-pytest\\{report}")
time.sleep(1)
print(f"{report} report has deleted")
except:
print("no directory existed")
finally:
print(f"pool run device is {device['devices']}")
pytest.main(["../TestCases/", f"--cmdopt={device}", "--alluredir", f"../{report}/xml"])
time.sleep(1)
os.system(f"allure generate ../{report}/xml -o ../{report}/html")

conftest文件中,获取命令行传递过来的参数:

def pytest_addoption(parser):
parser.addoption("--cmdopt", action="store", default="device", help="None") @pytest.fixture(scope="session")
def cmdopt(request):
return request.config.getoption("--cmdopt")

conftest中通过传递的参数,生成连接对象:

@pytest.fixture(scope="session")
def connectDevice(cmdopt):
device = eval(cmdopt)
device_caps = {}
device_caps["platformVersion"] = getPhoneInfo(device["Caps"]["deviceName"])["release"]
device_caps["platformName"] = "Android"
device_caps["automationName"] = "UiAutomator2"
device_caps["deviceName"] = device["Caps"]['deviceName']
device_caps["udid"] = device["Caps"]['deviceName']
device_caps["appPackage"] = "cn.vsx.vc"
device_caps["appActivity"] = ".activity.RegistActivity"
device_caps["noReset"] = True
device_caps["noSign"] = True
device_caps["unicodeKeyboard"] = True
device_caps["resetKeyboard"] = True
device_caps["systemPort"] = int(device["systemPort"])
remote = "http://127.0.0.1:" + str(device["port"]) + "/wd/hub"
print(f"wo shi pytest {device_caps}")
driver = webdriver.Remote(remote, device_caps)
return driver

测试用例中,使用对象来进行操作:

class Test_groupCall():
@allure.feature("group_call")
@allure.story("login")
def test001_login(self, connectDevice):
'''登入选择单位'''
WebDriverWait(connectDevice, 10).until(
lambda x: x.find_element_by_xpath(
"//android.widget.TextView[contains(@text, '选择单位')]").is_displayed()) # 验证等待10秒超时
x = connectDevice.get_window_size()['width'] # 获取当前屏幕宽
y = connectDevice.get_window_size()['height'] # 获取当前屏幕高
a, b = 170 / 768, 790 / 1184 # 选择单位222系数
connectDevice.find_element_by_xpath("//android.widget.TextView[contains(@text, '选择单位')]").click()

最后:

多设备连接时,一定要注意给每个desired_caps中加入每个设备自己的systemPort,否则会连接不上多设备,至此改造成功,最后生成的报告也让人满意:

Appium 并发多进程基于 Pytest框架的更多相关文章

  1. Appium 并发测试基于unitest

    前言: 在回归测试阶段,UI测试,兼容测试是测试的必要步骤.UI自动化的本身是比较冗余的测试,但是换个角度思考,UI自动化同时连接多台设备,那么在回归测试时,在同一个脚本下产生的测试结果是非常有价值的 ...

  2. 使用allure工具生成测试报告(基于pytest框架)

    一.allure简介:一个轻量级的,灵活的,支持多语言,多平台的开源report框架 Allure基于标准的xUnit结果输出,但是添加了一些补充数据.任何报告都是通过两个步骤生成的.在测试执行期间( ...

  3. 自从学会了Python自动化Pytest框架,领导再也不敢在我背后指手划脚了

    前言 大家都知道Python有自带的单元测试框架unittest,那为什么还要学习Pytest呢?先了解下Pytest优点 pytest: pytest是一个非常成熟的全功能的Python测试框架,是 ...

  4. 『德不孤』Pytest框架 — 1、Pytest测试框架介绍

    目录 1.什么是单元测试框架 2.单元测试框架主要做什么 3.单元测试框架和自动化测试框架有什么关系 4.Pytest测试框架说明 5.Pytest框架和Unittest框架区别 (1)Unittes ...

  5. 基于netty框架的Socket传输

    一.Netty框架介绍 什么是netty?先看下百度百科的解释:         Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开 ...

  6. 基于VUE框架 与 其他框架间的基本对比

    基于VUE框架的基本描述 与 其他框架间的基本对比 2018-11-03  11:01:14 A B React React 和 Vue 有许多相似之处,它们都有: 使用 Virtual DOM 提供 ...

  7. pytest框架之fixture详细使用

    本人之前写了一套基于unnitest框架的UI自动化框架,但是发现了pytest框架之后觉得unnitest太low,现在重头开始学pytest框架,一边学习一边记录,和大家分享,话不多说,那就先从p ...

  8. 【前端框架系列】浅谈当前基于bootstrap框架的几种主流前端框架

    一  概述 当新开发一个项目或产品时,技术选型是一个不可缺少的环节,在软件架构中有着举足轻重的作用,可以这么说,技术选型的好坏直接影响项目或产品的成败优劣,因此,在进行软件架构时,一定要想好技术选型. ...

  9. 基于SSH框架的在线考勤系统开发的质量属性

    我要开发的是一个基于SSH框架的在线考勤系统. 质量属性是指影响质量的相关因素,下面我将分别从6个系统质量属性(可用性,易用性,可修改性,性能,安全性,可测试性)来分析我的系统,以及如何实现这些质量属 ...

随机推荐

  1. MVC ---- EF4.0和EF5.0增删改查的写法区别及执行Sql的方法

    EF4.0和EF5.0增删改查的写法区别 public T AddEntity(T entity) { //EF4.0的写法 添加实体 //db.CreateObjectSet<T>(). ...

  2. Python matplot的使用(一)

    其实,使用它的直接原因是因为matlab太大了,不方便.另外,就是它是免费的. 在安装这个库的时候,会需要安装一些它所依赖的库,比如six等.从sourceforge上下载,只需按照提示安装完成就行了 ...

  3. Qt_2D_画图教程

    1. ZC: 看点:相同的API,QPainter.QPainterDevice和QPainterEngine这3个类 Qt学习之2D绘图(画刷和画笔) http://blog.csdn.net/lp ...

  4. 使用tk.mybatis快速开发curd

    使用mybatis已经是可以快速开发程序了,对于单表的curd似乎是一种可抽象的结果,下面介绍tk.mybatis的使用方式. maven引用 我使用的是这个版本,所以相关功能介绍也是这个版本. 使用 ...

  5. AMD,CMD.CommonJs和UMD还有es6的模块化对比

    CommonJS CommonJS是服务器端模块的规范,Node.js采用了这个规范. 根据CommonJS规范,一个单独的文件就是一个模块.加载模块使用require方法,该方法读取一个文件并执行, ...

  6. asp.net Core MVC + webpack 笔记

    webpack 是一个打包工具,用在asp.net Core MVC 会觉得有必要吗? MVC 本身就有bundler~ 如果用过webpack就会知道,打包出来的效果结果就是不一样,MVC的打包就是 ...

  7. 转:Too many systemd: Created slice !

    OS: centos-release-7-4.1708 /va/log/message  大量这种提示信息: resolvent: Here is how I got rid of these: vi ...

  8. 12月22日 update_columns,完成第9节。

    Update_columns(attributes) //等同于update_column 直接更新database. 使用UPdate SQL 语法. ⚠️ :忽略了validations, Cal ...

  9. Maven部署web应用到远程服务器

    Maven部署web应用到远程服务器 找到了一个很详细的地址:http://www.mkyong.com/maven/how-to-deploy-maven-based-war-file-to-tom ...

  10. Almost Acyclic Graph CodeForces - 915D (思维,图论)

    大意: 给定无向图, 求是否能删除一条边后使图无环 直接枚举边判环复杂度过大, 实际上删除一条边可以看做将该边从一个顶点上拿开, 直接枚举顶点即可 复杂度$O(n(n+m))$ #include &l ...