如何在单元测试中使用 assert_frame_equal
how to use assert_frame_equal in unittest
单元测试包的新功能。
我正在尝试通过以下代码验证函数返回的 DataFrame。即使我将 assert_frame_equal
的输入硬编码为相等 (pd.DataFrame([0,0,0,0])
),单元测试仍然失败。有人愿意解释为什么会这样吗?
import unittest
from pandas.util.testing import assert_frame_equal
class TestSplitWeight(unittest.TestCase):
def test_allZero(self):
#splitWeight(pd.DataFrame([0,0,0,0]),10)
self.assert_frame_equal(pd.DataFrame([0,0,0,0]),pd.DataFrame([0,0,0,0]))
suite = unittest.TestLoader().loadTestsFromTestCase(TestSplitWeight)
unittest.TextTestRunner(verbosity=2).run(suite)
Error: AttributeError: 'TestSplitWeight' object has no attribute 'assert_frame_equal'
assert_frame_equal()
来自 pandas.util.testing
包,而不是来自 unittest.TestCase
class。替换:
self.assert_frame_equal(pd.DataFrame([0,0,0,0]),pd.DataFrame([0,0,0,0]))
与:
assert_frame_equal(pd.DataFrame([0,0,0,0]), pd.DataFrame([0,0,0,0]))
当你有 self.assert_frame_equal
时,它试图在 unittest.TestCase
实例上找到 assert_frame_equal
属性,并且由于没有 assert_frame_equal
属性或方法暴露在unittest.TestCase
class,引发了AttributeError
.
alecxe 答案不完整,您确实可以使用 pandas' assert_frame_equal()
和 unittest.TestCase
,使用 unittest.TestCase.addTypeEqualityFunc
import unittest
import pandas as pd
import pandas.testing as pd_testing
class TestSplitWeight(unittest.TestCase):
def assertDataframeEqual(self, a, b, msg):
try:
pd_testing.assert_frame_equal(a, b)
except AssertionError as e:
raise self.failureException(msg) from e
def setUp(self):
self.addTypeEqualityFunc(pd.DataFrame, self.assertDataframeEqual)
def test_allZero(self):
self.assertEqual(pd.DataFrame([0,0,0,0]), pd.DataFrame([0,0,0,0]))
如果导入这个,问题就解决了。
from pandas.testing import assert_frame_equal # <-- for testing dataframes
单元测试包的新功能。
我正在尝试通过以下代码验证函数返回的 DataFrame。即使我将 assert_frame_equal
的输入硬编码为相等 (pd.DataFrame([0,0,0,0])
),单元测试仍然失败。有人愿意解释为什么会这样吗?
import unittest
from pandas.util.testing import assert_frame_equal
class TestSplitWeight(unittest.TestCase):
def test_allZero(self):
#splitWeight(pd.DataFrame([0,0,0,0]),10)
self.assert_frame_equal(pd.DataFrame([0,0,0,0]),pd.DataFrame([0,0,0,0]))
suite = unittest.TestLoader().loadTestsFromTestCase(TestSplitWeight)
unittest.TextTestRunner(verbosity=2).run(suite)
Error: AttributeError: 'TestSplitWeight' object has no attribute 'assert_frame_equal'
assert_frame_equal()
来自 pandas.util.testing
包,而不是来自 unittest.TestCase
class。替换:
self.assert_frame_equal(pd.DataFrame([0,0,0,0]),pd.DataFrame([0,0,0,0]))
与:
assert_frame_equal(pd.DataFrame([0,0,0,0]), pd.DataFrame([0,0,0,0]))
当你有 self.assert_frame_equal
时,它试图在 unittest.TestCase
实例上找到 assert_frame_equal
属性,并且由于没有 assert_frame_equal
属性或方法暴露在unittest.TestCase
class,引发了AttributeError
.
alecxe 答案不完整,您确实可以使用 pandas' assert_frame_equal()
和 unittest.TestCase
,使用 unittest.TestCase.addTypeEqualityFunc
import unittest
import pandas as pd
import pandas.testing as pd_testing
class TestSplitWeight(unittest.TestCase):
def assertDataframeEqual(self, a, b, msg):
try:
pd_testing.assert_frame_equal(a, b)
except AssertionError as e:
raise self.failureException(msg) from e
def setUp(self):
self.addTypeEqualityFunc(pd.DataFrame, self.assertDataframeEqual)
def test_allZero(self):
self.assertEqual(pd.DataFrame([0,0,0,0]), pd.DataFrame([0,0,0,0]))
如果导入这个,问题就解决了。
from pandas.testing import assert_frame_equal # <-- for testing dataframes