1

我有一个夹具,它返回一个pd.DataFrame. 我需要将各个列 ( pd.Series) 插入到单元测试中,并且我想使用parametrize.

这是一个没有parametrize. 数据框的每一列都将单独测试。但是,我想我可以摆脱input_series固定装置,不是吗?使用此代码,只会执行 1 个测试。但是,我正在寻找 3 个测试,同时摆脱 for 循环。

import numpy as np
import pandas as pd
import pytest


@pytest.fixture(scope="module")
def input_df():
    return pd.DataFrame(
        data=np.random.randint(1, 10, (5, 3)), columns=["col1", "col2", "col3"]
    )


@pytest.fixture(scope="module")
def input_series(input_df):
    return [input_df[series] for series in input_df.columns]


def test_individual_column(input_series):
    for series in input_series:
        assert len(series) == 5

我基本上在寻找这样的东西:

@pytest.mark.parametrize("series", individual_series_from_input_df)
def test_individual_column(series):
    assert len(series) == 5
4

1 回答 1

0

如果您尝试从基于另一个夹具的夹具生成多个数据,您将收到yield_fixture function has more than one 'yield'错误消息。

一种解决方案是使用夹具参数化。在您的情况下,您希望按列进行迭代,因此 Dataframe 列是参数。

# test data
input_df = pd.DataFrame(
    data=np.random.randint(1, 10, (5, 3)), columns=["col1", "col2", "col3"]
)


@pytest.fixture(
    scope="module",
    params=input_df.columns,
)
def input_series(request):
    series = request.param
    yield input_df[series]


def test_individual_column(input_series):
    assert len(input_series) == 5

这将按测试数据框的列生成一个测试。

pytest test_pandas.py
# test_pandas.py::test_individual_column[col1] PASSED
# test_pandas.py::test_individual_column[col2] PASSED
# test_pandas.py::test_individual_column[col3] PASSED
于 2022-01-07T21:15:50.177 回答