通过pytest-xdist插件并发执行用例时, scope=session的fixture会运行多次问题的解决方案

本文主要是介绍通过pytest-xdist插件并发执行用例时, scope=session的fixture会运行多次问题的解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

场景

在UI自动化项目中,使用的是pytest + playwright, 需要实现同一个用户只登录一次的,所以在conftest.py中定义了一个scope=session的fixture,然后在此fixture中实现了系统登录,在非并发模式下执行的时候,能保证同一个用户只登录一次,但是并发执行的时候每个case都会执行登录

问题

需要解决并发执行的时候同一个用户只登录一次,如果是不同用户的时候还是需要进行登录

解决方法

  1. pytest-xdist官方给出的解决方案:https://pytest-xdist.readthedocs.io/en/stable/how-to.html#making-session-scoped-fixtures-execute-only-once
  2. 参考pytest-xdist给出的解决方案实现如下:
import pytest
from filelock import FileLock
from os import path
import os@pytest.fixture(scope="session", autouser=True)
def login_session(browser, browser_context_args, session_file, worker_id):''' 1. 并发执行情况下,同一个user不需要多次登录2. 不同的用户还需要登录3. session_file是自定义的fixture,定义了用户登录信息存储的文件路径'''logging.debug("worker_id:%s" % worker_id)if path.exists(session_file) and worker_id == "master":logging.info("session file已存在,用户已登录")  # session文件已存在,不需要登录with FileLock(str(session_file) + ".lock"): #FileLock实现只登录一次if session_file.is_file():logging.info("session file已存在") # session 文件已存在,需要登录else:logging.info("用户进行登录操作")browsercontext = browser.new_context(**browser_context_args)login(browsercontext, request, session_file) # 函数定义了登录操作,并且登录成功后存储用户的session文件# session文件路径的定义
@pytest.fixture(scope="session")
def set_session_file(user, tmp_path_factory, test_data):'''1.设置登录后的session保存位置, 通过tmp_path_factory设置临时目录'''logging.info(f"登录用户:{user}")# 这里取的临时目录的getbasetemp().parent,因为并发时getbasetemp获取每个case路径是类似temp_dir/gw0, temp_dir/gw1,所以为了保证存放session的路径是同一个路径; #当然这里也可以创建一个目录来存放session,不过要在login_session的fixture中添加yield并且添加删除session file,避免session失效的情况, 使用临时目录会自动删除if "gw" in path.split(tmp_path_factory.getbasetemp())[-1]:  #并发执行的路径取值dir= tmp_path_factory.getbasetemp().parentelse: 非并发执行的时候路径取值dir = tmp_path_factory.getbasetemp()session_file = path.join(dir, "session_files", "%s.json" % user) logging.info('session file is:%s'%session_file)return Path(session_file)

这篇关于通过pytest-xdist插件并发执行用例时, scope=session的fixture会运行多次问题的解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/984131

相关文章

Springboot3统一返回类设计全过程(从问题到实现)

《Springboot3统一返回类设计全过程(从问题到实现)》文章介绍了如何在SpringBoot3中设计一个统一返回类,以实现前后端接口返回格式的一致性,该类包含状态码、描述信息、业务数据和时间戳,... 目录Spring Boot 3 统一返回类设计:从问题到实现一、核心需求:统一返回类要解决什么问题?

maven异常Invalid bound statement(not found)的问题解决

《maven异常Invalidboundstatement(notfound)的问题解决》本文详细介绍了Maven项目中常见的Invalidboundstatement异常及其解决方案,文中通过... 目录Maven异常:Invalid bound statement (not found) 详解问题描述可

idea粘贴空格时显示NBSP的问题及解决方案

《idea粘贴空格时显示NBSP的问题及解决方案》在IDEA中粘贴代码时出现大量空格占位符NBSP,可以通过取消勾选AdvancedSettings中的相应选项来解决... 目录1、背景介绍2、解决办法3、处理完成总结1、背景介绍python在idehttp://www.chinasem.cna粘贴代码,出

SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)

《SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)》本文总结了SpringBoot项目整合Kafka启动失败的常见错误,包括Kafka服务器连接问题、序列化配置错误、依赖配置问题、... 目录一、Kafka服务器连接问题1. Kafka服务器无法连接2. 开发环境与生产环境网络不通二、序

SpringSecurity中的跨域问题处理方案

《SpringSecurity中的跨域问题处理方案》本文介绍了跨域资源共享(CORS)技术在JavaEE开发中的应用,详细讲解了CORS的工作原理,包括简单请求和非简单请求的处理方式,本文结合实例代码... 目录1.什么是CORS2.简单请求3.非简单请求4.Spring跨域解决方案4.1.@CrossOr

nacos服务无法注册到nacos服务中心问题及解决

《nacos服务无法注册到nacos服务中心问题及解决》本文详细描述了在Linux服务器上使用Tomcat启动Java程序时,服务无法注册到Nacos的排查过程,通过一系列排查步骤,发现问题出在Tom... 目录简介依赖异常情况排查断点调试原因解决NacosRegisterOnWar结果总结简介1、程序在

解决java.util.RandomAccessSubList cannot be cast to java.util.ArrayList错误的问题

《解决java.util.RandomAccessSubListcannotbecasttojava.util.ArrayList错误的问题》当你尝试将RandomAccessSubList... 目录Java.util.RandomAccessSubList cannot be cast to java.

Apache服务器IP自动跳转域名的问题及解决方案

《Apache服务器IP自动跳转域名的问题及解决方案》本教程将详细介绍如何通过Apache虚拟主机配置实现这一功能,并解决常见问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录​​问题背景​​解决方案​​方法 1:修改 httpd-vhosts.conf(推荐)​​步骤

python协程实现高并发的技术详解

《python协程实现高并发的技术详解》协程是实现高并发的一种非常高效的方式,特别适合处理大量I/O操作的场景,本文我们将简单介绍python协程实现高并发的相关方法,需要的小伙伴可以了解下... 目录核心概念与简单示例高并发实践:网络请求协程如何实现高并发:核心技术协作式多任务与事件循环非阻塞I/O与连接

java反序列化serialVersionUID不一致问题及解决

《java反序列化serialVersionUID不一致问题及解决》文章主要讨论了在Java中序列化和反序列化过程中遇到的问题,特别是当实体类的`serialVersionUID`发生变化或未设置时,... 目录前言一、序列化、反序列化二、解决方法总结前言serialVersionUID变化后,反序列化失