使用pytest在类中的各个模块之间重用相同的数据框架



我试图在pytest中重用相同的数据框架。我已经在init中初始化了它方法,但我想将其更改为pytest fixture,然后将其传递给每个方法。我正在努力使用pytest来应用这个。

import pytest
import utils
import numpy as np
import pandas as pd
from datetime import datetime
class TestGetDatesCorrespondingToReference:
# @pytest.fixture(
# scope="module",
# params=df_input)
def __init__(self) -> None:
self.df_input = pd.DataFrame({
'table_id' : ['all_legs_predictions_20220914_20220607',
'all_legs_predictions_20210914_20210607'] ,
'prefix' : [datetime(2022, 9, 14, 0, 0),
datetime(2021, 9, 14, 0, 0)] ,
'suffix' : [datetime(2022, 6, 7, 0, 0), 
datetime(2021, 6, 7, 0, 0)]
})

def test_get_dates_corresponding_to_reference(self):
actual = self.df_input
.pipe(utils.get_dates_corresponding_to_reference,"20221105" )

expected = pd.DataFrame({
'table_id' : ['all_legs_predictions_20220914_20220607'] ,
'prefix' : [datetime(2022, 9, 14, 0, 0)],
'suffix' : [datetime(2022, 6, 7, 0, 0)] })
pd.testing.assert_frame_equal(actual, expected)

你应该用@pytest.fixture装饰器定义一个新函数。

fixture通常定义在文件名conftest.py中。但是,您也可以在测试文件中定义它。

根据你的例子,我相信你想达到这样的效果:

class TestGetDatesCorrespondingToReference:
def test_get_dates_corresponding_to_reference(self, some_dataframe):
actual = some_dataframe 
.pipe(utils.get_dates_corresponding_to_reference, "20221105")
expected = pd.DataFrame({
'table_id': ['all_legs_predictions_20220914_20220607'],
'prefix': [datetime(2022, 9, 14, 0, 0)],
'suffix': [datetime(2022, 6, 7, 0, 0)]})
pd.testing.assert_frame_equal(actual, expected)

@pytest.fixture(scope="module")
def some_dataframe():
return pd.DataFrame({
'table_id': ['all_legs_predictions_20220914_20220607',
'all_legs_predictions_20210914_20210607'],
'prefix': [datetime(2022, 9, 14, 0, 0),
datetime(2021, 9, 14, 0, 0)],
'suffix': [datetime(2022, 6, 7, 0, 0),
datetime(2021, 6, 7, 0, 0)]
})

请注意,您使用fixture name作为测试方法的参数,然后它将fixture的输出存储在该变量中。

还要确保需要这个fixture范围。module意味着您将计算每个模块一次该夹具的输出。因此,如果您在模块的一个测试中更改输出数据帧,它将在该模块的所有测试中保持不变。

如果你想在每次测试中重新计算夹具值,使用function范围。

您可以在这里了解更多关于fixture及其作用域的信息。

最新更新