如何避免多次调用 pytest_generate_tests

问题描述 投票:0回答:1

我有一个测试套件,其中

  • 主类Regression拥有通用测试函数,这些函数由子类继承
  • 我在初始化期间使用 pytest_generate_tests 钩子动态参数化测试变量。
  • 测试初始化取决于正在运行的子类 例如。 Test_window 将进行 diff 初始化 Test_door 将进行 diff 初始化

我的问题是:

  • 对于这两个测试用例,我使用相同的参数
  • 因此 pytest_generate_tests 钩子被调用两次以生成相同的测试数据(我猜,在文档中找不到它!!!)
  • 是否有更好的方法来实现此场景,以避免调用 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
python testing pytest
1个回答
2
投票

正如评论中提到的,

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 )

如果你不想使用全局变量,你可以将其包装到一个类中,但在这种情况下这有点过分了。

© www.soinside.com 2019 - 2024. All rights reserved.