如何在单元测试中使用 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