通过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

相关文章

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Linux samba共享慢的原因及解决方案

《Linuxsamba共享慢的原因及解决方案》:本文主要介绍Linuxsamba共享慢的原因及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux samba共享慢原因及解决问题表现原因解决办法总结Linandroidux samba共享慢原因及解决

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

如何解决Spring MVC中响应乱码问题

《如何解决SpringMVC中响应乱码问题》:本文主要介绍如何解决SpringMVC中响应乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC最新响应中乱码解决方式以前的解决办法这是比较通用的一种方法总结Spring MVC最新响应中乱码解