Python Unittest编写两数之和测试用例如何忽略返回数组顺序
两数之和单元测试忽略顺序校验解决方案
问题原因
你遇到的报错是因为Python的unittest.assertEqual对比列表时是顺序敏感的,你的功能代码中先对输入数组做了升序排序,因此返回的结果固定为[-3, 6],和你预期的[6, -3]顺序不一致,才触发断言失败。
推荐的忽略顺序校验方法
方法1:使用自带的assertCountEqual(最推荐)
Python 3.2及以上版本的unittest内置了assertCountEqual方法,专门用于对比两个可迭代对象的元素及元素出现次数是否一致,完全忽略顺序,报错信息也会清晰提示多/缺的元素:
import unittest from problems import two_number_sum class TestTwoNumberSum(unittest.TestCase): def test_two_number_sum(self): result = two_number_sum.twoNumberSum([4, 6, 1, -3], 3) # 直接忽略顺序校验元素是否匹配 self.assertCountEqual(result, [6, -3])
方法2:对结果和预期共同排序后对比
如果需要兼容旧版本Python,可以把结果和预期值都做排序后再用assertEqual对比:
self.assertEqual(sorted(result), sorted([6, -3]))
方法3:优化你当前的校验逻辑
你现在写的校验逻辑存在漏洞:self.assertTrue(len(result))只能校验返回非空,无法拦截返回长度不符合要求的情况(比如返回了3个元素),可以优化为:
self.assertEqual(len(result), 2) # 明确要求返回两个元素 self.assertIn(6, result) self.assertIn(-3, result)
自定义错误提示
所有unittest的断言方法都支持msg参数,可以自定义校验失败时抛出的提示信息:
self.assertCountEqual( result, [6, -3], msg=f"两数之和校验失败,输入数组[4,6,1,-3]、目标值3,预期返回包含6和-3,实际返回{result}" )
校验不通过时会优先输出你自定义的提示,更便于定位问题。
内容的提问来源于stack exchange,提问作者Adilson Jurado
相关产品推荐
相关产品推荐

