数据单元字典的Python单元测试

时间:2018-10-04 15:51:34

标签: python unit-testing

我有一个返回熊猫数据框字典的函数,我希望为此设计一个单元测试。

我知道如何对熊猫数据框进行相等性测试:

import pandas as pd
from pandas.util.testing import assert_frame_equal
import unittest

df1 = pd.DataFrame({'a':[1,2,3], 'b': [4,5,6], 'c': [7,8,9]}) 
df2 =pd.DataFrame(df1)

class DictEq(unittest.TestCase):
    def test_dict_eq(self):
        assert_frame_equal(df1, df2)

unittest.main()

但是,我似乎并不了解如何设计一个比较以下内容的测试:

dict1 = {'a': df1}
dict2 = {'a': df2}

我尝试了以下操作,但都失败了:

from nose.tools import assert_equal, assert_dict_equal  

class DictEq(unittest.TestCase):
    def test_dict_eq1(self):
        assert_equal(dict1, dict2)

    def test_dict_eq2(self):
        assert_dict_equal(dict1 , dict2)

    def test_dict_eq3(self):
        self.assertTrue(dict1 == dict2)

pandas.util.testing的assert_dict_equal函数也会失败。

2 个答案:

答案 0 :(得分:1)

尝试一下:

import pandas as pd

df1 = pd.DataFrame({'a':[1,2,3], 'b': [4,5,6], 'c': [7,8,9]})
df2 =pd.DataFrame(df1)

class DfWrap():
    def __init__(self, df):
        self.df = df
    def __eq__(self, df2):
        return all(self.df == df2)


dic1 = {'a': DfWrap(df1)}
dic2 = {'a': DfWrap(df2)}

print(dic1 == dic2)

这将输出True。只要将assert_dict_equal对象包装在dataframe中,它就也可以与DfWrap一起使用。

这是它起作用的原因:

您必须想象为了比较字典,python将(递归地)遍历每个键并在要比较的项目上调用__eq__(或==)。问题在于,当您在__eq__上调用==(或dataframe)时,它不会返回bool。相反,它返回另一个dataframe

import pandas as pd

df1 = pd.DataFrame({'a':[1,2,3], 'b': [4,5,6], 'c': [7,8,9]})
df2 =pd.DataFrame(df1)

df_compare = df1 == df2
print(type(df_compare))

此输出:

<class 'pandas.core.frame.DataFrame'>

因此,包装程序这样做是为了使执行df1 == df2会输出bool而不是dataframe

DfWrap(df1) == DfWrap(df2)

评估为True

HTH。

答案 1 :(得分:1)

我不确定,但是您可能会执行以下操作:

import unittest


class DictEq(unittest.TestCase):
    def test_dict_eq1(self):
        dict1 = {'a': df1}
        dict2 = {'a': df2}
        key1 = dict1.keys()
        key2 = dict2.keys()
        self.assertEqual(key1,key2) 
        for key, val in dict1.items():
            df1 = dict1[key]
            df2 = dict2[key]
            assert_frame_equal(df1, df2)