You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 03:18:14