pytest-如何将pytest addoption值传递给pytest参数化?

时间:2020-09-27 17:58:46

标签: python pytest

我必须在要存储在pytest addoption中的pytest命令中传递一个参数。我想在pytest parametrize函数中使用这些值。

命令:

pytest --range-from 3 --range-to 5 test.py

conftest.py

def pytest_addoption(parser):
    parser.addoption("--range-from", action="store", default="default name")
    parser.addoption("--range-to", action="store", default="default name")

test.py

@pytest.mark.parametrize('migration_id', migration_list[range-from:range-to])
def test_sync_with_migration_list(migration_id):
    migration_instance = migration.parallel(migration_id=migration_id)
    migration_instance.perform_sync_only()

我想在range-from中使用range-toparametrize的值。

我无法使用这些值。请提出如何做到这一点。

2 个答案:

答案 0 :(得分:1)

您无法直接从parametrize访问这些选项,因为它们在加载时不可用。您可以在运行时在pytest_generate_tests中配置参数化,在此您可以从config参数访问metafunc

test.py

@pytest.hookimpl
def pytest_generate_tests(metafunc):
    if "migration_id" in metafunc.fixturenames:
        # any error handling omitted
        range_from = int(metafunc.config.getoption("--range-from"))
        range_to = int(metafunc.config.getoption("--range-to"))
        metafunc.parametrize("migration_id",
                             migration_list[range_from:range_to])


def test_sync_with_migration_list(migration_id):
    migration_instance = migration.parallel(migration_id=migration_id)
    migration_instance.perform_sync_only()

答案 1 :(得分:1)

一种简单的方法是将命令行参数分配给环境变量,然后在任何需要的地方使用。我不确定您要以哪种方式使用变量,所以在这里我将简单的print语句放入测试中。

conftest.py

def pytest_addoption(parser):
    parser.addoption("--range-from", action="store", default="default name") #Let's say value is :5
    parser.addoption("--range-to", action="store", default="default name") #Lets's say value is 7

def pytest_configure(config):
    os.environ["range_from"]=config.getoption("range-from") 
    os.environ["range_to"]=config.getoption("range-to")

test.py:

@pytest.mark.parametrize('migration_id', [os.getenv("range_from"),os.getenv("range_to")])
def test_sync_with_migration_list(migration_id):
    print(migration_id)

Output :
5
7

希望这会有所帮助!