web-dev-qa-db-ja.com

unittestでassert_frame_equalを使用する方法

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)
_
エラー:AttributeError: 'TestSplitWeight'オブジェクトに属性がありません 'assert_frame_equal'
11
Lisa

assert_frame_equal()は、pandas.util.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を発生させました。

9
alecxe

alecxeの回答は不完全です。実際、パンダの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]))
9
Léo Germond