当前位置: 首页 > article >正文

43. 远程分布式测试实现

43. 远程分布式测试实现详解

一、远程测试环境配置

1.1 远程WebDriver服务定义

# Chrome浏览器远程服务地址
chrome_url = r'http://localhost:5143'# Edge浏览器远程服务地址
edge_url = r'http://localhost:9438'
  • 关键概念:每个URL对应一个独立的WebDriver服务
  • 典型配置
    • localhost:本地服务
    • 192.168.1.100:4444:局域网内其他机器
    • cloud-test.com:443:云端测试平台

1.2 浏览器能力配置

# 从caps_setting导入预定义配置
from chap9.caps_setting import *# Chrome配置示例
CHROME_CAPS_1 = {'browserName': 'chrome','goog:chromeOptions': {'args': ['--headless', '--disable-gpu']}
}CHROME_CAPS_2 = {'browserName': 'chrome','goog:chromeOptions': {'args': ['--window-size=1920,1080']}
}# Edge配置示例
EDGE_CAPS_1 = {'browserName': 'MicrosoftEdge','ms:edgeOptions': {'args': ['--inprivate']}
}

二、测试套件定义

2.1 函数式测试套件

test_suit_func = [# 任务组1:在Chrome服务1上执行登录测试([test_login], chrome_url, CHROME_CAPS_1),# 任务组2:在Chrome服务2上执行搜索测试([test_search], chrome_url, CHROME_CAPS_2),# 任务组3:在Edge服务上执行搜索测试([test_search], edge_url, EDGE_CAPS_1)
]
  • 结构说明(测试函数列表, WebDriver URL, 浏览器配置)
  • 特点
    • 不同任务组可指向不同服务节点
    • 支持相同服务不同配置

2.2 面向对象测试套件

test_suit_cls = [# 任务组1:在Chrome服务1上执行登录测试类([AsyncTestLogin], chrome_url, CHROME_CAPS_1),# 任务组2:在Chrome服务1上再次执行登录测试类([AsyncTestLogin], chrome_url, CHROME_CAPS_1),# 任务组3:在Chrome服务2上执行主功能测试类([AsyncTestMain], chrome_url, CHROME_CAPS_2),# 任务组4:在Edge服务上执行主功能测试类([AsyncTestMain], edge_url, EDGE_CAPS_1)
]
  • 注意事项:同一测试类可在不同节点重复执行
  • 适用场景:复杂业务流测试

三、测试执行入口

3.1 函数式测试执行

main_func(test_suit_func)
  • 功能:执行函数式测试套件
  • 内部流程
    1. 为每个任务组创建异步任务
    2. 连接对应WebDriver服务
    3. 应用浏览器配置
    4. 顺序执行组内测试函数
    5. 关闭浏览器连接

3.2 面向对象测试执行

# main_cls(test_suit_cls)  # 本例中注释掉
  • 执行方式:取消注释即可运行
  • 特点
    • 自动检测并执行测试类中的test_*方法
    • 支持在不同节点执行相同测试类

四、分布式执行流程

4.1 测试任务分发

主控制机├── 任务组1 → Chrome服务1 (localhost:5143)├── 任务组2 → Chrome服务2 (localhost:5143) 不同配置└── 任务组3 → Edge服务 (localhost:9438)

4.2 实际执行时序

时间 | 任务组1 (Chrome服务1)       | 任务组2 (Chrome服务2)       | 任务组3 (Edge服务)
-----|---------------------------|---------------------------|-------------------0s  | 启动浏览器(headless)        | 启动浏览器(全屏)            | 启动浏览器(隐私模式)1s  | 执行test_login()           | 执行test_search()          | 执行test_search()3s  | 验证登录成功                | 验证搜索结果               | 验证搜索错误提示5s  | 关闭浏览器                  | 关闭浏览器                 | 关闭浏览器

五、远程节点配置示例

5.1 启动Chrome节点服务

# 在机器1 (IP:192.168.1.101) 上启动
chromedriver --port=5143# 在机器2 (IP:192.168.1.102) 上启动
chromedriver --port=5143

5.2 启动Edge节点服务

# 在机器3 (IP:192.168.1.103) 上启动
msedgedriver --port=9438

5.3 测试套件配置

chrome_url1 = r'http://192.168.1.101:5143'
chrome_url2 = r'http://192.168.1.102:5143'
edge_url = r'http://192.168.1.103:9438'test_suit_func = [([test_login], chrome_url1, CHROME_CAPS),([test_search], chrome_url2, CHROME_CAPS),([test_search], edge_url, EDGE_CAPS)
]

六、执行效果分析

6.1 资源使用情况

任务组服务地址浏览器类型内存占用CPU使用
组1localhost:5143Chrome320MB12%
组2localhost:5143Chrome350MB15%
组3localhost:9438Edge380MB14%

6.2 时间效率对比

执行方式任务数串行耗时并行耗时效率提升
函数测试345秒20秒125%

七、完整代码

from chap9.async_test_func import test_search, test_login
from chap9.async_test_cls import AsyncTestMain, AsyncTestLogin
from chap9.async_main import main_cls, main_func
from chap9.caps_setting import *chrome_url = r'http://localhost:5143'
edge_url = r'http://localhost:9438'test_suit_func = [([test_login, ], chrome_url, CHROME_CAPS_1),([test_search, ], chrome_url, CHROME_CAPS_2),([test_search, ], edge_url, EDGE_CAPS_1)
]# 注意:测试类在整个代码运行过程中,测试类只会被创建一次,它在内存有唯一的地址
test_suit_cls = [([AsyncTestLogin, ], chrome_url, CHROME_CAPS_1),([AsyncTestLogin, ], chrome_url, CHROME_CAPS_1),([AsyncTestMain, ], chrome_url, CHROME_CAPS_2),([AsyncTestMain, ], edge_url, EDGE_CAPS_1)
]main_func(test_suit_func)
# main_cls(test_suit_cls)

这种分布式测试架构通过将测试任务分发到不同服务节点,显著提高了测试执行效率,特别适合大型项目的快速验证需求。


「小贴士」:点击头像→【关注】按钮,获取更多软件测试的晋升认知不迷路! 🚀

相关文章:

43. 远程分布式测试实现

43. 远程分布式测试实现详解 一、远程测试环境配置 1.1 远程WebDriver服务定义 # Chrome浏览器远程服务地址 chrome_url rhttp://localhost:5143# Edge浏览器远程服务地址 edge_url rhttp://localhost:9438关键概念:每个URL对应一个独立的WebDriver服务典型配置…...

探索大语言模型(LLM):RSE流程详解——从文档中精准识别高相关片段

前言 在信息爆炸的时代,如何从海量的文本数据中快速准确地提取出有价值的信息,成为了众多领域面临的共同挑战。RSE(检索增强摘要生成)流程应运而生,它通过一系列精细化的步骤,能够有效地从原始文档中识别出…...

【C++】类的构造函数

类的构造函数 1. 作用:2.语法规则:示例代码:构造函数语法 2.1 特点:示例代码:自定义了构造函数,系统不会再生成默认构造函数示例代码:构造函数重载 3.构造函数常见的写法3.1 无参构造函数3.2 带…...

【ISP算法精粹】动手实战:用 Python 实现 Bayer 图像的黑电平校正

在数字成像领域,图像信号处理器(ISP)如同幕后英雄,默默将传感器捕获的原始数据转化为精美的图像。而黑电平校正,作为ISP预处理流程中的关键一环,直接影响着最终图像的质量。今天,我们就通过Pyth…...

分布式存储技术全景解析:从架构演进到场景实践

目录 技术演进与市场新格局核心架构设计深度剖析前沿技术创新与性能突破行业应用场景实践挑战与未来发展趋势1. 技术演进与市场新格局 1.1 从集中式到分布式的范式转移 传统集中式存储(如NAS/SAN)在扩展性和容错性方面面临根本性瓶颈,而分布式存储通过水平扩展架构和多节点…...

JVM——从JIT到AOT:JVM编译器的云原生演进之路

引入 在Java的世界里,一段代码从开发者手中的文本到计算机执行的机器指令,需要跨越"字节码"这座桥梁。而JVM编译器正是架起这座桥梁的工程师,它的每一次技术演进都推动着Java性能的跃迁。从早期逐行翻译的解释器,到智能…...

Linux中的mysql逻辑备份与恢复

一、安装mysql社区服务 二、数据库的介绍 三、备份类型和备份工具 一、安装mysql社区服务 这是小编自己写的,没有安装的去看看 Linux换源以及yum安装nginx和mysql-CSDN博客 二、数据库的介绍 2.1 数据库的组成 数据库是一堆物理文件的集合,主要包括…...

[HTML5]快速掌握canvas

背景 canvas 是 html5 标准中提供的一个标签, 顾名思义是定义在浏览器上的画布 通过其强大的绘图接口,我们可以实现各种各样的图形,炫酷的动画,甚至可以利用他开发小游戏,包括市面上很流行的数据可视化框架底层都用到了Canvas。…...

Gartner《Emerging Patterns for Building LLM-Based AIAgents》学习心得

一、AI代理概述 2024年,AI代理成为市场热点,它们能自主规划和行动以实现用户目标,与仅能感知、决策、行动和达成目标的AI助手及聊天机器人有本质区别。Gartner定义的AI代理是使用AI技术在数字或物理环境中自主或半自主运行的软件实体。 二、LLM基础AI代理的特性和挑战 优势…...

Hive SQL优化实践:提升大数据处理效率的关键策略

在大数据生态中,Hive作为基于Hadoop的数据仓库工具,广泛应用于海量数据的离线分析场景。然而,随着数据量的指数级增长和业务复杂度的提升,低效的Hive SQL可能导致资源浪费和查询性能瓶颈。本文将从存储优化、计算优化、资源配置三…...

vue中父子参数传递双向的方式不同

在面试中被问到。平时也有用到,但是缺少总结 父传子。父页面会给子页面中定义的props属性传参,子页面接收子传父。父页面需要监听事件来接收子页面通过$emit发送的消息其实说的以上两种都是组件之间传递。还可以通过路由传参, 状态管理器的方式传递 下面…...

LLM 使用 MCP 协议及其原理详解

LLM 使用 MCP 协议及其原理详解 🧠 一、MCP 协议概述 1. MCP 是什么? MCP(Modular Communication Protocol)是一种面向语言模型设计的通用通信协议,其设计目标是: 模块化(Modular&#xff0…...

DAY 36神经网络加速器easy

仔细回顾一下神经网络到目前的内容,没跟上进度的同学补一下进度。 ●作业:对之前的信贷项目,利用神经网络训练下,尝试用到目前的知识点让代码更加规范和美观。 ●探索性作业(随意完成):尝试进入…...

STM32 单片机启动过程全解析:从上电到主函数的旅程

一、为什么要理解启动过程? STM32 的启动过程就像一台精密仪器的开机自检,它确保所有系统部件按既定方式初始化,才能顺利运行我们的应用代码。对初学者而言,理解启动过程能帮助解决常见“程序跑飞”“不进 main”“下载后无反应”…...

4.RV1126-OPENCV 图像轮廓识别

一.图像识别API 1.图像识别作用 它常用于视觉任务、目标检测、图像分割等等。在 OPENCV 中通常使用 Canny 函数、findContours 函数、drawContours 函数结合在一起去做轮廓的形检测。 2.常用的API findContours 函数:用于寻找图片的轮廓,并把所有的数…...

WEB3——开发者怎么查看自己的合约日志记录

在区块链中查看合约的日志信息(也叫事件 logs),主要有以下几种方式,具体方法依赖于你使用的区块链平台(如 Ethereum、BSC、Polygon 等)和工具(如 Etherscan、web3.js、ethers.js、Hardhat 等&am…...

TDengine 集群容错与灾备

简介 为了防止数据丢失、误删操作,TDengine 提供全面的数据备份、恢复、容错、异地数据实时同步等功能,以保证数据存储的安全。本节简要说明 TDengine 中的容错与灾备。 容错 TDengine 支持 WAL 机制,实现数据的容错能力,保证数…...

MG影视登录解锁永久VIP会员 v8.0 支持手机电视TV版影视直播软件

MG影视登录解锁永久VIP会员 v8.0 支持手机电视TV版影视直播软件 MG影视App电视版是一款资源丰富、免费便捷、且专为大屏优化的影视聚合应用,聚合海量资源,畅享电视直播,是您电视盒子和…...

如何成为一名优秀的产品经理(自动驾驶)

一、 夯实核心基础 深入理解智能驾驶技术栈: 感知: 摄像头、雷达(毫米波、激光雷达)、超声波传感器的工作原理、优缺点、融合策略。了解目标检测、跟踪、SLAM等基础算法概念。 定位: GNSS、IMU、高精地图、轮速计等定…...

BAT脚本编写详细教程

目录 第一部分:BAT脚本简介第二部分:创建和运行BAT脚本第三部分:基本命令和语法第四部分:变量使用第五部分:流程控制第六部分:函数和子程序第七部分:高级技巧第八部分:实用示例第一部分:BAT脚本简介 BAT脚本(批处理脚本)是Windows操作系统中的一种脚本文件,扩展名…...

快速了解 GO之接口解耦

更多个人笔记见: (注意点击“继续”,而不是“发现新项目”) github个人笔记仓库 https://github.com/ZHLOVEYY/IT_note gitee 个人笔记仓库 https://gitee.com/harryhack/it_note 个人学习,学习过程中还会不断补充&…...

【多线程初阶】内存可见性问题 volatile

文章目录 再谈线程安全问题内存可见性问题可见性问题案例编译器优化 volatileJava内存模型(JMM) 再谈线程安全问题 如果多线程环境下代码运行的结果是符合我们预期的,即在单线程环境应该有的结果,则说这个程序是线程安全的,反之,多线程环境中,并发执行后,产生bug就是线程不安全…...

C++ 类模板三参数深度解析:从链表迭代器看类型推导与实例化(为什么迭代器类模版使用三参数?实例化又会是怎样?)

本篇主要续上一篇的list模拟实现遇到的问题详细讲解&#xff1a;<传送门> 一、引言&#xff1a;模板参数的 "三角锁钥" 在 C 双向链表实现中&#xff0c;__list_iterator类模板的三个参数&#xff08;T、Ref、Ptr&#xff09;如同精密仪器的调节旋钮&#x…...

MySQL强化关键_018_MySQL 优化手段及性能分析工具

目 录 一、优化手段 二、SQL 性能分析工具 1.查看数据库整体情况 &#xff08;1&#xff09;语法格式 &#xff08;2&#xff09;说明 2.慢查询日志 &#xff08;1&#xff09;说明 &#xff08;2&#xff09;开启慢查询日志功能 &#xff08;3&#xff09;实例 3.s…...

ASP.NET MVC添加模型示例

ASP.NET MVC高效构建Web应用ASP.NET MVC 我们总在谈“模型”&#xff0c;那到底什么是模型&#xff1f;简单说来&#xff0c;模型就是当我们使用软件去解决真实世界中各种实际问题的时候&#xff0c;对那些我们关心的实际事物的抽象和简化。比如&#xff0c;我们在软件系统中设…...

【Part 3 Unity VR眼镜端播放器开发与优化】第二节|VR眼镜端的开发适配与交互设计

文章目录 《VR 360全景视频开发》专栏Part 3&#xff5c;Unity VR眼镜端播放器开发与优化第一节&#xff5c;基于Unity的360全景视频播放实现方案第二节&#xff5c;VR眼镜端的开发适配与交互设计一、Unity XR开发环境与设备适配1.1 启用XR Plugin Management1.2 配置OpenXR与平…...

第1天:认识RNN及RNN初步实验(预测下一个数字)

RNN&#xff08;循环神经网络&#xff09; 是一种专门设计用来处理序列数据的人工神经网络。它的核心思想是能够“记住”之前处理过的信息&#xff0c;并将其用于当前的计算&#xff0c;这使得它非常适合处理具有时间顺序或上下文依赖关系的数据。 核心概念&#xff1a;循环连…...

全文索引详解及适用场景分析

全文索引详解及适用场景分析 1. 全文索引基本概念 1.1 定义与核心原理 全文索引(Full-Text Index)是一种特殊的数据库索引类型,专门设计用于高效处理文本数据的搜索需求。与传统的B树索引不同,全文索引不是基于精确匹配,而是通过建立倒排索引(Inverted Index)结构来实现对…...

利用DeepSeek编写能在DuckDB中读PostgreSQL表的表函数

前文实现了UDF和UDAF&#xff0c;还有一类函数是表函数&#xff0c;它放在From 子句中&#xff0c;返回一个集合。DuckDB中已有PostgreSQL插件&#xff0c;但我们可以用pqxx库实现一个简易的只读read_pg()表函数。 提示词如下&#xff1a; 请将libpqxx库集成到我们的程序&#…...

树莓派安装openwrt搭建软路由(ImmortalWrt固件方案)

&#x1f923;&#x1f449;我这里准备了两个版本的openwrt安装方案给大家参考使用&#xff0c;分别是原版的OpenWrt固件以及在原版基础上进行改进的ImmortalWrt固件。推荐使用ImmortalWrt固件&#xff0c;当然如果想直接在原版上进行开发也可以&#xff0c;看个人选择。 &…...