在多个数据集上运行相同测试

5 投票
2 回答
3017 浏览
提问于 2025-04-17 23:31

我开始使用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

撰写回答