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

前言

在上篇文章《使用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上运行,得到在线报告

posted @ 2020-04-27 20:34  cnhkzyy  阅读(909)  评论(2编辑  收藏  举报