3.1 增加多进程执行playwright

news2024/10/8 14:18:42

增加了多进程的方式执行测试代码,对代码改动比较大

1、case

case目录依然是自动生成

 2、config

dir_collection.py新增了配置

mkdir_collections = [
    'case',
    'log',
    'img',
]
del_collections = [
    'results',
    'report'
]
del_regex = 'temp'

3、data/img/log/resource/video

data/img/log/resource目录没做修改,删除了video目录

4、results/report及以temp开头的目录是自动生成,且会每次运行前都会自动删除

5、utils目录

删除了delete.py

修改了dir_check.py

import os
from config.dir_collection import mkdir_collections, del_collections, del_regex
import shutil


def check_dir():
    mk_dir()
    del_files()


def mk_dir():
    li = os.listdir()
    for i in mkdir_collections:
        if i not in li:
            os.mkdir(i)


def del_files():
    li = os.listdir()
    for i in li:
        if i.startswith('temp'):
            shutil.rmtree(i)
        elif i in del_collections:
            shutil.rmtree(i)


 修改了video.py

import os
import time


def generate_video(source_path: str):
    p = f"{source_path}/{int(time.time())}.webm"
    while True:
        if os.listdir(source_path):
            for i in os.listdir(source_path):
                os.renames(f'{source_path}/{i}', p)
            break
    return p

 新增了process.py

import os
import time

import pytest
import multiprocessing


def pytest_run(a):
    f = ['-s', '--alluredir=results']
    for i in a:
        f.append(i)
    print(f)
    pytest.main(f)


def split_list(lst, n):
    """将列表 lst 按 n 等份分割"""
    if n > len(lst):
        raise Exception('The number of processes cannot be greater than the number of test files')
    k, m = divmod(len(lst), n)
    return [lst[i * k + min(i, m):(i + 1) * k + min(i + 1, m)] for i in range(n)]


def process(size: int, d: str):
    file_list = os.listdir(d)
    temp = []
    for i in file_list:
        file_path = d + '/' + i
        if os.path.isfile(file_path) and i.startswith('test'):
            temp.append(file_path)
    li = split_list(temp, size)
    pro = [multiprocessing.Process(target=pytest_run, args=(li[i],)) for i in range(size)]
    for p in pro:
        p.start()
    for p in pro:
        p.join()

6、conftest.py

修改了conftest.py

import time

import pytest
from playwright.sync_api import sync_playwright
from config.setting import config
from playwright.sync_api import Page
from utils.operate import operate
from utils.baseurl import get_baseUrl
import os
import allure
from utils.video import generate_video


def getName():
    pid = os.getpid()
    temp_file_name = f'temp{pid}'
    return temp_file_name


@pytest.fixture(scope='session')
def browser():
    browser = sync_playwright().start().chromium.launch(headless=False, slow_mo=500)
    return browser


@pytest.fixture(scope='session')
def page(browser):
    page = browser.new_page(ignore_https_errors=True, record_video_dir=getName())
    page.goto(get_baseUrl(config))
    operate(config['username'], page)
    operate(config['password'], page)
    operate(config['submit'], page)
    return page


def log(request):
    with open('log/http.txt', 'a', encoding='utf-8') as w:
        w.write(f'{request}.url' + '\n')


@pytest.fixture(scope='function', autouse=True)
def after(page: Page):
    yield
    page.on("request", lambda request: log(request))


@pytest.fixture(scope='session', autouse=True)
def clear(page: Page, browser):
    yield
    page.close()
    browser.close()
    p = generate_video(getName())
    allure.attach.file(p, f'{os.path.basename(p)}', attachment_type=allure.attachment_type.WEBM, extension='WEBM')

7、修改了main.py 

import os
import shutil
import time

from playwright.sync_api import sync_playwright
from config.setting import config
from utils.template import Template
from utils.md5 import Md5
import pytest
from utils.dir_check import check_dir
from utils.baseurl import get_baseUrl
from utils.process import process


def run():
    data = os.listdir('data')
    m = Md5('case', 'log', 'case_md5.json')
    n = Md5('utils', 'log', 'template_md5.json')
    filter_list = m.filter()
    utils_list = n.filter()
    if 'template.py' not in utils_list:
        filter_list = []
        n.write_md5()
    for i in data:
        file_path = 'data' + '/' + i
        if os.path.isfile(file_path):
            temp = 'test_' + i
            if temp not in filter_list:
                Template.create_test_file(file_path, 'case')
    m.write_md5()


if __name__ == "__main__":
    check_dir()
    get_baseUrl(config)
    run()
    process(2, 'case')
    os.system('allure generate  results -o ./report')
    for file_name in os.listdir('resource'):
        src_file = os.path.join('resource', file_name)
        dst_file = os.path.join('report', file_name)
        if os.path.exists(dst_file):
            os.remove(dst_file)
        shutil.copy(src_file, 'report')
    os.system('allure open report')

8、总结

最终修改后的效果,可以使用多进程的方式,开启多个浏览器实例,去对case目录下的测试文件分片执行,在测试文件特别多的情况下,是可以提高执行效率的。

其次,每个进程都有自己的视频及截图,进程之间互不干扰 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux内核4.14版本——drm框架分析(6)——实例注册drm device/ encoder/crtc/plane/connector等

目录 1. 简介 2. drm device的注册 3. fops 根据前面几篇文档的介绍,我们知道了drm的整体的构成,后面的文章我们从实际的一个例子中进行分析。 1. 简介 kernel版本:4.14 gpu:ARM Mali DP650 hdmi:dw hdmi 涉及的…

[已解决]无法在Windows 11中扩展C盘

如果你的台式电脑或笔记本电脑刚刚升级到Windows 11,如果你没有足够的硬盘空间来保存新文件和软件,那你可能会收到磁盘空间不足的警告。在这种情况下,你可能需要扩展分区来解决这个问题。 虽然Windows系统自带了“磁盘管理”工具&a…

10分钟了解Kubernetes网络

Kubernetes是现代容器化应用不可或缺的强大、可靠的基础平台。本文将介绍Kubernetes中与网络相关的组件,正是这些组件支撑Kubernetes成为云原生应用的首选基础设施。原文: Networking in Kubernetes 网络是Kubernetes中非常值得理解的重要主题,它帮助Kub…

【熬夜送书 | 第四期】python期末考试总结

文章目录 前言单选题程序填空题函数题编程题熬夜送书 第三期 前言 博主也是第一次接触到python语言,在考试前过了一遍python语法,因为有Java基础学习起来相对比较轻松,学校考的题相对简单一些,也是PTA上机考试,大概30…

字节测开岗面试记:二面被血虐,幸好还是拿到了Offer.....

在互联网做了几年之后,去大厂“镀镀金”是大部分人的首选。大厂不仅待遇高、福利好,更重要的是,它是对你专业能力的背书,大厂工作背景多少会给你的简历增加几分竞争力。 但说实话,想进大厂还真没那么容易。最近面试字…

让CSS布局呈现您的个性:学习常见布局方式

本文介绍常用的css布局&#xff1a; 三栏布局两列自适应布局元素居中 盒模型简介&#xff1a; 三栏布局 中间列自适应宽度&#xff0c;两边宽度固定 1. 圣杯布局 <!DOCTYPE html> <html> <head> <style> /* This is a single-line comment */.con…

迅为RK3588开发板-基于瑞芯微RK3588摄像头方案

硬件&#xff1a; RK3588开发板摄像头 MIPI摄像头&#xff1a; 1.1 硬件连接 RK3588 底板上有四个摄像头接口&#xff0c;如下图所示&#xff0c;此四个接口均可连接摄像头 ov5695 和 摄像头 ov13850。 摄像头模块连接硬件时要将模块对准插槽缺口处&#xff0c;J1 接口连接摄…

ipad手写笔哪款好?最好用的电容笔

近几年&#xff0c;电容笔逐渐成为人们日常生活中最重要的数码产品之一&#xff0c;不管是书写、绘画或者是玩游戏&#xff0c;使用iPad的地方就都能看到电容笔的身影。那么&#xff0c;哪个品牌的电容笔质量比较好&#xff1f;下面&#xff0c;我来给大家推荐四款好用的电容笔…

node+uniapp+socket简易聊天

目录 一、技术简介 1.1、客户端 1.2、服务器 二、代码分析 2.1、前端连接后端 2.2、前端发送&#xff0c;后端接收并广播回去 三、效果展示 四、升级版 一、技术简介 1.1、客户端 uni-app项目自行创建、weapp.socket.io这个需要后端下载cnpm i weapp.socket.io&…

1.2C++运算符重载

C运算符重载 C运算符重载是指对已有的C运算符进行重新定义&#xff0c;使其能够适用于用户自定义的数据类型。通过运算符重载&#xff0c;我们可以使用C运算符对自定义的数据类型进行操作&#xff0c;使得程序更加简洁、易读、易维护。 C支持对大部分运算符进行重载&#xff…

CleanMyMac X2023电脑深度清理软件

在使用mac时&#xff0c;小编遇到了运行内存不足、硬盘空间不足的情况。遇到这种情况&#xff0c;我们可以借助经典的电脑深度清理软件——CleanMyMac X&#xff0c;清理不常用的软件和系统垃圾&#xff01; 作为一款专业的mac电脑系统管家&#xff0c;CleanMymac X一直致力于…

韧性数据安全体系的原则和组成|CEO专栏

“韧性”数据安全体系&#xff0c;是美创科技在数据安全的最新探索。 特设专栏“构建适应性进化的韧性数据安全体系”中&#xff0c;首期文章&#xff08;点击此处跳转&#xff09;&#xff0c;我们重点介绍了韧性数据安全体系的三个目标&#xff1a;韧性和弹性、适应性进化、复…

【基于Rsync实现Linux To Windows文件同步】

基于Rsync实现Linux To Windows文件同步 简介安装步骤安装Linux服务器端1.安装rsync2.启动Rsync3.验证是否启动成功4.修改rsyncd.conf重启rsync服务 安装Windows客户端1.rsync客户端安装&#xff1a;2.配置环境变量3.测试rsync命令4.创建密码文件5.密码文件授权6.查看服务端需要…

【jupyter notebook】‘jupyter‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。

目录 0.问题背景环境介绍 1.解决步骤 2.测试步骤 0.问题背景环境介绍 1&#xff09;环境&#xff1a;windows64 2&#xff09;问题背景&#xff1a;在搭建jupyter notebook的过程中&#xff0c;想用windows的任务管理器启动jupyter notebook或者使用【jupyter notebook --…

赋能生态合作 共话数字创新 | 2023开放原子全球开源峰会软硬协同开源分论坛即将启幕

随着信息技术的迅猛发展&#xff0c;当下智能应用场景日益复杂、数据量爆发式增长、数据形式也多种多样&#xff0c;作为跨越无数创新领域的驱动者&#xff0c;理应打造更高质量的生态系统和开源生态&#xff0c;提供丰富的软件产品和服务&#xff0c;打造软件和硬件协同开源的…

地理空间数据云管理-四维轻云1.3.2-版本更新内容

很多用户想要在不上传数据的情况下查看案例数据&#xff0c;我们在四维轻云1.3.2版本中为新用户新增了示例项目。此外&#xff0c;此次更新还新增了标绘数据模式和场景定时保存提醒功能&#xff0c;优化了插件启动流程以及移动和旋转变化轴。 1、新增示例项目 示例项目中包含…

idea里边创建类的时候和方法自动生成注释

idea里边创建类的时候和方法自动生成注释 我们经常写代码的时候需要在类上编写注释&#xff0c;标明这个类是谁写的有什么作用&#xff0c;其实每次写都会发现有很多相同的字段&#xff0c;比如作者&#xff0c;创建时间&#xff0c;类名等&#xff0c;有的时候方法上也要标明…

bug:wx.switchTab: url 不支持 queryString

uni-app 开发小程序时 &#xff0c;bug&#xff1a;wx.switchTab: url 不支持 queryString 前言&#xff1a;在首页分类入口跳转到具体某一分类时&#xff0c;分类页是项目的底导页面&#xff0c;存在于tabbar里&#xff0c;需要使用switchTab进行跳转。参数是分类的id&#xf…

coreDNS 常见问题及优化方案

目录 问题现象一 导致原因 优化方案 问题现象二 导致原因 优化方案 Core DNS配置优化和说明 参考文章&#xff1a; 问题现象一 重启coredns pod导致集群业务解析域名五分钟可不用 导致原因 当集群使用IPVS作为kube-proxy负载均衡模式时&#xff0c;您可能会在CoreDNS…

【IMX6ULL驱动开发学习】03.设置IMX6ULL开发板与虚拟机在同一网段

为什么要设置IMX6ULL与虚拟机通信&#xff1f; 因为要把在虚拟机下编译的文件传到IMX6ULL开发板上运行 设置好同一网段&#xff0c;可以互ping后&#xff0c;可以参考这篇博客&#xff0c;实现开发板与虚拟机的文件互传 IMX6ULL开发板与虚拟机互传文件 目录 一、设置window…