使用pytest-xdist实现分布式APP自动化测试:基于socket

1|0前言


在上篇文章《使用pytest-xdist实现分布式APP自动化测试:基于SSH》中,尝试了使用SSH来实现master和worker的通信网关,现在来看下使用socket怎么实现。其实在最开始的《使用pytest-xdist实现分布式WEB自动化测试》已经提到过socket,这次再将实现APP自动化测试的细节做一说明

2|0项目环境


2|1系统环境


角色 系统 Python版本 ip
master Centos7.6 v3.8.0 192.168.0.109
worker1 Centos7.6 v3.8.0 192.168.0.126
worker2 Centos7.6 v3.8.0 192.168.0.136

2|2客户端环境


测试机 系统 ip tcpip
逍遥模拟器-1 v7.1.2 192.168.0.112 6666
逍遥模拟器-2 v7.1.2 192.168.0.113 6666

2|3运行环境


容器 版本 端口号 宿主机器
appium_2 v1.17.0 4725->4723 worker1
appium_2 v1.17.0 4725->4723 worker2

3|0项目结构


主要的测试用例存储在test_case.py中,main.py是运行入口

APP_Xdist_AutoTest |--allure_reports |--common |--base_driver.py ... |--caps |--cpas.py |--images |--html_reports |--logs |--page_objects |--base_page.py |--login_page.py ... |--test_cases |--conftest.py |--test_login.py ... |--test_datas |--login_data.py |--pytest.ini |--main.py |--README.md |--requirements.txt

4|0准备工作


4|1挂载报告目录


与上篇相同。略

4|2模拟器设置


与上篇相同。略

4|3启动服务


docker, appium_2, 连接模拟器与上篇相同。略
这里讲一下socketserver.py,将它下载好分别放在两个worker的/opt目录下,然后运行python3 socketserver.py

5|0同步运行


5|1同步方式


这种同步方式又和SSH不同了,因为它没法指定目录,当你的worker在什么目录时,它就将pyexecnetcache放在哪个目录下
比如一开始我们的worker在/opt目录下,使用同步并运行的命令

pytest -d --tx socket=192.168.0.126:8888 --tx socket=192.168.0.136:8888 --rsyncdir ./APP_Xdist_AutoTest

master

worker1

worker2

然后试着将worker所在位置切换到根目录。注意这里你要运行socketserver.py只能使用python3 /opt/socketserver.py(这里只是举个例子,要运行时肯定是要切到/opt目录下,因为我们的挂载点路径是/opt/pyexecnetcache/APP_Xdist_AutoTest/allure_reports)
master

worker1

worker2

看到报错,和我们前面解释的一样,是因为项目比较复杂,涉及的依赖多,因此只能通过运行main.py方法来实例化driver,再通过conftest中的fixture传递给页面对象

5|2同步运行


先要修改一下main.py

# main.py import pytest import time from multiprocessing import Pool from common.clean import * device_infos = [{"docker_name": "appium_2", "platform_version": "7.1.2", "server_port": 4725}] cur_time = time.strftime("%Y-%m-%d_%H-%M-%S") def run_parallel(device_info): pytest.main([ "-d", "--tx", "socket=192.168.0.126:8888", "--tx", "socket=192.168.0.136:8888", "--rsyncdir", "./", "APP_Xdist_AutoTest", f"--cmdopt={device_info}", #"--junitxml", f"{html_reports_dir}/autotest_report_{cur_time}.xml", #"--html", f"{html_reports_dir}/autotest_report_{cur_time}.html", #"--css", f"{html_reports_dir}/assets/style.css", #"--self-contained-html", "--alluredir", allure_reports_dir ]) os.system(f"allure generate {allure_reports_dir} -o {allure_reports_dir}/html --clean") if __name__ == "__main__": with Pool(1) as pool: pool.map(run_parallel, device_infos) pool.close() pool.join()

然后在各个worker的/opt目录下运行socketserver.py:python3 socketserver.py
最后运行main.py:main.py
master

worker1

worker2

6|0报告预览


服务器上导出的报告容易出现样式缺失,因此要将项目放在jenkins上运行,得到在线报告


__EOF__

本文作者cnhkzyy
本文链接https://www.cnblogs.com/my_captain/p/12789869.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   cnhkzyy  阅读(995)  评论(3编辑  收藏  举报
编辑推荐:
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
点击右上角即可分享
微信分享提示