我有一个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接口,将来可能会将其替换为其他库。
是的,此代码实际上是一个集成测试,可能不是一件坏事。
即使使用熊猫是一个固定的设计决策,仍然有很多充分的理由要从外部库中进行抽象测试是其中之一。从外部库进行抽象可以独立于库测试业务逻辑。在这种情况下,从熊猫中提取将对上述内容进行单元测试。它将测试与库的交互。
要应用此模式,建议您看看ports and adapters architecture pattern
但是,确实确实意味着您不再在测试熊猫提供的功能。如果这仍然是您的特定意图,那么集成测试并不是一个不错的解决方案。