总体而言,我对单元测试很陌生,尤其是 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_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
开头