首页 > 其他分享 >当每个系统的 conftest.py`文件不一致时,如何兼容?

当每个系统的 conftest.py`文件不一致时,如何兼容?

时间:2025-01-15 21:29:25浏览次数:3  
标签:py system module 兼容 conftest pytest token

在自动化测试中,当每个系统的 conftest.py 文件不一致时,需要一种兼容的方法来统一管理和处理这些文件的内容,同时保留各系统独立的配置。以下是一个详细的解决方案,能够实现 每个系统独立管理 conftest.py 文件 的同时,在主测试框架中 统一加载和执行


1. 需求分析

  1. 每个系统的独立性

    • 每个系统有自己的 conftest.py 文件,包含独立的 fixture 或配置逻辑。
    • 不同系统可能有不同的前置条件、环境变量等。
  2. 统一管理与兼容

    • 主测试框架需要兼容并动态加载每个系统的 conftest.py 文件。
    • 避免不同 fixture 之间的命名冲突。
  3. 可扩展性

    • 支持动态添加新系统及其独立配置。
    • 兼容 pytest 的钩子机制。

2. 设计方案

2.1 目录结构设计

tests/ 目录中,每个系统的测试用例和 conftest.py 文件独立管理:

tests/
├── system_a/
│   ├── conftest.py        # system_a 的独立配置
│   ├── test_cases.yml
│   ├── test_module_1.py
│   ├── test_module_2.py
├── system_b/
│   ├── conftest.py        # system_b 的独立配置
│   ├── test_cases.yml
│   ├── test_module_1.py
│   ├── test_module_2.py
├── framework/
│   ├── base_test.py
│   ├── utils.py
│   ├── reporter.py
│   ├── conftest_loader.py # 动态加载 conftest.py 的逻辑

2.2 动态加载 conftest.py 文件

使用 Python 的动态导入功能(如 importlibpytest 的插件机制)加载每个系统的 conftest.py 文件。

动态加载器

创建一个动态加载器模块 framework/conftest_loader.py,用于加载各系统的 conftest.py 文件:

import os
import importlib.util
import sys

def load_conftest_files(base_dir):
    """
    动态加载所有系统的 conftest.py 文件
    :param base_dir: 测试用例的根目录
    """
    for root, dirs, files in os.walk(base_dir):
        if "conftest.py" in files:
            conftest_path = os.path.join(root, "conftest.py")
            module_name = os.path.basename(root) + "_conftest"  # 避免模块冲突
            load_python_module(conftest_path, module_name)

def load_python_module(file_path, module_name):
    """
    动态加载 Python 模块
    :param file_path: 文件路径
    :param module_name: 模块名称
    """
    spec = importlib.util.spec_from_file_location(module_name, file_path)
    module = importlib.util.module_from_spec(spec)
    sys.modules[module_name] = module
    spec.loader.exec_module(module)
主测试框架调用加载器

在主目录的 tests/conftest.py 中调用加载器,动态加载所有系统的 conftest.py 文件。

import os
from framework.conftest_loader import load_conftest_files

# 动态加载每个系统的 conftest.py 文件
base_dir = os.path.dirname(__file__)
load_conftest_files(base_dir)

2.3 不同系统的 conftest.py 文件

各系统可以有自己的 fixture 和前置逻辑,互相独立。

system_a/conftest.py
import pytest

@pytest.fixture(scope="module")
def system_a_token():
    print("获取 system_a 的 token")
    return "system_a_token"

@pytest.fixture
def system_a_setup():
    print("执行 system_a 的前置操作")
system_b/conftest.py
import pytest

@pytest.fixture(scope="module")
def system_b_token():
    print("获取 system_b 的 token")
    return "system_b_token"

@pytest.fixture
def system_b_setup():
    print("执行 system_b 的前置操作")

2.4 测试用例与 fixture 的应用

在每个系统的测试用例中,可以直接使用对应系统的 fixture

system_a/test_module_1.py
def test_system_a_login(system_a_token, system_a_setup):
    print(f"system_a 的 token: {system_a_token}")
    assert system_a_token == "system_a_token"
system_b/test_module_1.py
def test_system_b_login(system_b_token, system_b_setup):
    print(f"system_b 的 token: {system_b_token}")
    assert system_b_token == "system_b_token"

2.5 避免 fixture 冲突

由于 pytest 会全局注册 fixture,如果多个系统的 fixture 名称相同(如 token),可能会导致冲突。为了解决这个问题:

  1. 每个系统的 fixture 名称加上系统前缀(如 system_a_tokensystem_b_token)。
  2. 通过参数化动态选择 fixture(适合需要统一接口的场景)。
动态选择 fixture 的方案

在主 conftest.py 中,根据系统参数动态选择 fixture

import pytest

@pytest.fixture
def dynamic_token(request):
    system = request.node.get_closest_marker("system").args[0]
    if system == "system_a":
        from system_a.conftest import system_a_token
        return system_a_token()
    elif system == "system_b":
        from system_b.conftest import system_b_token
        return system_b_token()

在测试用例中通过 pytest.mark 指定系统:

import pytest

@pytest.mark.system("system_a")
def test_dynamic_token(dynamic_token):
    assert dynamic_token == "system_a_token"

@pytest.mark.system("system_b")
def test_dynamic_token(dynamic_token):
    assert dynamic_token == "system_b_token"

3. 测试执行与结果管理

3.1 统一执行所有系统的测试

运行以下命令执行所有系统的测试用例:

pytest -v

3.2 按系统或模块执行

通过 pytest 的 -k 参数筛选执行特定系统或模块的测试用例:

  • 运行 system_a 的测试用例:

    pytest -k "system_a"
    
  • 运行 system_b/module_1 的测试用例:

    pytest -k "system_b/test_module_1"
    

4. 优势与扩展性

4.1 优势

  1. 独立性和兼容性

    • 每个系统的 conftest.py 文件独立,互不影响。
    • 主框架动态加载各系统的配置,实现统一兼容。
  2. 灵活性

    • 支持按需动态加载 fixture
    • 支持按系统、模块筛选执行测试用例。
  3. 可扩展性

    • 添加新系统时只需增加对应的目录和 conftest.py 文件,无需修改主框架代码。

4.2 扩展性

  • 支持多协议:扩展框架支持 gRPC、GraphQL、WebSocket 等协议。
  • 分布式执行:结合 pytest-xdist 实现分布式测试。
  • 统一报告:集成多系统的测试结果,按系统分类生成统一报告。

5. 总结

通过动态加载 conftest.py 的方式,可以实现以下目标:

  1. 每个系统独立管理自己的配置和前置逻辑。
  2. 主框架统一加载和执行所有系统的测试用例。
  3. 避免 fixture 冲突,同时支持动态选择和扩展。

这种设计兼顾了 独立性统一性,非常适合多系统接口测试的场景,且具有强大的扩展能力。

标签:py,system,module,兼容,conftest,pytest,token
From: https://blog.csdn.net/weixin_44872675/article/details/145168484

相关文章

  • Windows python venv 虚拟开发环境
    前言全局说明Windowspythonvenv虚拟开发环境一、说明1.1环境:Windows11家庭版23H222631.3737Python3.8.10(tags/v3.8.10:3d8993a,May32021,11:48:03)[MSCv.192864bit(AMD64)]onwin32二、venv2.1创建项目目录mkdirxhs-monitorcdxhs-monito......
  • Windows pyenv管理多python 版本环境安装
    前言全局说明Windowspython多版本安装,因为开发功能和客户要求,py脚本会被要求不同版本,但是命令行输入时同一个名字只能对应一个版本,如果多个版本,那只能改名字。比如:python3.8python3.9有什么方法用一个python使用不同版本呢?一、说明1.1环境:Windows11家庭版23H2......
  • Python----Python高级(面向对象:对象,类,属性,方法)
    一、面向对象简介Python完全采用了面向对象的思想,是真正面向对象的编程语言,完全支持面向对象的基本功能,例如:继承、多态、封装等。Python中,一切皆对象。python数据类型、函数等,都是对象。面向对象(ObjectorientedProgramming,OOP)编程的思想主要是针对大型软件设计而来的......
  • Python中LLM的模型动态深度调整:早退机制
    文章目录引言早退机制的基本原理1.1早退机制的工作流程1.2退出分数的计算1.3早退机制的优点早退机制的实现2.1模型结构设计2.2早退模块的设计2.3早退决策的实现2.4训练与推理早退机制的应用场景3.1实时推理3.2边缘计算3.3自适应模型早退机制的优化与挑战4.1......
  • 13.Python3 类型注解
    Python3类型注解Python类型注解(TypeHints)是自Python3.5引入的一种特性,它允许开发者在定义函数、变量时指定数据类型。类型注解并非强制执行的,它们主要用于提高代码的可读性和可维护性,并支持静态分析工具进行类型检查。类型注解不会影响Python的动态特性,也不会在运行时被......
  • python批量
    python第一步def一个txt,按时间戳拆分内容以查找单独的部分,时间戳的格式为YYYY-MM-DDHH:MM:SS,因此我们将使用正则表达式根据此模式进行拆分,拆分后处理32×32列的数组,删除前2列和后9列。第二步dif处理指定目录中的所有.txt文件,并按第一步的方法处理所有txtx文件。将所得的多个txt......
  • flask之 scoped实现线程安全.py
    1、用法导入模块,将Session传入scoped_session即可fromsqlalchemy.ormimportsessionmakerfromsqlalchemyimportcreate_enginefromsqlalchemy.ormimportscoped_sessionfrommodelsimportUsersfromthreadingimportlocalengine=create_engine("mysql+pymysql:......
  • Python Playwright学习笔记(一)
    一、简介1.1Playwright是什么?它是微软在2020年初开源的新一代自动化测试工具,其功能和selenium类似,都可以驱动浏览器进行各种自动化操作。1.2、特点是什么支持当前所有的主流浏览器,包括chrome、edge、firefox、safari;支持跨平台多语言:支持Windows、Linux、macOS;安装和......
  • python 按时间戳删除32×32数组的前2列和后9列
    还是雨滴谱文件,这次尝试批量处理首先处理1个单独的txt文件#!usr/bin/envpython#-*-coding:utf-8_*-"""@author:Suyue@file:raindrop.py@time:2025/01/15{DAY}@desc:"""importnumpyasnpimportredefprocess_file(input_file,output_file):......
  • XS2186八通道、供电设备(PSE)电源控制器,IEEE® 802.3at/af兼容PSE,单个端口提供最高达30W
    XS2186是一个八通道、供电设备(PSE)电源控制器,设计用于IEEE®802.3at/af兼容PSE。器件提供用电设备(PD)检测、分级、限流以及负载断开检测。器件支持全自动工作、软件编程和外挂eeprom。器件还支持最新二事件分级。采用单电源供电,能够为单个端口提供最高达30......