unittest中numpy.ndarray与str断言相等却通过,是否符合预期?问题排查求助
unittest中numpy.ndarray与str断言相等却通过,是否符合预期?问题排查求助
大家好,我最近碰到一个特别费解的单元测试问题:本地跑unittest时断言返回了ok,但把代码部署到生产环境后,发现返回的值被方括号包裹着。排查后发现问题出在df.loc[].values这块——我本来期望拿到一个单独的str类型值,但实际得到的是numpy数组。
我基于一个示例稍作修改,成功复现了这个问题(第一次搞Python单元测试,内容有点长还请见谅):
最初的测试代码
import pandas as pd import numpy as np import unittest class myclass: def __init__(self): mux = pd.MultiIndex.from_arrays([ list('aaaabbbbbccddddd'), list('tuvwtuvwtuvwtuvw') ], names=['one','two']) temp_a = np.arange(len(mux)) str_a = [ str(a) for a in temp_a ] self.df = pd.DataFrame({'col': str_a}, mux) def get_aw(self): a = self.df.loc[('a','w')].values return a class TestAssert(unittest.TestCase): def test_assert(self): myclass_obj = myclass() result = myclass_obj.get_aw() expect = '3' print(type(result)) print(type(expect)) print(f'result:{result}') print(f'expect:{expect}') self.assertEqual(result,expect) if __name__ == '__main__': unittest.main(verbosity=2)
运行结果(我本来以为会FAIL的)
test_assert (__main__.TestAssert) ... test_code.py:18: PerformanceWarning: indexing past lexsort depth may impact performance. a = self.df.loc[('a','w')].values <class 'numpy.ndarray'> <class 'str'> result:[['3']] <-- 这里带方括号 expect:3 ok ---------------------------------------------------------------------- Ran 1 test in 0.002s OK
我真的搞不懂:明明result是二维numpy数组[['3']],expect是字符串'3',为什么self.assertEqual会判定两者相等,直接让测试通过了?
后来我修改了代码,用.values[0][0]拿到了真正的字符串,还加了类型断言来验证:
修改后的代码
import pandas as pd import numpy as np import unittest class myclass: def __init__(self): mux = pd.MultiIndex.from_arrays([ list('aaaabbbbbccddddd'), list('tuvwtuvwtuvwtuvw') ], names=['one','two']) temp_a = np.arange(len(mux)) str_a = [ str(a) for a in temp_a ] self.df = pd.DataFrame({'col': str_a}, mux) def get_aw(self): a = self.df.loc[('a','w')].values[0][0] # 这里做了修改 return a class TestAssert(unittest.TestCase): def test_assert(self): myclass_obj = myclass() result = myclass_obj.get_aw() expect = '3' print(type(result)) print(type(expect)) print(f'result:{result}') print(f'expect:{expect}') self.assertTrue(isinstance(result, str)) # 新增类型断言 self.assertEqual(result,expect) if __name__ == '__main__': unittest.main(verbosity=2)
修改后的运行结果
test_assert (__main__.TestAssert) ... test_code.py:18: PerformanceWarning: indexing past lexsort depth may impact performance. a = self.df.loc[('a','w')].values[0][0] <class 'str'> <class 'str'> result:3 expect:3 ok ---------------------------------------------------------------------- Ran 1 test in 0.002s OK
想请教大家:为什么第一次测试里,numpy数组和字符串用assertEquals比较会通过?这是unittest的预期行为吗?有没有什么需要注意的地方避免这种“假通过”的情况?
备注:内容来源于stack exchange,提问作者Felix
相关产品推荐
相关产品推荐

