如何选择或取消选择使用特定pytest fixture的测试用例?
自动标记依赖特定fixture的测试并筛选
要实现不用手动标记,就能通过类似pytest -m 'not uses_foo'的命令筛选依赖特定fixture的测试,可以通过pytest的钩子函数自动识别测试的fixture依赖并添加标记,具体实现如下:
步骤1:在conftest.py中注册自定义标记
首先注册uses_<fixture_name>格式的标记,避免pytest运行时抛出未知标记的警告:
def pytest_configure(config): # 注册针对foo fixture的标记,若需要支持多个fixture可扩展逻辑 config.addinivalue_line( "markers", "uses_foo: 标记所有直接或间接依赖foo fixture的测试" )
步骤2:自动识别依赖并添加标记
在conftest.py中添加pytest_itemcollected钩子,递归分析测试项的所有fixture依赖,给依赖目标fixture的测试添加对应标记:
def _get_all_fixture_names(item, fixturemanager): """递归获取测试项直接或间接依赖的所有fixture名称""" fixture_names = set(item.fixturenames) for name in list(fixture_names): fixturedef = fixturemanager.getfixturedefs(name, item.cls) if fixturedef: # 获取当前fixture依赖的其他fixture fixture_deps = fixturedef[0].argnames fixture_names.update(fixture_deps) # 递归处理依赖的fixture for dep in fixture_deps: fixture_names.update(_get_all_fixture_names(item, fixturemanager)) return fixture_names def pytest_itemcollected(item): # 目标fixture名称,这里以foo为例 target_fixture = "foo" all_fixtures = _get_all_fixture_names(item, item.session._fixturemanager) if target_fixture in all_fixtures: # 给测试添加uses_foo标记 item.add_marker("uses_foo")
使用方法
- 排除所有依赖
foofixture的测试:pytest -m 'not uses_foo' - 只运行所有依赖
foofixture的测试:pytest -m 'uses_foo'
扩展说明
如果需要支持多个fixture,只需修改pytest_configure注册对应的标记,同时在pytest_itemcollected中遍历多个目标fixture即可,比如:
def pytest_configure(config): target_fixtures = ["foo", "bar", "baz"] for fixture in target_fixtures: config.addinivalue_line( "markers", f"uses_{fixture}: 标记所有直接或间接依赖{fixture} fixture的测试" ) def pytest_itemcollected(item): target_fixtures = ["foo", "bar", "baz"] all_fixtures = _get_all_fixture_names(item, item.session._fixturemanager) for fixture in target_fixtures: if fixture in all_fixtures: item.add_marker(f"uses_{fixture}")
这样就无需手动标记任何测试,不管fixture是直接还是间接被依赖,都会被自动识别并添加标记,完全满足通过标记筛选测试的需求。
内容的提问来源于stack exchange,提问作者shadowtalker
相关产品推荐
相关产品推荐

