使用addoption动态参数化测试夹具

2024-10-03 21:25:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个测试套件,可以很好地跨两个独立的数据库(SQLite和Postgres)测试代码。我想扩展它,在升级的数据库中运行完全相同的测试套件(测试数据库模式升级是否按预期工作)

要运行的升级是在pytest之外,根据来自Git的信息,从shell脚本确定的,Git确定有哪些架构版本,与可用的升级脚本进行比较,然后应该调用pytest。我想使用类似于:

pytest --dbupgrade=v1 --dbupgrade=v2 tests/test-upgrades.py

我在conftest.py中有以下内容:

def pytest_addoption(parser):
  parser.addoption(
    "--dbupgrade",
    action="append",
    default=[],
    help="list of base schema versions to upgrade"
  )

我在其他测试中使用了参数化夹具。我已经编写并使用了所有测试用例,我希望避免重写它们以使其自身参数化,正如我在使用pytest_generate_tests搜索解决方案时所看到的那样。因此,我可以轻松地硬编码:

@pytest.fixture(params=['v1', 'v2'])
def myfixture(request):
  ...

我想:

@pytest.fixture(params=pytest.config.option.get('dbupgrade')
def myfixture(request):
  ...

但是pytest_addoption的结果可以在pytestconfigfixture中获得,也可以在附加到各种对象的config属性中获得,我无法在fixture的声明中找到它——但我相信到那时它是可用的

更新(解决方法)

我不喜欢它,但我正在从环境变量中提取必要的信息,这很好。比如:

# for this case I prefer this to fail noisily if it fails
schema_versions = os.environ['SCHEMA_VERSIONS'].split(',')

...

@pytest.fixture(params=schema_versions)
def myfixture(request):
  ...

Tags: git脚本信息数据库套件pytestrequestschema