使用 pandas 进行单元测试

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

总体而言,我对单元测试很陌生,尤其是 Python 的

unittest

当尝试验证 pandas 数据框时

df
,我通常:

  • 检查
    df
    是否为空(使用此处详述的方法之一)。
  • 检查
    df
    是否包含预期的列。

我想标准化我运行这些测试的方式。

pandas 文档列出了可用的断言函数

assert_frame_equal
assert_series_equal
assert_index_equal
assert_extention_array_equal
),但据我了解,我无法使用它们来运行上述测试。

我想出了以下课程:

import pandas as pd
import unittest
class DataFrameTestCase(unittest.TestCase):

    def test_if_dataframe_is_empty(self,df):
        self.assertTrue(len(df) > 0)

    def test_if_dataframe_contains_required_columns(self,df,columns):
        self.assertTrue(set(df.columns.to_list()) == set(columns))

以下片段...

data = [[412256, 142193, 4], [644402, 5208768 ,25]]
columns = ['easting', 'northing','elevation']
df = pd.DataFrame(data=data, columns=columns)
dataframetestcase = DataFrameTestCase()
dataframetestcase.test_if_dataframe_is_empty(df)
dataframetestcase.test_if_dataframe_contains_required_columns(df, columns)

...不返回任何错误。

另一方面,传递空数据帧

df
或不同的
columns
列表会引发
AssertionError: False is not true
错误。

这是继续的方法还是有一组内置的

pandas
unittest
断言函数可以更好地处理这个问题?

pandas dataframe unit-testing python-unittest is-empty
1个回答
0
投票

我将尝试向您展示单元测试的标准用法(至少在我看来)以实现您的目标。

以下是您的代码,进行了一些更改。脚本名称是:

pandas_test_routine.py
:

import pandas as pd
import unittest

data = [[412256, 142193, 4], [644402, 5208768, 25]]
columns = ['easting', 'northing', 'elevation']

# this is a not desired data because is empty
data_empty = []

class DataFrameTestCase(unittest.TestCase):

    # the method setUp() is executed before any test
    def setUp(self):
        self.data = data
        self.columns = columns
        self.sut = pd.DataFrame(data=self.data, columns=self.columns)

    def test_if_dataframe_IS_NOT_empty(self):
        self.assertFalse(self.sut.empty)

    def test_if_dataframe_CONTAINS_required_columns(self):
        self.assertTrue(set(self.sut.columns.to_list()) == set(self.columns))

    def test_if_dataframe_IS_empty(self):
        self.data = data_empty
        self.sut = pd.DataFrame(data=self.data, columns=self.columns)
        # We can set a custumize message error by fail()
        self.failIf(self.sut.empty, "data frame is empty")

if __name__ == '__main__':
    unittest.main()

要执行您可以执行的测试(在终端中):

/path/to/interpreter/python /path/to/script/pandas_test_routine.py

虽然第一个和第二个测试成功执行,但第三个测试的执行停止并出现以下错误:

AssertionError: True is not false : data frame is empty

请注意,指令

failIf()
已弃用,但我认为它适合您的需求。

方法
setUp()

setUp()
的方法
TestCase
很有用:它在每个测试执行之前执行。
在您的情况下
setUp()
使用正确的数据创建对象
sut

注意:
sut
代表被测系统(在您的例子中是类
DataFrame
的实例)。

方法
unittest.main()

代码片段:

if __name__ == '__main__':
    unittest.main()

执行类

DataFrameTestCase
的所有方法,名称以
test

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