多线程、分布式运行用例

python多线程

threading模块

多线程实例

python 复制代码
# -*- coding: utf-8 -*-
# @Time    : 2024/2/7 15:50
# @Author  : 居里夫人吃橘子
# @File    : class01.py
# @Software: PyCharm
import threading
from time import sleep


def run(name):
    print(name + '该起床了')
    sleep(2)
    print(name + '该吃饭了')
    sleep(2)
    print(name + '该睡觉了')


th = []

# threading.Thread()创建线程,target代表要运行的方法,args代表方法中需要传参的值
th.append(threading.Thread(target=run, args=['小王']))
th.append(threading.Thread(target=run, args=['小李']))
th.append(threading.Thread(target=run, args=['小张']))

for t in th:
    # 使用start()启动线程
    t.start()

输出:

多线程跑unittest框架中的用例:基于一个原则先将需要处理的内容保存在list中,基于list的元素来进行线程的添加,在unittest中可以通过discover = unittest.defaultTestLoader.discover(start_dir=path, pattern='test*.py')发现所有的测试套件,然后使用unittest.TextTestRunner().run(suite)运行器或者BeautifulReport的运行器进行用例执行,然后为运行器添加多线程:

python 复制代码
# -*- coding: utf-8 -*-
# @Time    : 2024/2/7 16:48
# @Author  : 居里夫人吃橘子
# @File    : suite_test.py
# @Software: PyCharm
import threading
import time
import unittest

from BeautifulReport import BeautifulReport


def get_suite():
    path = './'
    discover = unittest.defaultTestLoader.discover(start_dir=path, pattern='test*.py')
    return discover


def runner(suite):
    unittest.TextTestRunner().run(suite)


def beautiful_runner(suite):
    # 约定时间戳的格式,注意在Windows中文件的路径不能存在 < > : " / \ | ? *
    strf_time_str = time.strftime("%Y-%m-%d %H-%M-%S")
    file_name = f'测试报告_{strf_time_str}'
    # 测试报告存放路径
    paths = r'D:\PythonTest\Study\selenium_class03'
    result = BeautifulReport(suite)
    result.report(filename=file_name, description='测试报告', log_path=paths)


if __name__ == '__main__':
    suites = get_suite()
    th = []

    for suite in suites:
        print(suite)
        # 使用runner执行多线程
        th.append(threading.Thread(target=runner, args=[suite]))
        # 使用beautiful_runner执行多线程
        # th.append(threading.Thread(target=beautiful_runner, args=[suite]))

    for t in th:
        # 启动多线程
        t.start()
        # 可以防止多线程对一个文件进行同时的读写;
        # t.join()

输出:

Selenium Grid 4

专用于做Selenium分布式部署的模块。最初都是基于简单的主从节点的模式来进行分布式部署的。

环境部署:

  • 需要安装jdk环境;
  • 下载Selenium Server (Grid),下载官网:Selenium Server

启动模式:

  • 单体模式:standalone

注:单体模式下无法添加任何node子节点;

在jar包的路径命令窗中执行java -jar .\selenium-server-4.17.0.jar standalone

访问http://2.0.0.1:4444查看管理页面

代码:

python 复制代码
'''
    访问selenium grid体系
'''

from time import sleep
from selenium import webdriver

# 配置浏览器
options = webdriver.ChromeOptions()
# 需要传入options浏览器配置参数,不然启动不了,目前还不知道为啥
driver = webdriver.Remote(command_executor='http://2.0.0.1:4444', options=options)
driver.get('http://www.baidu.com')
sleep(5)
# driver.quit()
  • 分布式启动:

在主节点下:输入java -jar .\selenium-server-4.17.0.jar hub部署主节点,这只是启动主节点的命令,启动完成后需要再添加node子节点;

添加子节点:在子节点电脑中输入java -jar .\selenium-server-4.17.0.jar node --hub http://192.168.2.107:4444

注:

  • 子节点中需要有java环境,且需要安装java11或更高版本
  • 需要安装浏览器以及对应的浏览器驱动程序driver
  • 在环境变量中的PATH需要声明driver的路径

总结:

  • java -jar .\selenium-server-4.17.0.jar hub #部署主节点
  • java -jar .\selenium-server-4.17.0.jar hub --config ./node_1.toml #部署主节点并以配置文件名为node_1.toml的配置启动
  • java -jar .\selenium-server-4.17.0.jar node --hub http://192.168.2.107:4444 #添加子节点 --hub表示连接的主节点url
相关推荐
芊言芊语1 分钟前
分布式缓存服务Redis版解析与配置方式
redis·分布式·缓存
月夜星辉雪4 小时前
【RabbitMQ 项目】服务端:路由交换模块
分布式·rabbitmq
super_journey4 小时前
RabbitMq中交换机(Exchange)、队列(Queue)和路由键(Routing Key)
分布式·中间件·rabbitmq
灰色孤星A5 小时前
分布式事务学习笔记(二)Seata架构、TC服务器部署、微服务集成Seata
分布式·微服务·架构·seata·分布式事务·tc服务器·微服务集成seata
MinIO官方账号7 小时前
从 HDFS 迁移到 MinIO 企业对象存储
人工智能·分布式·postgresql·架构·开源
丁总学Java7 小时前
maxwell 输出消息到 kafka
分布式·kafka·maxwell
喜欢猪猪9 小时前
深度解析ElasticSearch:构建高效搜索与分析的基石原创
分布式
蘑菇蘑菇不会开花~10 小时前
分布式Redis(14)哈希槽
redis·分布式·哈希算法
问道飞鱼11 小时前
分布式中间件-Pika一个高效的分布式缓存组件
分布式·缓存·中间件
小宋102113 小时前
玩转RabbitMQ声明队列交换机、消息转换器
服务器·分布式·rabbitmq