python web自动化(分布式测试Grid)

Grid介绍

        Selenium Grid 是 Selenium 提供的⼀个⼯具,⽤于⽀持在多台计算机上并⾏运⾏测试。

        它允许将测试分发到不同的机器和浏览器组合上,同时收集结果。

  1.并⾏执⾏测试⽤例:在不同的机器上并⾏执⾏测试⽤例,从⽽加速整个测试过程。每个

          节点可以并⾏地运⾏测试,⼀般⽤于⼤型测试套件和⼤规模的项⽬

        2.多浏览器和多平台测试:在不同的机器上同时运⾏测试,可以同时在不同的浏览器和操作系统上执⾏测试。确保应⽤程序的跨浏览器和跨平台兼容性⾮常重要\

        3. 资源最⼤化利⽤: 可以利⽤⽹络上多台机器的资源,⽽不是仅仅依赖于本地机器的资源。可以更有效地使⽤硬件资源,尤其是在⼤规模测试或者需要⼤量浏览器并⾏执⾏的情况下
        4.分布式测试环境: 可以设置为在不同的物理位置、不同的⽹络环境或不同的云服务上运⾏测试。这允许你创建 ⼀个分布式的测试环境,以模拟真实的不同使⽤情境

        5.提⾼可靠性: 在分布式环境下执⾏测试可以提⾼测试的可靠性。如果⼀个节点失败,其他节点仍然可以继续执⾏测 试,从⽽减⼩了整个测试过程受到⼀个节点失败的影响

Grid快速⼊⻔

            1.首先我们要配置jdk的运行环境

             2.安装google浏览器,并且配置chromedriver驱动

              3.下载selenium-server-4.5.0.jar插件

                https://github.c om/SeleniumHQ/selenium/releases/tag/selenium-4.5.0

环境都配置好后,在下载的selenium-server-4.5.0.jar所在的⽬录层级打开cmd,并且输⼊命令启动grid:
                

⽂件名(selenium-server-<version>.jar)尽可能的⽤tab⾃动补全,
防⽌⼿动输⼊有误
示例:
java -jar selenium-server-4.5.0.jar standalone
注:启动服务之后,切记不要关闭cmd窗⼝,否则服务就会被终⽌,
⽆法访问

启动之后,⽤google浏览器打开: http://127.0.0.1:4444,出现如下⻚⾯及成功
                

 将执⾏⽤例的机器添加到监控端,在代码中进⾏如下配置

                

import allure
import pytest
from selenium import webdriver


@pytest.fixture()
def browser():
    global driver
    # 01 用例的前置步骤,初始化浏览器对象
    chrome_options = webdriver.ChromeOptions()
    driver = webdriver.Remote(
        command_executor="http://127.0.0.1:4444",
        options=chrome_options
    )

    # 02 用例执行,返回driver
    yield driver

    # 03 用例的后置步骤,关闭浏览器
    driver.quit()


@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport():
    # 获取测试用例的执行结果,yield,返回给out对象,然后再去转化为result对象
    out = yield

    """
        从result对象out获取调用结果的测试报告,返回一个report对象
        
        report对象的属性:
        包括when(setup,call,teardown等三个值)、nodeid(测试用例的名称)、
        outcome(用例的执行结果, passed, failed)
    """
    report = out.get_result()  # 返回一个report对象

    # 仅仅获取用例call阶段的执行结果,不包含setup、teardown
    if report.when == "call":
        # 获取用例call执行结果为失败的情况
        xfail = hasattr(report, "wasxfail")  # hasattr方法会:返回对象是否具有给定名称的属性

        # 如果测试用例被跳过且标记为预期失败,或者测试用例执行失败且不是预期失败
        if (report.skipped and xfail) or (report.failed and not xfail):
            # 添加allure报告截图
            with allure.step("添加失败的截图 ---> "):
                allure.attach(driver.get_screenshot_as_png(), "失败的截图",
                              allure.attachment_type.PNG)

        elif report.passed:
            # 如果测试用例执行通过,添加allure报告截图
            with allure.step("添加成功的截图 ---> "):
                allure.attach(driver.get_screenshot_as_png(), "成功的截图",
                              allure.attachment_type.PNG)

Grid模式详解

        1.Standalone(独⽴模式)

                Standalone将所有Grid组件⽆缝地组合为⼀个。以独⽴模式运⾏Grid可以在单个进程中                 使⽤单个命令获得功能完整的Grid。单机只能在⼀台机器上运⾏

                Standalone也是运转Selenium Grid最简单的模式。默认情况下,服务器将监听                              http://localho st:4444上的RemoteWebDriver请求。默认情况下,服务器将从System                      PATH(环境变量)中检测可⽤的驱动程序

        2.Hub and Node (中⼼和节点模式)

                中⼼和节点是使⽤最多的模式,因为它允许:
                将不同的机器组合在⼀个Grid中

                例如,使⽤不同操作系统和/或浏览器版本的机器

                使⽤统⼀⼊⼝点来在不同的环境中运⾏WebDriver测试在不破坏Grid的情况下,增加或                   减少组件

           3.Hub(主控制节点)

                Hub 是 Selenium Grid 的中⼼控制节点,负责管理和分发测试请求。

              Hub 接收来⾃测试脚本的请求,然后将这些请求分发给连接到 Grid 的各个 Node 上执                   ⾏。

                功能:
        4.Node(执⾏测试的节点)

                Node 是 Selenium Grid 中的⼯作节点,负责实际执⾏测试⽤例。

                 ⼀个 Grid 中可以有多个 Node,每个 Node 都可以运⾏在不同的机器上,甚⾄可以具有                 不同的操作系统和浏览器组合。

                同⼀机器上的多个节点
                 设置不同的端⼝
                

java -jar selenium-server-4.5.0.jar node --port 6666

               

运⾏的main.py⽂件采⽤多线程的运⾏⽅式
        

import pytest
if __name__ == '__main__':
pytest.main(['-vs', '-n', '3'])

什么时候应该使⽤Grid

        多浏览器和多平台测试
     1.   当你需要在不同的浏览器类型、版本和操作系统上同时运⾏测试时,Selenium

        Grid 是⼀个理想的选择。它允许在多个节点上并⾏运⾏测试,每个节点可以代表不同的浏览          器和操作系统组合

        2.减少测试执⾏时间

            对于⼤型测试套件,Selenium Grid 可以显著减少测试执⾏时间。通过并⾏执⾏测试,你可以在相同的时间内完成更多的测试任务,提⾼测试效率

        3.提⾼测试覆盖率
        通过在不同浏览器和平台上并⾏运⾏测试,你可以更全⾯地测试应⽤程序,确保其在各种环境下的稳定性和⼀致性
        4.快速反馈
        缩短测试套件执⾏的时间,可以更快地获得测试结果。这对于在持续集成和持续交付环境中迅速反馈开发⼈员和团队⾮常重要
        5. 资源最⼤化
        利⽤多台计算机(节点)上的浏览器实例,充分利⽤可⽤资源,提⾼测试并⾏性,避免资源浪费
        6. ⾃动化平台兼容性测试
                当你需要测试应⽤程序在不同浏览器和平台上的兼容性时,Selenium Grid 是⼀个强⼤的⼯具。它使你能够同时在多个环境中验证应⽤程序的性能和功能
 

服务Grid的组件(了解)        

    主要包括路由器(Router)、分发器(Distributor)、会话映射(Session Map)、新会               话队列(New Session Queue)、节点(Node)和事件总线(Event Bus)

        

封装日志

               我们新建一个pytest.ini的文件

                

[pytest]
log_cli = true
log_cli_level = INFO
log_cli_fromat = %(asctimes)s [%(levelname)s] %(message)s
log_cli_date_fromat = %Y-%m-%d %H:%M:%S
log_file = pytest.log

各个名词的解释

        

[pytest]
; 这个里面的变量名都是固定的,不能随意修改
; 启用在命令行界面(CLI)上输出日志。
log_cli = true

; 设置输出日志级别
log_cli_level = INFO

; 指定命令行页面(CLI)上日志输出的格式
; 日志记录的时间(年月日时分秒,代码格式: %Y-%m-%d %H:%M:%S)
; 日志级别
; 日志消息
log_cli_fromat = %(asctimes)s [%(levelname)s] %(message)s

; 设置时间格式
log_cli_date_fromat = %Y-%m-%d %H:%M:%S

; 设置日志保存文件
log_file = pytest.log

应用到conftest中

        

import logging

import allure
import pytest
from selenium import webdriver


@pytest.fixture()
def browser():
    global driver
    # 01 用例的前置步骤,初始化浏览器对象
    driver = webdriver.Chrome()

    # 02 用例执行,返回driver
    yield driver

    # 03 用例的后置步骤,关闭浏览器
    driver.quit()


@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_makereport(item, call):
    # 获取测试用例的执行结果,yield,返回给out对象,然后再去转化为result对象
    out = yield

    """
        从result对象out获取调用结果的测试报告,返回一个report对象
        
        report对象的属性:
        包括when(setup,call,teardown等三个值)、nodeid(测试用例的名称)、
        outcome(用例的执行结果, passed, failed)
    """
    report = out.get_result()  # 返回一个report对象

    # 仅仅获取用例call阶段的执行结果,不包含setup、teardown
    if report.when == "call":
        # 修改之前的版本:
        # logging.info("--------->日志的头部<---------")
        # logging.info(f"用例ID:{report.nodeid}")
        # logging.info(f"测试结果:{report.outcome}")
        # logging.info(f"故障标识:{report.longrepr}")
        # logging.info(f"异常信息:{call.excinfo}")
        # logging.info(f"用例耗时:{report.duration}")
        # logging.info("--------->日志的尾部<---------")

        # 修改之后的版本:
        allure.attach("--------->日志的头部<---------")
        allure.attach(f"用例ID:{report.nodeid}", name="用例ID")
        allure.attach(f"测试结果:{report.outcome}", name="测试结果")
        allure.attach(f"故障标识:{report.longrepr}", name="故障标识")
        allure.attach(f"异常信息:{call.excinfo}", name="异常信息")
        allure.attach(f"用例耗时:{report.duration}", name="用例耗时")
        allure.attach("--------->日志的尾部<---------")

        # 获取用例call执行结果为失败的情况
        xfail = hasattr(report, "wasxfail")  # hasattr方法会:返回对象是否具有给定名称的属性

        # 如果测试用例被跳过且标记为预期失败,或者测试用例执行失败且不是预期失败
        if (report.skipped and xfail) or (report.failed and not xfail):
            # 添加allure报告截图
            with allure.step("添加失败的截图 ---> "):
                allure.attach(driver.get_screenshot_as_png(), "失败的截图",
                              allure.attachment_type.PNG)

        elif report.passed:
            # 如果测试用例执行通过,添加allure报告截图
            with allure.step("添加成功的截图 ---> "):
                allure.attach(driver.get_screenshot_as_png(), "成功的截图",
                              allure.attachment_type.PNG)


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/647687.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

详细分析Element Plus中的ElMessageBox弹窗用法(附Demo及模版)

目录 前言1. 基本知识2. Demo3. 实战4. 模版 前言 由于需要在登录时&#xff0c;附上一些用户说明书的弹窗 对于ElMessageBox的基本知识详细了解 可通过官网了解基本的语法知识ElMessageBox官网基本知识 1. 基本知识 Element Plus 是一个基于 Vue 3 的组件库&#xff0c;其中…

初识C语言——第二十四天

函数的基本使用和递归 1.函数是什么 2.库函数 3.自定义函数 4.函数参数 5.函数调用 6.函数的嵌套调用和链式访问 7.函数的声明和定义 函数是什么 C语言中函数的分类 1.库函数 2.自定义函数 库函数&#xff1a; 简单的总结,C语言常用的库函数都有&#xff1a; #includ…

QT之常用控件

一个图形化界面当然需要有各种各样的控件&#xff0c;QT也不例外&#xff0c;在QT designer中就有提供各种各样的控件&#xff0c;用以开发图形化界面。 而想使用好一个QT控件&#xff0c;就需要了解这些控件。 QWidget 在QT中&#xff0c;所有控件都继承自 QWidget 类&…

Docker学习(4):部署web项目

一、部署vue项目 在home目录下创建项目目录 将打包好的vue项目放入该目录下&#xff0c;dist是打包好的vue项目 在项目目录下&#xff0c;编辑default.conf 内容如下&#xff1a; server {listen 80;server_name localhost; # 修改为docker服务宿主机的iplocation / {r…

24法考证件照要求|不合格原因汇总!

6月法考报名&#xff0c;大家一定要提前熟悉下电子证件照片要求‼️ ⚠️证件照注意事项 ▪️不得上传全身照、风景照、生活照、背带(吊带)衫照、艺术照、侧面照、不规则手机照等。 ▪️本人近三个月内彩色(红、蓝、白底色均可)正面免冠电子证件照片&#xff0c;照片必须清晰完…

人工智能为犯罪地下世界带来了巨大的生产力提升

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

MySQL--执行计划

一、执行计划 1.介绍 执行计划是sql在执行时&#xff0c;优化器优化后&#xff0c;选择的cost最低的方案 通过desc、explain可以查看sql的执行计划 2.如何查看执行计划 table语句操作的表&#xff0c;在多表时才有意义type查找类型possible_keys可能会用到的索引key最终选择的…

python ofd转pdf及图片

本文部分内容参考&#xff0c;如有侵权请联系删除&#xff1a;使用 easyofd 解析ofd 文件_python模块easyofd如何使用-CSDN博客 背景需求&#xff1a;需要将邮箱中得ofd格式发票提取出来转换成pdf或者图片。 在网上搜了发现使用pyofd包&#xff0c;安装之后使用各种问题&…

VXLAN小结

1.VXLAN:(组件虚拟网络的架构核心)虚拟扩展本地局域网&#xff0c;通过隧道的形式&#xff0c;将物理上有隔离的资源&#xff0c;在逻辑上连通起来&#xff0c;使其二层互通。 a.物理网络:指的是构成 VXLAN 连接的基础 IP 网络 b.逻辑网络:指的是通过 VXLAN 构建的虚拟网络 C.N…

腾讯Java社招面试题真题,最新面试题

Java中synchronized和ReentrantLock有什么区别&#xff1f; 1、锁的实现方式不同&#xff1a; synchronized是JVM层面的锁&#xff0c;主要依赖于监视器对象&#xff08;monitor&#xff09;实现。ReentrantLock是JDK层面的锁&#xff0c;通过Java代码实现&#xff0c;提供了更…

docker 上面安装 Nginx 以及设置访问 IP 就可以访问前端工程

docker 运行 Nginx 第一步&#xff1a;搜索下镜像 首先可以使用 docker search nginx 搜索 nginx 服务 docker search nginx相关控制台输出&#xff1a; NAME DESCRIPTION STARS OFFICIAL…

[OC]深拷贝与浅拷贝

深拷贝与浅拷贝 深拷贝与浅拷贝 深拷贝与浅拷贝定义按照类型说明非容器类对象的深拷贝与浅拷贝不可变字符串可变类型字符串 容器类对象的深浅拷贝自定义类对象的深浅拷贝容器类对象的完全深拷贝1.copyItems2.解档和归档 定义 深拷贝&#xff1a;简单来说就是创建一个与被复制对…

虚拟化技术[2]之存储虚拟化

存储虚拟化 存储虚拟化简介存储虚拟化一般模型存储虚拟化实现方式基于主机存储虚拟化基于存储设备存储虚拟化基于网络存储虚拟化 案例分析&#xff1a;VMFSVMFS功能 存储虚拟化简介 存储虚拟化&#xff1a;将存储网络中的各个分散且异构的存储设备按照一定的策略映射成一个统一…

webpack5生产模式

生产模式 生产模式准备 开发模式和生产模式有不同的 配置文件 2修改webpack.prod.js文件修改webpack.dev.js文件 修改webpack.dev.js文件 1》修改输出路径为undefined 2》将绝对路径进行修改&#xff0c;进行回退 此时文件的执行命令为 修改webpack.prod.js文件 1》修改绝…

LangChain笔记

很好的LLM知识博客&#xff1a; https://lilianweng.github.io/posts/2023-06-23-agent/ LangChain的prompt hub: https://smith.langchain.com/hub 一. Q&A 1. Q&A os.environ["OPENAI_API_KEY"] “OpenAI的KEY” # 把openai-key放到环境变量里&…

【Linux】Linux的基本指令_2

文章目录 二、基本指令8. man9. nano 和 cat10. cp11. mv12. echo 和 > 和 >> 和 <13. more 和 less14. head 和 tail 和 | 未完待续 二、基本指令 8. man Linux的命令有很多参数&#xff0c;我们不可能全记住&#xff0c;我们可以通过查看联机手册获取帮助。访问…

深入编程逻辑:从分支到循环的奥秘

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、编程逻辑的基石&#xff1a;分支与循环 分支逻辑详解 代码案例&#xff1a;判断整数是…

Unity 资源 之 限时免费的Lowpoly农场动物,等你来领!

Unity资源 之 Lowpoly farm animals 农村动物 前言资源包内容领取兑换码 前言 Unity 资源商店为大家带来了一份特别的惊喜——限时免费的农场动物资源&#xff01;这是一个充满趣味和实用性的资源包。 资源包内容 在这个资源包中&#xff0c;你可以找到丰富多样的低地养殖动物…

685. 冗余连接 II

685. 冗余连接 II 问题描述 在本问题中&#xff0c;有根树指满足以下条件的 有向 图。该树只有一个根节点&#xff0c;所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点&#xff0c;而根节点没有父节点。 输入一个有向图&#xff0c;该…

mac 安装Node.js

文章目录 前言一、Node是什么&#xff1f;二、下载三、安装四、验证总结 前言 Node.js是一个开源、跨平台的JavaScript运行时环境&#xff0c;它允许开发者在服务器端运行JavaScript代码。Node.js是基于Chrome V8 JavaScript引擎构建的&#xff0c;它的设计目标是提供一种高效…