Appium Appium 并发执行后让不同的手机执行不同的用例,这个怎么实现?

Time · 2021年05月24日 · 最后由 Time 回复于 2022年03月11日 · 2198 次阅读

目前 Appium 的并发执行相同的测试用例可以了,但是为了缩短自动化测试的时间我们需要,不同的手机去执行不同模块的用例,这样子比如 1W 条用例分 10 台手机去跑,每台手机就只需要执行 1000 条用例。
有什么思路提供的嘛,目前的并发基于多进程 +Appium+unittest,可转 pytest。主要看哪种实现方便~
感谢!

共收到 41 条回复 时间 点赞

最粗暴的方法,分成 10 组,每组对应一个设备 id。每次跑的时候,指定。

搞个队列读取所有的用例信息, 然后读取所有设备 id 多进程根据 id 起子进程,然后读队列里面的用例,组合成 pytest 命令,去执行 pytest。

平均分配相等数量用例到多台执行机会引起负载不均衡问题,也就是说,同时开始跑,这台机器累死累活跑完了,发现别的机器早已经跑完在那休息好几个小时了。因为用例数量相等不代表负载相同 (1000 个步骤少的简单用例对比 1000 个步骤多的复杂用例),另外每台执行机的执行速度也可能不同。
解决办法就是,安装插件 pytest-xdist 使 pytest 具备分布式执行能力。分布式执行能够自动做到负载均衡,具体可参考https://www.cnblogs.com/guo2733/p/10955539.html

Time #4 · 2021年05月24日 Author
Thirty-Thirty 回复

好的感谢,我回去研究下这个看看

Time #5 · 2021年05月24日 Author
咸鱼菜鸡 回复

看来都是用 pytest 来做的呢,我老大说让我看看 jenkins 的 pipline 能不能搞定这个😂

Time 回复

那样成本是不是太大

Time 回复

jenkins 的 pipeline 可以控制多节点(前提是你有多节点)跑任务,但没法细到用例级别吧。

建议用 pytest ,匹配度最高,也简单(用多线程,比多节点成本低)。

Time 回复

每个进程不还是需要分配自己 appium 服务和设备吗

Time 回复

和那个有啥关系呀。。你直接多进程控制设备执行用例然后队列分配用例就行了。。没啥太大的难度

Time #10 · 2021年05月25日 Author
回复

我也不清楚啊,我现在是摸象过河。先试下 pytest 框架的吧,我在想 unittest 转过去不会改动太多吧

Time #11 · 2021年05月25日 Author
陈恒捷 回复

嗯嗯转 pytest 需要评估下工作量了,现在还刚起步不是太多,可能会好转些

Time #12 · 2021年05月25日 Author
桦泽 回复

是的多进程里面有分配了自己 的 appium 服务和设备,但是我对多进程这个也不熟悉。是在别人写的多进程上改的😂

Time #13 · 2021年05月25日 Author
咸鱼菜鸡 回复

单个设备的还行,多个设备的没有什么经验,pytest 可能也得再看下,我先按照你说的试看看😂

Time #15 · 2021年05月25日 Author
咸鱼菜鸡 回复

感谢!我尝试着去写下~

Time 回复

大佬 有结果了能不能在这里开源分享下。我最近也在研究这个。但是发现还是用接口的好一些 ui 自动化太麻烦了变数还很多

UI 自动化的用例之间是需要有连续性的,你能保证分配后还具有连续性吗?

Time #18 · 2021年05月25日 Author

😂 不是大佬只能说尝试着去写下,如果写出来了会分享出来的

Time #19 · 2021年05月25日 Author
cmlanche 回复

所以用例要在模块中线性运行最好,用例之间的耦合度不能太高。应该是有人这么做过的,只是需要打磨

咸鱼菜鸡 回复

大佬,我现在想平台化,想做成用例任务在列表那种,可以多选,选择一批用例 点击 run,选多少运行多少,也是随机分配,用多进程可以实现吗,

目前接口自动化还好说,UI 自动化实现这种想法有点麻烦没思路

秦岭 回复

对你后台来说没什么区别吧 不管前台怎么选用例 后台就是拿到用例名 各种参数啥的去跑 你在自己的框架里面设计好就行了呀

Time 回复

能独立就能分配

咸鱼菜鸡 回复

好的,我想想怎么融合,
谢谢大佬

我这边的做法是 pytest+pytest-xdist 二次开发实现
大致思路是参考 pytest_xdist 原本的几种用例分发逻辑自己新实现一种,用来支持 appium 的上下文关联用例和公共用例
原本的用例分发逻辑最小单位是每个 test_函数,修改之后的最小分发单位是单个 py 文件或者可以按你自己具体使用场景改成按模块,这样可以一定程度上保证上下文关联。
然后再单独处理公共部分就行了

对了 需要注意的是 pytest_xdist 在 windows 下进程只有 1

Celery 这个可以不?

Time #26 · 2021年06月10日 Author
NMTor 回复

我在尝试用这个方法去写了,目前是在 windows 下调试的,会出现一台手机挤另一台手机的情况,是要放在 liunx 上去运行才行嘛,还有就是 pytest_xdist 的源码要去哪边改

Time #27 · 2021年06月10日 Author
NMTor 回复

看起来这好像是需要多台 linux 设备用主从去跑

我上面说了 windows 下进程只有 1,调试的话要么用 linux 要么 mac
pytest_xdist 如果你是只是要在某台服务器上运行的话,那就直接修改源文件
如果要移植,那就仿照源码写个新插件
理论上通过 conftest.py 进行复写应该也是可以的
主要的修改点是分发逻辑,源文件是在 “python 安装路径\Lib\site-packages\xdist\scheduler"目录下,里面有初始的几种分发逻辑

Time 回复

不是多个设备,是一台服务器连接多个手机
pytest 主进程进行调度,然后子进程在各个手机上执行具体的用例(虽然官方文档说是支持子进程在不同的服务器上)
可以参考下这篇https://www.cnblogs.com/poloyy/p/12694861.html

仅楼主可见
Time #31 · 2021年06月16日 Author
Tin 回复

是的

32楼 已删除
仅楼主可见
Time #34 · 2021年06月18日 Author
Tin 回复

你可以看下这个博主写的,
https://www.cnblogs.com/grandlulu/p/10282201.html 基于 unittest
https://www.cnblogs.com/grandlulu/p/10331612.html 基于 pytest
我都试过了,这个博主的多进程可行

35楼 已删除
Time #36 · 2021年06月18日 Author

路小坏读配置那边还有起 appium 的进程我没用,可以参考这篇的来启动关闭 appium 的服务还有读取设备信息。
https://www.cnblogs.com/zhenyu1/p/12731836.html

仅楼主可见
Time #38 · 2021年06月18日 Author
Tin 回复

你是 unittest 框架的还是 pytest 框架的

Time 回复

pytest

Time #40 · 2021年06月21日 Author
Tin 回复

https://testerhome.com/topics/30314 可以看下我之前这边的传参,需要用 yield

大佬你好,请问这个问题有解决吗,还有多进程并发执行的话会不会占用太多的内存

想请问下并发是怎么实现的.我这边会报 prot 8100 端口占用问题,依次执行没问题, 设备是 iOS

Time Appium 并发设备执行 中提及了此贴 03月11日 18:13
Time #44 · 2022年03月11日 Author
panliwen 回复

http://testerhome.com/topics/32639 可以看下这篇帖子内容

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册