gpt4 book ai didi

python - pytest:使用 fixture 和 pandas dataframe 进行参数化

转载 作者:行者123 更新时间:2023-12-05 04:38:23 26 4
gpt4 key购买 nike

我有一个固定装置,它返回一个 pd.DataFrame。我需要将各个列 (pd.Series) 插入到单元测试中,我想使用 parametrize

这是一个没有parametrize 的玩具示例。数据框的每一列都将单独测试。但是,我想我可以去掉 input_series fixture ,不是吗?使用此代码,只会执行 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

最佳答案

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

一种解决方案是使用 fixture parametrization .在您的情况下,您希望按列进行迭代,因此 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

这将按测试 Dataframe 的列生成一个测试。

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

关于python - pytest:使用 fixture 和 pandas dataframe 进行参数化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70622976/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com