如何在unittest中使用assert_frame_equal

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

单元测试包的新功能。 我试图通过以下代码验证函数返回的 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)
错误:AttributeError:“TestSplitWeight”对象没有属性“assert_frame_equal”
python pandas unit-testing python-unittest
3个回答
25
投票

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]))

21
投票

assert_frame_equal()
来自
pandas.testing
包,而不是来自
unittest.TestCase
类。替换:

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
时,它会尝试在
assert_frame_equal
实例上查找
unittest.TestCase
属性,并且,由于
assert_frame_equal
类上没有公开
unittest.TestCase
属性或方法,因此它引发了
AttributeError


-1
投票

如果导入这个,问题就消失了。

from pandas.testing import assert_frame_equal  # <-- for testing dataframes
© www.soinside.com 2019 - 2024. All rights reserved.