如何将PyTest addoption的用户输入设为全局变量供所有文件访问?
实现pytest命令行参数全局可访问
问题原因
你直接导入get_user、get_pwd fixture得到的是函数对象,因为fixture是pytest通过依赖注入机制执行的,只有在测试函数中声明依赖时才会被调用并返回实际值,普通非测试函数无法触发fixture的执行逻辑。
解决方案:用pytest_configure钩子初始化全局变量
修改conftest.py,通过pytest的pytest_configure钩子在测试启动时提前读取命令行参数,并存为模块级全局变量,这样所有文件(包括测试函数和非测试工具函数)都可以直接导入使用:
import pytest # 定义全局变量用于存储命令行参数 TEST_USER = "" TEST_PWD = "" def pytest_addoption(parser): try: parser.addoption('--user', action='store', default='', help='Login Email for the API tests') parser.addoption('--pwd', action='store', default='', help='Login Password for the API tests') except ValueError: pass def pytest_configure(config): # 在pytest初始化阶段读取命令行参数,赋值给全局变量 global TEST_USER, TEST_PWD TEST_USER = config.getoption("--user") TEST_PWD = config.getoption("--pwd") # 保留原有fixture,兼容测试函数的依赖注入方式 @pytest.fixture def get_user(): return TEST_USER @pytest.fixture def get_pwd(): return TEST_PWD
使用方式
1. 在测试函数中使用
可以继续使用原有fixture依赖注入:
def test_login(get_user, get_pwd): assert get_user != "" # 执行登录逻辑
也可以直接导入全局变量:
from conftest import TEST_USER, TEST_PWD def test_login(): assert TEST_USER != "" # 执行登录逻辑
2. 在非测试函数中使用
比如工具函数文件utils.py:
from conftest import TEST_USER, TEST_PWD def generate_auth_header(): # 使用全局变量生成认证头 return {"Authorization": f"Basic {TEST_USER}:{TEST_PWD}"}
注意事项
pytest_configure会在pytest启动时自动执行,确保全局变量在所有测试和工具代码运行前完成初始化。- 如果需要在pytest之外的环境运行这些非测试函数,需要额外处理参数的赋值逻辑(比如从环境变量读取),否则全局变量会保持默认空值。
内容的提问来源于stack exchange,提问作者coder_g
相关产品推荐
相关产品推荐

