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

时间:2014-03-23 13:05:53

标签: python unit-testing nose pytest

我开始使用pytest将单元测试添加到可以分析不同类型数据集的软件中。

我写了一组测试函数,我想将它们应用于不同的数据集。一个复杂因素是数据集非常大,所以我想这样做:

  • 加载数据集1
  • 运行测试
  • 加载数据集2
  • 运行测试

等等。

现在我可以使用一个灯具来使用一个数据集:

@pytest.fixture(scope="module")
def data():
    return load_dataset1()

然后将data传递给每个测试函数。

我知道我可以将params关键字传递给pytest.fixture。但是,如何实现不同数据集的顺序加载(不同时将所有数据集加载到RAM中)?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

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