pytest参数化方法设置

pytest parameterized method setup

我有一个参数化的pytest测试方法,test_1。在这个测试方法的所有参数化案例 运行 之前,我想调用另一个方法 tmp_db_uri,它创建一个临时数据库并生成数据库的 uri。我只想调用那个生成器一次,这样我就可以为所有测试用例使用同一个临时数据库。我认为如果我从固定装置 (db_uri) 调用它,那会成功,因为我认为每次测试都会创建一次固定装置,但似乎在这个测试中每个案例都会调用固定装置,并且每次都会创建一个新的临时数据库。

正确的做法是什么?有没有办法 运行 在所有案例 运行 之前设置此方法,只使用一个 tmp_db_uri?我不希望整个测试模块都挂起临时数据库 - 只是在这个测试期间(清理由 tmp_db_uri 上的上下文管理器处理)。

我目前有类似的东西:

@pytest.fixture
def db_uri(tmp_db_uri):
    return tmp_db_uri

@pytest.mark.parameterize(("item1","item2"), ((1, "a"), (2, "b")))
def test_1(item1, item2, db_uri):
    print("do something")

您可以创建一个模块级固定装置,以便它只为整个测试模块创建一次,或者您可以创建一个全局变量和 return 数据库(如果已经创建)或创建其他方式。

@pytest.fixture(scope="module")
def db_uri(tmp_db_uri):
    return tmp_db_uri

TMP_DB = None
@pytest.fixture
def db_uri(tmp_db_uri):
    global TMP_DB
    if not TMP_DB:
        # do your stuff to create tmp_db 
        TMP_DB = tmp_db_uri
    return TMP_DB