【问题标题】:Run same test on multiple datasets在多个数据集上运行相同的测试
【发布时间】:2017-07-12 06:01:10
【问题描述】:

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

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

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

等等。

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

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

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

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

【问题讨论】:

    标签: python unit-testing nose pytest


    【解决方案1】:

    如你所说,使用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
    

    【讨论】:

      【解决方案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
      

      【讨论】:

      • assert data[foo] == bar
      • 你为什么不自己传递固定装置而不是字符串:[data1, data2]
      • @falsetru - 这是我的第一次尝试,但不幸的是它没有给出正确的行为 - 当你真正想要的是它的结果时,你会得到对夹具函数的引用。更糟糕的是,它的行为不再像一个夹具,它会破坏链式夹具、参数化夹具和具有模块范围的夹具。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      • 2019-04-20
      相关资源
      最近更新 更多