我需要从命令行获取参数,并将它们用于fixture参数化(我需要将它们传递给fixture decorator(。pytest_adoption可以从cmd获取参数,但我只能在一些fixture内部提取它们,因为我需要为此请求fixture。问题是,我需要在fixture之外使用这些cmd参数。我不想参数化测试,我需要通过一些设置和拆卸来参数化夹具。有办法解决这个问题吗?
举个例子。我想测试/添加/发布Api方法。我想用几个用户测试它——例如,我想用user1、user2和user3请求这个api方法。所以我需要用一个用户列表来参数化我的fixture。我想通过CMD将这个用户列表传递到我的测试中。有点像这样:python-m pytest my_test.py--users=";user1 user2 user3";
conftest.py:
import pytest
from some_dir import add_a_new_post_as_some_user,
@pytest.fixture(params=users) # I NEED TO GET users FROM CMD
def add_post(request):
current_user = request.param
response = add_a_new_post_as_some_user(user)
yield current_user, response.status_code
delete_this_post(response.json()["some_post_id"])
test.py:
def test_add_post_as_some_user(add_post):
user, status_code = add_post
assert status_code == 200, f"Problems with user {user}"
在conftest.py
中,使用以下命令行参数:
def pytest_addoption(parser):
parser.addoption(
"--users", action="store", default=None, help="Users list"
)
然后使用pytest_generate_tests
函数对夹具进行参数化:
def pytest_generate_tests(metafunc):
if "add_post" in metafunc.fixturenames:
metafunc.parametrize("add_post", metafunc.config.getoption("--users").split(","))
@pytest.fixture()
def add_post(request):
current_user = request.param
response = add_a_new_post_as_some_user(user)
yield current_user, response.status_code
delete_this_post(response.json()["some_post_id"])
现在,使用fixtureadd_post
的测试将通过使用pytest --users user1,user2
运行时从命令行获取的用户进行参数化。