如何使用Pandas和pytest进行TDD?

问题描述 投票:1回答:1

我有一个Python脚本,该脚本始终通过在一系列DataFrame操作(drop,groupby,sum等)中使用Pandas来合并报告。假设我从一个简单的函数开始,该函数清除所有没有值的列,它具有DataFrame作为输入和输出:

# cei.py
def clean_table_cols(source_df: pd.DataFrame) -> pd.DataFrame:
   # IMPLEMENTATION
   # eg. return source_df.dropna(axis="columns", how="all")

我想在测试中验证此函数实际上删除了所有值均为空的所有列。因此,我安排了一个测试输入和输出,并使用pandas.testing中的assert_frame_equal函数进行测试:

# test_cei.py
import pandas as pd
def test_clean_table_cols() -> None:
    df = pd.DataFrame(
        {
            "full_valued": [1, 2, 3],
            "all_missing1": [None, None, None],
            "some_missing": [None, 2, 3],
            "all_missing2": [None, None, None],
        }
    )
    expected = pd.DataFrame({"full_valued": [1, 2, 3], "some_missing": [None, 2, 3]})
    result = cei.clean_table_cols(df)
    pd.testing.assert_frame_equal(result, expected)

我的问题是,从概念上讲,它是单元测试还是e2e /集成测试,因为我没有嘲笑熊猫的实现。但是,如果我模拟DataFrame,则不会测试代码的功能。建议遵循TDD最佳做法测试此方法的方法是什么?

注:在此项目中使用Pandas是一项设计决定,因此,无意抽象Pandas接口,将来可能会将其替换为其他库。

python python-3.x pandas tdd pytest
1个回答
0
投票

是的,此代码实际上是一个集成测试,可能不是一件坏事。

即使使用熊猫是一个固定的设计决策,仍然有很多充分的理由要从外部库中进行抽象测试是其中之一。从外部库进行抽象可以独立于库测试业务逻辑。在这种情况下,从熊猫中提取将对上述内容进行单元测试。它将测试与库的交互

要应用此模式,建议您看看ports and adapters architecture pattern

但是,确实确实意味着您不再在测试熊猫提供的功能。如果这仍然是您的特定意图,那么集成测试并不是一个不错的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.