在自动化测试中,当每个系统的 conftest.py
文件不一致时,需要一种兼容的方法来统一管理和处理这些文件的内容,同时保留各系统独立的配置。以下是一个详细的解决方案,能够实现 每个系统独立管理 conftest.py
文件 的同时,在主测试框架中 统一加载和执行。
1. 需求分析
-
每个系统的独立性:
- 每个系统有自己的
conftest.py
文件,包含独立的fixture
或配置逻辑。 - 不同系统可能有不同的前置条件、环境变量等。
- 每个系统有自己的
-
统一管理与兼容:
- 主测试框架需要兼容并动态加载每个系统的
conftest.py
文件。 - 避免不同
fixture
之间的命名冲突。
- 主测试框架需要兼容并动态加载每个系统的
-
可扩展性:
- 支持动态添加新系统及其独立配置。
- 兼容 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 的动态导入功能(如 importlib
或 pytest
的插件机制)加载每个系统的 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
),可能会导致冲突。为了解决这个问题:
- 每个系统的
fixture
名称加上系统前缀(如system_a_token
、system_b_token
)。 - 通过参数化动态选择
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 优势
-
独立性和兼容性:
- 每个系统的
conftest.py
文件独立,互不影响。 - 主框架动态加载各系统的配置,实现统一兼容。
- 每个系统的
-
灵活性:
- 支持按需动态加载
fixture
。 - 支持按系统、模块筛选执行测试用例。
- 支持按需动态加载
-
可扩展性:
- 添加新系统时只需增加对应的目录和
conftest.py
文件,无需修改主框架代码。
- 添加新系统时只需增加对应的目录和
4.2 扩展性
- 支持多协议:扩展框架支持 gRPC、GraphQL、WebSocket 等协议。
- 分布式执行:结合 pytest-xdist 实现分布式测试。
- 统一报告:集成多系统的测试结果,按系统分类生成统一报告。
5. 总结
通过动态加载 conftest.py
的方式,可以实现以下目标:
- 每个系统独立管理自己的配置和前置逻辑。
- 主框架统一加载和执行所有系统的测试用例。
- 避免
fixture
冲突,同时支持动态选择和扩展。
这种设计兼顾了 独立性 和 统一性,非常适合多系统接口测试的场景,且具有强大的扩展能力。
标签:py,system,module,兼容,conftest,pytest,token From: https://blog.csdn.net/weixin_44872675/article/details/145168484