在多个数据集上运行相同测试
我开始使用pytest来给一个可以分析不同类型数据集的软件添加单元测试。
我写了一组测试函数,想把它们应用到不同的数据集上。一个问题是,这些数据集都很大,所以我想这样做:
- 加载数据集1
- 运行测试
- 加载数据集2
- 运行测试
依此类推。
现在我能用一个固定的设置来使用一个数据集:
@pytest.fixture(scope="module")
def data():
return load_dataset1()
然后把data
传给每个测试函数。
我知道可以把params
这个关键词传给pytest.fixture
。但是,我该怎么实现依次加载不同的数据集(而不是一次性把所有数据集都加载到内存中)呢?
2 个回答
1
Falsetru的回答挺不错的,但因为这个问题比较复杂,我想分享一个稍微不同的解决方案,使用了@pytest.mark.parametrize
这个功能。
@pytest.fixture(scope="module")
def data1():
return get_dataset1()
@pytest.fixture(scope="module")
def data2():
return get_dataset2()
@pytest.mark.parametrize('data_fixture',
['data1','data2'])
def test_datafoo_is_bar(data_fixture, request):
data = request.getfixturevalue(data_fixture)
assert data[foo] == bar
4
使用你提到的 params
:
@pytest.fixture(scope='module', params=[load_dataset1, load_dataset2])
def data(request):
loader = request.param
dataset = loader()
return dataset
如果你想进行特定的清理工作,可以使用 fixture finalization
:
@pytest.fixture(scope='module', params=[load_dataset1, load_dataset2])
def data(request):
loader = request.param
dataset = loader()
def fin():
# finalize dataset-related resource
pass
request.addfinalizer(fin)
return dataset