首页 > 解决方案 > 在包含多个数据框操作的较大函数中究竟要测试什么(unittest)

问题描述

也许这限制了我对单元测试的理解,但我对在一个有几个 pandas 数据框操作的方法中应该测试、修补什么等感到很困惑。那里的许多单元测试示例都集中在通常很小的类和方法上。对于更大的方法,我对典型的单元测试范式有点迷失。例如:

我的脚本.py

class Pivot:
    def prepare_dfs(self):
        df = pd.read_csv(self.file, sep=self.delimiter)
        g = df.groupby("Other_Location")
        df1 = g.apply(lambda x: x[x["PRN"] == "Free"].count())

        locations = ["O12-03-01", "O12-03-02"]
        cp = df1["PRN"]
        cp = cp[locations].tolist()
        data = [locations, cp]

        new_df = pd.DataFrame({"Other_Location": data[0], "Free": data[1]})

        return new_df, df

test_myscript.py

class TestPivot(unittest.TestCase):
    def setUp(self):
        args = parse_args(["-f", "test1", "-d", ","])
        self.pivot = Pivot(args)
        self.pivot.path = "Pivot/path"

    @mock.patch("myscript.cp[locations].tolist()", return_value=None)
    @mock.patch("myscript.pd.read_csv", return_value=df)
    def test_prepare_dfs_1(self, mock_read_csv, mock_cp):
        new_df, df = self.pivot.prepare_dfs()
# Here I get a bit lost 

例如在这里我尝试规避以下错误消息:

ModuleNotFoundError: No module named 'myscript.cp[locations]'; 'myscript' is not a package

我设法pd.read_csv在我的方法中正确地模拟了 ,但是在代码的更下方有groupy,applytolist。错误消息在以下行中抛出:

cp = cp[locations].tolist()

当您的方法涉及对数据框的多次操作时,进行单元测试的最佳方法是什么?是否总是建议重构代码(分成更小的块)?在这种情况下,我怎样才能正确模拟tolist ?

标签: pandasdataframepython-unittest

解决方案


推荐阅读