如何避免多次调用 pytest_generate_tests
How to avoid calling pytest_generate_tests multiple times
我有一个测试套件,其中
- Master class Regression holds generic test functions, 继承自child classes
- 我在初始化期间使用 pytest_generate_tests 挂钩动态参数化测试变量。
- 测试初始化依赖于 child class 正在 运行
例如。 Test_window 将进行差异初始化
Test_door 将有差异初始化
我的问题是:
- 对于两个测试用例,我使用相同的参数
- 因此 pytest_generate_tests 挂钩被调用 2 次以生成相同的测试数据(我想,在文档中找不到它!!!)
- 是否有更好的方法来实现此方案以避免调用 pytest_generate_tests 2 次的开销。
Parent Class :
class Regression:
def test_work(self, data):
test_func1_call_using data(data)
def test_agg(self, data):
test_func2_call_using data(data)
测试Class 1 继承回归:
@pytest.mark.usefixtures('generic_test_setup')
class Test_window(Regression):
dummy_var=0
测试Class 2继承回归:
@pytest.mark.usefixtures('generic_test_setup')
class Test_door(Regression):
dummy_var=0
conftest.py :
@pytest.fixture(scope="class")
def generic_test_setup(request, env):
// do setup
def pytest_generate_tests(metafunc):
class_name = metafunc.cls.__name__.split('_')[1]
logging.info(f"Collection Phase :: Initializing test_data for {class_name} !!!")
// Initialize the test data based on the calling class
test_data = //generated dictionary value with ids and test data
id_entity = [d['entity'] for d in test_data]
if "data" in metafunc.fixturenames:
metafunc.parametrize("data", test_data, ids=id_entity )
@pytest.fixture
def data(request):
return request.param
如评论中所述,pytest_generate_tests
的行为符合预期,因为每次测试都会调用它。如果你想缓存你的测试数据,你可以在钩子之外添加一个缓存,例如类似于:
testdata_cache = {}
def pytest_generate_tests(metafunc):
if "data" in metafunc.fixturenames:
class_name = metafunc.cls.__name__.split('_')[1]
if class_name not in testdata_cache:
// Initialize the test data based on the calling class
testdata_cache[class_name] = //generated dictionary value with ids and test data
test_data = testdata_cache[class_name]
id_entity = [d['entity'] for d in test_data]
metafunc.parametrize("data", test_data, ids=id_entity )
如果您不想使用全局变量,您可以将它包装成一个 class,但在这种情况下这就太过分了。
我有一个测试套件,其中
- Master class Regression holds generic test functions, 继承自child classes
- 我在初始化期间使用 pytest_generate_tests 挂钩动态参数化测试变量。
- 测试初始化依赖于 child class 正在 运行 例如。 Test_window 将进行差异初始化 Test_door 将有差异初始化
我的问题是:
- 对于两个测试用例,我使用相同的参数
- 因此 pytest_generate_tests 挂钩被调用 2 次以生成相同的测试数据(我想,在文档中找不到它!!!)
- 是否有更好的方法来实现此方案以避免调用 pytest_generate_tests 2 次的开销。
Parent Class :
class Regression:
def test_work(self, data):
test_func1_call_using data(data)
def test_agg(self, data):
test_func2_call_using data(data)
测试Class 1 继承回归:
@pytest.mark.usefixtures('generic_test_setup')
class Test_window(Regression):
dummy_var=0
测试Class 2继承回归:
@pytest.mark.usefixtures('generic_test_setup')
class Test_door(Regression):
dummy_var=0
conftest.py :
@pytest.fixture(scope="class")
def generic_test_setup(request, env):
// do setup
def pytest_generate_tests(metafunc):
class_name = metafunc.cls.__name__.split('_')[1]
logging.info(f"Collection Phase :: Initializing test_data for {class_name} !!!")
// Initialize the test data based on the calling class
test_data = //generated dictionary value with ids and test data
id_entity = [d['entity'] for d in test_data]
if "data" in metafunc.fixturenames:
metafunc.parametrize("data", test_data, ids=id_entity )
@pytest.fixture
def data(request):
return request.param
如评论中所述,pytest_generate_tests
的行为符合预期,因为每次测试都会调用它。如果你想缓存你的测试数据,你可以在钩子之外添加一个缓存,例如类似于:
testdata_cache = {}
def pytest_generate_tests(metafunc):
if "data" in metafunc.fixturenames:
class_name = metafunc.cls.__name__.split('_')[1]
if class_name not in testdata_cache:
// Initialize the test data based on the calling class
testdata_cache[class_name] = //generated dictionary value with ids and test data
test_data = testdata_cache[class_name]
id_entity = [d['entity'] for d in test_data]
metafunc.parametrize("data", test_data, ids=id_entity )
如果您不想使用全局变量,您可以将它包装成一个 class,但在这种情况下这就太过分了。