前言
在上篇文章《使用pytest-xdist实现分布式APP自动化测试:基于SSH》中,尝试了使用SSH来实现master和worker的通信网关,现在来看下使用socket怎么实现。其实在最开始的《使用pytest-xdist实现分布式WEB自动化测试》已经提到过socket,这次再将实现APP自动化测试的细节做一说明
项目环境
系统环境
角色 | 系统 | 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 |
客户端环境
测试机 | 系统 | ip | tcpip |
---|---|---|---|
逍遥模拟器-1 | v7.1.2 | 192.168.0.112 | 6666 |
逍遥模拟器-2 | v7.1.2 | 192.168.0.113 | 6666 |
运行环境
容器 | 版本 | 端口号 | 宿主机器 |
---|---|---|---|
appium_2 | v1.17.0 | 4725->4723 | worker1 |
appium_2 | v1.17.0 | 4725->4723 | worker2 |
项目结构
主要的测试用例存储在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
准备工作
挂载报告目录
与上篇相同。略
模拟器设置
与上篇相同。略
启动服务
docker, appium_2, 连接模拟器与上篇相同。略
这里讲一下socketserver.py,将它下载好分别放在两个worker的/opt目录下,然后运行python3 socketserver.py
同步运行
同步方式
这种同步方式又和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传递给页面对象
同步运行
先要修改一下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
报告预览
服务器上导出的报告容易出现样式缺失,因此要将项目放在jenkins上运行,得到在线报告