python Pytest在被多个测试函数调用时会缓存fixture数据吗?

des4xlb0  于 2023-06-28  发布在  Python
关注(0)|答案(2)|浏览(100)

我有需要测试数据的单元测试。此测试数据是下载的,文件大小相当大。

@pytest.fixture
def large_data_file():
    large_data = download_some_data('some_token')
    return large_data

# Perform tests with input data
def test_foo(large_data_file): pass
def test_bar(large_data_file): pass
def test_baz(large_data_file): pass
# ... and so on

我不想多次下载此数据。它应该只下载一次,并传递给所有需要它的测试。pytest是只调用一次large_data_file,然后将其用于使用该fixture的每个单元测试,还是每次都调用large_data_file
unittest中,只需在setUpClass方法中下载一次所有测试的数据。
我不希望在py脚本中只有一个全局large_data_file = download_some_data('some_token')。我想知道如何用Pytest处理这个用例。

epggiuax

epggiuax1#

pytest是只调用一次large_data_file,然后将其用于使用该fixture的每个单元测试,还是每次都调用large_data_file
这取决于夹具范围。默认范围是function,因此在示例中large_data_file将被计算三次。如果你扩大范围,例如。

@pytest.fixture(scope="session")
def large_data_file():
    ...

每个测试会话将评估一次夹具,并且结果将被缓存并在所有相关测试中重复使用。查看范围部分:在pytest文档中跨类、模块、包或会话共享fixture以了解更多细节。

2w3rbyxf

2w3rbyxf2#

为了详细说明@hoefling的答案,这里有一个实际的例子:

# ran only once
@pytest.fixture(scope="session")
def good_password():
    pwd = "Open, Sesame!"
    hpw = bcrypt.hashpw(pw.encode(), bcrypt.gensalt()).decode()  # slow
    return pwd, hpw

# ran for each test
@pytest.fixture
def good_user(db, good_password):
    name = "Ali Baba"
    pwd, hpw = good_password
    db.insert_user(username=name, password_hash=hpw)  # fast
    return name, pwd

def test_login(good_user, client):
    name, pwd = good_user
    r = client.post("/login", form={"username": name, "password": pwd})
    r.raise_for_status()

def test_smth_else(good_user, client):
    ...

相关问题