首页 > 系统相关 >Pytest - xdist 保证多进程共享 session 级别fixture

Pytest - xdist 保证多进程共享 session 级别fixture

时间:2023-05-10 20:45:35浏览次数:56  
标签:session 20 get win fixture batch xdist pytest id

背景:搜索自动化不同的测试文件件需要使用相同的变量

解决:

import logging

from tools import set_logging
import pytest
import time
from filelock import FileLock
import json
import os

set_logging.set_test_log()

@pytest.fixture(scope="session")
def get_batch_id(tmp_path_factory, worker_id):
    logging.info(f'worker_id:{worker_id}')
    logging.info(f'tmp_path_factory:{tmp_path_factory}')

    batch_id = str(int(time.time()))
    # 如果是单机运行 则运行这里的代码块【不可删除、修改】
    if worker_id == "master":
        """
        【自定义代码块】
        这里就写你要本身应该要做的操作,比如:登录请求、新增数据、清空数据库历史数据等等
        """
        # 如果测试用例有需要,可以返回对应的数据,比如 token
        return batch_id

    # 如果是分布式运行
    # 获取所有子节点共享的临时目录,无需修改【不可删除、修改】
    root_tmp_dir = tmp_path_factory.getbasetemp().parent
    logging.info(f'root_tmp_dir:{root_tmp_dir}')
    # 【不可删除、修改】
    fn = root_tmp_dir / "data.json"
    logging.info(f'fn:{fn}')
    # 【不可删除、修改】
    with FileLock(str(fn) + ".lock"):
        # 【不可删除、修改】
        if fn.is_file():
            # 缓存文件中读取数据,像登录操作的话就是 token 【不可删除、修改】
            batch_id = json.loads(fn.read_text())
            logging.info(f'缓存中读取batch_id:{batch_id}')
        else:
            """
            【自定义代码块】
            跟上面 if 的代码块一样就行
            """
            # 【不可删除、修改】
            fn.write_text(batch_id)
            logging.info(f'首次写入batch_id:{batch_id}')

        # 最好将后续需要保留的数据存在某个地方,比如这里是 os 的环境变量
        os.environ['batch_id'] = str(batch_id)
    return batch_id

产生的log文件:

2023-05-10 20:07:15,394 INFO [conftest.py(get_batch_id:17)] - worker_id:gw0
2023-05-10 20:07:15,394 INFO [conftest.py(get_batch_id:17)] - worker_id:gw1
2023-05-10 20:07:15,395 INFO [conftest.py(get_batch_id:18)] - tmp_path_factory:TempPathFactory(_given_basetemp=WindowsPath('C:/Users/win/AppData/Local/Temp/pytest-of-win/pytest-65/popen-gw0'), _trace=<pluggy._tracing.TagTracerSub object at 0x0000020CBA6DF9A0>, _basetemp=None)
2023-05-10 20:07:15,396 INFO [conftest.py(get_batch_id:18)] - tmp_path_factory:TempPathFactory(_given_basetemp=WindowsPath('C:/Users/win/AppData/Local/Temp/pytest-of-win/pytest-65/popen-gw1'), _trace=<pluggy._tracing.TagTracerSub object at 0x000002596E6CF970>, _basetemp=None)
2023-05-10 20:07:15,398 INFO [conftest.py(get_batch_id:33)] - root_tmp_dir:C:\Users\win\AppData\Local\Temp\pytest-of-win\pytest-65
2023-05-10 20:07:15,398 INFO [conftest.py(get_batch_id:33)] - root_tmp_dir:C:\Users\win\AppData\Local\Temp\pytest-of-win\pytest-65
2023-05-10 20:07:15,398 INFO [conftest.py(get_batch_id:36)] - fn:C:\Users\win\AppData\Local\Temp\pytest-of-win\pytest-65\data.json
2023-05-10 20:07:15,399 INFO [conftest.py(get_batch_id:36)] - fn:C:\Users\win\AppData\Local\Temp\pytest-of-win\pytest-65\data.json
2023-05-10 20:07:15,401 INFO [conftest.py(get_batch_id:51)] - 首次写入batch_id:1683720435
2023-05-10 20:07:15,402 INFO [test_search.py(test_search_keyword:313)] - get_batch_id:1683720435
 2023-05-10 20:07:15,456 INFO [conftest.py(get_batch_id:43)] - 缓存中读取batch_id:1683720435
2023-05-10 20:07:15,458 INFO [test_search_recommend.py(test_search_recommend_key_word:378)] - get_batch_id:1683720435

参考:
1.https://note.guoxiaorui.cn/pages/9bb196/
2.https://www.cnblogs.com/poloyy/p/14708825.html
3.https://blog.csdn.net/qq_37674086/article/details/122622699

标签:session,20,get,win,fixture,batch,xdist,pytest,id
From: https://www.cnblogs.com/czzz/p/17389250.html

相关文章

  • Failed to open connection to "session" message bus: Using X11 for dbus-daemon au
    Failedtoopenconnectionto"session"messagebus:UsingX11fordbus-daemonautolaunchwasdisabledatcompiletime,setyourDBUS_SESSION_BUS_ADDRESSinstead4Failedtoopenconnectionto"session"messagebus:UsingX11fordbus-da......
  • 入门8-Pytest部分测试用例的前后置(fixture)(2-conftest.py结合)
    conftest.py文件专门用来存放fixture的文件,名称固定不能修改。conftest.py中的所有方法在调用时都不需要导包一个用例可以同时调用多个conftest.py中的多个方法一般conftest.py中的方法autouse=True, 自动执行。conftest.py放在最外层,使用scope="session"时,整个项目开头执......
  • Python_16 session、cookie 鉴权
    一、查缺补漏1.pprint https://www.cnblogs.com/yjybupt/p/10669988.html https://www.cnblogs.com/wongbingming/p/12854618.html 2.鉴权: http://testingpai.com/article/1621929988356 3.importjson json.du......
  • 入门8-Pytest部分测试用例的前后置(fixture)(1-参数详解)
    使用[email protected](scope=”function”,autouse=False,params=loginutil(),ids=[0,1,2],name="login")各个参数详解Scope:作用域             Function:用例之前和之后    Class:类之前和之后Package/session:#整个项目会话之......
  • Django高级之-cookie与session
    目录1背景信息cookie的介绍cookie的由来什么是cookiecookie的原理Cookie规范Cookie的覆盖在浏览器中查看cookiesession的介绍session的由来什么是sessiontoken的介绍token的由来什么是token?Django操作cookie设置cookie获取cookie删除CookieCookie版登录校验案例Django操作Session......
  • MyBatis-Plus和PageHelper冲突导致Factory method sqlSessionFactory threw exception
    springboot开始引入了mybaits-plus。后来想引入pagehelper进行分页,引入之后报错ErrorstartingApplicationContext.Todisplaytheconditionsreportre-runyourapplicationwith'debug'enabled.13:48:24.428ERRORo.s.boot.SpringApplication[845]-Applicationrun......
  • Django操作session和中间件以及csrf跨站服务
    Django操作session#cookie保存在浏览器,数据不安全session可以将用户信息保存在服务端,基于cookie工作的1.用户信息认证2.生成随机字符串3.随机字符串和用户信息绑定一起,保存,默认在mysql4.把随机字符串返回到浏览器,将其保存,再次访问直接带其一起传输至服务端,服务端用其进......
  • pytest fixture:向fixture传递数据
    1利用request向fixture传递数据conftest.pytest_fixture.py执行request是pytest自带的一个fixture,利用它可以得到test函数的上下文文信息request.modulemodule是其属性,属性还有nodefunctionclsclasssession具体看官网https://docs.pytest.org/en/7.3.x/referen......
  • Django框架——cookie与session简介、django操作cookie与session、django中间件
    cookie与session简介"""回忆:HTTP协议四大特性 1.基于请求响应 2.基于TCP、IP作用于应用层之上的协议 3.无状态 不保存客户端的状态 4.无连接"""最开始的网站都不需要用户注册所有人来访问获取到的数据都是一样的随着互联网的发展很多网站需要指定当前用户的状态cook......
  • Cookie与Session CBV中加装饰器
    目录一.会话跟踪技术什么是会话跟踪?我们需要先了解一下什么是会话。可以把会话理解为客户端和服务端之间的一次会晤,在一次会晤中可能会包含多次请求和响应。例如你给10086打个电话,你就是客户端,而10086就是服务端。从双方接通电话那一刻起,会话就开始了,到某一方挂断电话表示会话......