长话短说,如果会话是针对我们的生产API运行的,我希望能够跳过一些测试。设置测试运行环境的命令行选项已经被设定。
我发现使用pytest_namespace
来跟踪全局变量的想法,因此我在我的conftest.py文件中进行了设置。
def pytest_namespace():
return {'global_env': ''}
我获取命令行选项并在conftest.py的fixture中设置各种API网址(来自config.ini文件)。
我接收命令行选项,并将不同的 API URL(从 config.ini 文件中)设置为 fixture 在 conftest.py 中。
@pytest.fixture(scope='session', autouse=True)
def configInfo(pytestconfig):
global data
environment = pytestconfig.getoption('--ENV')
print(environment)
environment = str.lower(environment)
pytest.global_env = environment
config = configparser.ConfigParser()
config.read('config.ini') # local config file
configData = config['QA-CONFIG']
if environment == 'qa':
configData = config['QA-CONFIG']
if environment == 'prod':
configData = config['PROD-CONFIG']
(...)
然后我有一项想跳过的测试,它被装饰成这样:
@pytest.mark.skipif(pytest.global_env in 'prod',
reason="feature not in Prod yet")
然而,每当我对生产环境运行测试时,它们就不会被跳过。我进行了一些调试,并发现:
a)global_env变量可以通过另一个fixture访问。
@pytest.fixture(scope="session", autouse=True)
def mod_header(request):
log.info('\n-----\n| '+pytest.global_env+' |\n-----\n')
我的日志正确显示。
b) global_env变量可以在测试中访问,正确记录环境。
c) pytest_namespace
不建议使用。
因此,我假设这与skipif访问global_env的时间以及fixture在测试会话中执行的时间有关。我也认为使用已弃用的功能非常不理想。
我的问题是:
- 我如何从pytest命令行选项中获取值并将其传递给skipif?
- 还有比
pytest_namespace
更好的方式吗?
pytest
官方的解决方法是让你自己实现一个--runslow
标志。我觉得在测试过程中,你总是会有一些长时间运行的、类似于烟雾测试的测试,你可能希望默认情况下跳过这些测试,如果--runslow
内置在其中就好了。 - andrewpytest.mark.skipif(pytest.config.getoption(...))
,而现在他们必须使用modifyitems
钩子来完成。当他们弃用了pytest.config
时,应该为这个常见的使用情况提供一个类似简洁且官方支持(即不基于_pytest
)的替代方法,让用户不必再绕这么多弯路。 - smheidrich