python - 如何避免多次调用 pytest_generate_tests
问题描述
我有一个测试套件,其中
- 主类 Regression 包含通用测试函数,由子类继承
- 我在初始化期间使用 pytest_generate_tests 钩子动态参数化测试变量。
- 测试初始化取决于正在运行的子类,例如。Test_window 将进行差异初始化 Test_door 将进行差异初始化
我的问题是:
- 对于两个测试用例,我使用相同的参数
- 所以 pytest_generate_tests 钩子被调用 2 次以生成相同的测试数据(我猜,在文档中找不到它!!!)
- 有没有更好的方法来实现这个场景来避免调用 pytest_generate_tests 2 次的开销。
父类:
class Regression:
def test_work(self, data):
test_func1_call_using data(data)
def test_agg(self, data):
test_func2_call_using data(data)
测试类 1 继承回归:
@pytest.mark.usefixtures('generic_test_setup')
class Test_window(Regression):
dummy_var=0
测试类 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 )
如果您不想使用全局变量,则可以将其包装到一个类中,但在这种情况下这将是矫枉过正。
推荐阅读
- c - 合并排序算法无法正常运行
- mysql - 如何选择仅将条目与每个用户的最新日期进行比较的 10 个最高分数?
- jasper-reports - MDX 查询结果与 Jasper 结果不同
- c# - 如何自定义 XAML 导航视图窗格的外观
- java - Java:从列表中删除以其他列表中的元素开头的元素
- java - 无法启动 Gradle 守护进程
- api - 如何在 Spring Boot 的 post 调用中使用 @RequestBody 和 @Requestparam
- python - 如何通过单击下载按钮抓取文件下载 - python
- google-cloud-platform - 使用 Terraform 更新正在运行的 Dataflow 管道会导致“已经存在”错误
- javascript - 通过ajax上传图像时未定义的索引“文件”