首页 > 系统相关 >python+playwright 学习-49 pytest-xdist 多进程执行用例

python+playwright 学习-49 pytest-xdist 多进程执行用例

时间:2023-04-19 21:05:16浏览次数:36  
标签:playwright 49 python xdist url pytest base test 用例

前言

在实际工作中项目下的web自动化用例非常多,单进程执行会消耗很长的运行时间,可能运行一次用例得几个小时。
为了加快用例的运行速度,可以使用pytest-xdist多进程执行用例。但并不是说你写的用例,直接安装插件就能使用,实际使用的过程中还会遇到很多的问题。

pytest-xdist 多进程执行用例

pytest-xdist 多进程执行用例需遵循以下基本原则:
1.用例之间是相互独立的,没有依赖关系,每个用例都可以独立运行;
2.用例执行之间没有顺序要求,随机顺序都能正常执行;
3.每个用例都能重复执行,运行结果不会影响到其他用例

所以在设计用例的时候,一开始就需要遵循原则,不能等用例全部写完,发现用 pytest-xdist 插件运行的时候一大堆问题,改起来成本就有点大了。

环境准备

先pip 安装pytest-xdist

pip install pytest-xdist

设置进程数执行用例

test_x2.py 用例如下

# 上海悠悠 wx:283340479
# blog:https://www.cnblogs.com/yoyoketang/

url = 'https://www.cnblogs.com'


def test_x1():
    print("case1-----")
    assert url == 'https://www.cnblogs.com'


def test_x2():
    print("case2-----")
    assert url == 'https://www.cnblogs.com'


def test_x3():
    print("case3-----")
    assert url == 'https://www.cnblogs.com'

并行执行用例,直接加个-n参数即可,后面num参数就是并行数量,比如num设置为3

pytest test_x2.py -n 2

也可以使用 -n设置为auto,自动获取系统的CPU核数,缺点是启用该参数CPU占用率会非常高,每个进程执行速度会非常慢

pytest test_x2.py -n auto

测试分布算法配置

测试分布算法配置有--dist命令行选项:
--dist load (默认):将未决测试发送给任何可用的worker,没有任何保证的顺序。可以使用–maxschedchunk选项微调调度,请参阅pytest –help的输出。
--dist loadscope:测试按测试功能的模块 和测试方法的类分组。组作为一个整体分配给可用的工人。这保证了组中的所有测试都在同一进程中运行。如果您有模块级或类级固定装置,这将很有用。按类分组优先于按模块分组。
--dist loadfile:测试按其包含文件分组。组作为一个整体分配给可用的工人。这保证了文件中的所有测试都在同一个 worker 中运行。
--dist loadgroup:测试按标记分组xdist_group。组作为一个整体分配给可用的工人。这保证了所有具有相同xdist_group名称的测试都在同一个 worker 中运行。
--dist worksteal:最初,测试平均分配给所有可用的工作人员。当一个工作人员完成了大部分分配给它的测试并且没有足够的测试继续进行时(目前,每个工作人员在其队列中至少需要两个测试),就会尝试重新分配(“窃取”)来自某些工作人员的部分测试其他工人的队列。结果应该与该load方法相似,但worksteal应该更好地处理持续时间明显不同的测试,同时,它应该提供相似或更好的 fixture 重用。
--dist no: 正常的 pytest 执行模式,一次运行一个测试(根本没有分发)。

测试按标记分组xdist_group

@pytest.mark.xdist_group(name="group1")
def test1():
    pass


class TestA:
    @pytest.mark.xdist_group("group1")
    def test2():
        pass

这将确保test1并将TestA::test2在同一个工作人员中运行。没有标记的测试xdist_group按模式正常分发--dist=load。

与pytest-base-url插件结合使用

pytest-xdist 与 pytest-base-url 结合使用的时候也会有一些问题

pytest.ini

[pytest]

base_url=https://www.cnblogs.com

test_x.py 内容


def test_x1(base_url):
    print(base_url)
    assert base_url == 'https://www.cnblogs.com'


def test_x2(base_url):
    print(base_url)
    assert base_url == 'https://www.cnblogs.com'


def test_x3(base_url):
    print(base_url)
    assert base_url == 'https://www.cnblogs.com'

你直接输入pytest test_x.py 执行是没问题的

>pytest test_x.py
=============== test session starts =================
platform win32 -- Python 3.8.5, pytest-7.2.2, pluggy-1.0.0
baseurl: https://www.cnblogs.com
rootdir: D:\demo\untitled3, configfile: pytest.ini
plugins: base-url-2.0.0, xdist-3.2.1
collected 3 items                                                                                                       

test_x.py ...                                                                                                     [100%]

================ 3 passed in 0.03s  ==============================

但是加上 -n 参数后就获取不到base_url地址了

>pytest test_x.py -n 2
================================================= test session starts ==================================================
platform win32 -- Python 3.8.5, pytest-7.2.2, pluggy-1.0.0
baseurl: https://www.cnblogs.com
rootdir: D:\demo\untitled3, configfile: pytest.ini
plugins: base-url-2.0.0, xdist-3.2.1
gw0 [3] / gw1 [3]


......

base_url = None

    def test_x1(base_url):
        print(base_url)
>       assert base_url == 'https://www.cnblogs.com'
E       AssertionError: assert None == 'https://www.cnblogs.com'

主要原因是获取的base_url为空 了

看了下源码,有个地方有注释说don't run configure on xdist worker nodes,不适配xdist

python+playwright 学习-49 pytest-xdist 多进程执行用例_多进程

解决办法一:

找到原来的 base_url 这个fixture定义的地方

@pytest.fixture(scope="session")
def base_url(request):
    """Return a base URL"""
    config = request.config
    base_url = config.getoption("base_url")
    if base_url is not None:
        return base_url

改成

@pytest.fixture(scope="session")
def base_url(request):
    """Return a base URL"""
    config = request.config
    base_url = config.getoption("base_url") or config.getini("base_url") 
    if base_url is not None:
        return base_url

如果不想改源码,也可以换个方式避开上面的问题
解决方法二:在pytest.ini里面不配置ini参数,配置命令行参数
pytest.ini修改后如下

[pytest]

addopts=
    --base-url=https://www.cnblogs.com

以上2种方式都可以解决pytest-xdist 与 pytest-base-url 不兼容的问题。

遇到的一些问题
使用-n 参数后,用例里面print的内容不会在控制台输出了,加-s也不会输出


python+playwright 学习-49 pytest-xdist 多进程执行用例_Python_02



标签:playwright,49,python,xdist,url,pytest,base,test,用例
From: https://blog.51cto.com/u_15249893/6207428

相关文章

  • python-悲观锁和乐观锁
    乐观锁和悲观锁它们都是一种思想,都是人们定义出来的概念,和语言无关并发控制:当程序出现并发的问题时,我们需要保证在并发情况下数据的准确性,以保证当前用户在和其他用户一起操作时,得到的结果和他单独操作时得到的结果是一样的,没有做好并发控制,就可能导致脏读、幻读、不可重复读等问......
  • 【中介者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
    简介中介者模式(MediatorPattern)是一种行为型模式。它限制对象之间的直接交互,它用一个中介对象来封装一系列的动作,以让对象之间进行交流。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。当一些对象和其他对象紧密耦合以致难以对其进......
  • 简单的python3脚本:从日志中提取信息
    命名:log_extractor.pyordownload_stats_extractor.py#coding:utf-8#!/usr/bin/python3deffilter_line(line,contains,contains_not):ifall(cinlineforcincontains)andnotany(ninlinefornincontains_not):ifint(line.split()[8])==2......
  • python-SSTI模板注入
    一、python_SSTI模板注入介绍ssti漏洞成因ssti服务端模板注入,ssti主要为python的一些框架jinja2makotornadodjango,PHP框架smartytwig,java框架jadevelocity等等使用了渲染函数时,由于代码不规范或信任了用户输入而导致了服务端模板注入,模板渲染其实并没有漏洞,主要是程序员......
  • 关于python中的class类犯得迷之错误
    昨天在写一个类,修了20几天假,忘了类的写法,刚开始我写成这样classA():def_init_():......然后我想把外面的一个方法c传进A类的方法b中,进行调用,就开始报错:object()takesnoparameters,刚开始很自信,不可能是自己写错,结果啪啪打脸,正确的类的写法是这样的......
  • python反序列化
    这篇文章介绍python反序列化。0X00前言本篇文章搬运大佬k0rz3n的研究文章,写的特别好,存下来学习一下。0X01Python的序列化和反序列化是什么Python的序列化和反序列化是将一个类对象向字节流转化从而进行存储和传输,然后使用的时候再将字节流转化回原始的对象的一个过程。1.......
  • Python操作MySQL就是这么简单
    Python操作MySQL就是这么简单下载MySQL8.0安装MySQL8.0步骤2:选择安装类型步骤3:选择安装位置步骤4:配置MySQL8.0步骤5:安装MySQL8.0步骤6:完成安装启动MySQL8.0MySQL8.0的常用命令python的pymysql库操作方法安装pymysql库安装pymysql库连接到MySQL数据库......
  • playwright
    安装命令pipinstallplaywrightplaywrightinstallpipinstallmsvc-runtime提示这个错误,执行pipinstallmsvc-runtime就好了from._greenletimport_C_API#pylint:disable=no-name-in-moduleImportError:DLLloadfailed:找不到指定的模块。 ......
  • 数据分析的基本知识介绍,通过Python创建一些漂亮的数据可视化
    近一年势头不灭的Python在数据分析领域,是专家们的必备技能。随着IT行业的增长,对有经验的数据科学家的需求也水涨船高,而Python也一跃而成最受欢迎的语言。介绍数据分析的基本知识,并利用Python创建一些漂亮的数据可视化。概要为什么要学数据科学中的Python?Python简介为数据......
  • 零基础开始学Python,主要划分为哪四个阶段?
    零基础开始,Python要学到什么程度才能找到理想的工作呢,主要分为四个阶段1、第一阶段(一般岗位叫数据专员)基本学会excel(VBA最好学会;会做透视表;熟练用筛选、排序、公式),做好PPT。这样很多传统公司的数据专员已经可以做了2、第二阶段(数据专员~数据分析师)这一阶段要会SQL,懂业务,加上第一阶......