zoukankan      html  css  js  c++  java
  • 使用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上运行,得到在线报告

  • 相关阅读:
    PVS 7.6 部署教程
    PHP下载远程图片的3个方法
    [Xcode 实际操作]二、视图与手势-(2)UIView视图的层次关系
    [Swift]检查API可用性
    [Xcode 实际操作]二、视图与手势-(1)UIView视图的基本使用
    [Swift]LeetCode103. 二叉树的锯齿形层次遍历 | Binary Tree Zigzag Level Order Traversal
    [Swift]forEach详解
    [Swift]LeetCode937. 重新排列日志文件 | Reorder Log Files
    [Swift]LeetCode940. 不同的子序列 II | Distinct Subsequences II
    [Swift]LeetCode939. 最小面积矩形 | Minimum Area Rectangle
  • 原文地址:https://www.cnblogs.com/my_captain/p/12789869.html
Copyright © 2011-2022 走看看