我的单元测试之一是在读取日志文件后检查是否正确设置了范围,我只想测试var == range(0,10)。但是,在Python3中,range(0,1) == range(0,1)的计算结果为False。
有没有一种简单的方法来测试Python3中范围的等价性?
发布于 2011-10-12 21:28:55
在Python3中,range返回类型为range的迭代器。当且仅当两个range相同(即共享相同的id)时,它们是相等的。要测试其内容的相等性,请将range转换为list
list(range(0,1)) == list(range(0,1))这在短范围内工作得很好。对于非常长的距离,Charles G Waldman's solution更好。
发布于 2011-10-12 22:39:24
第一种建议的解决方案-使用"list“将范围转换为列表-是无效的,因为它首先将范围对象转换为列表(如果范围很大,可能会消耗大量内存),然后比较每个元素。例如,考虑a= range(1000000),"range“对象本身很小,但如果你强迫它成为一个列表,它就会变得很大。然后你必须比较一百万个元素。
答案(2)的效率更低,因为assertItemsEqual不仅会实例化列表,还会在进行元素级比较之前对列表进行排序。
相反,由于您知道对象是范围,因此当它们的步幅、起始值和结束值相等时,它们是相等的。例如。
ranges_equal = len(a)==len(b) and (len(a)==0 or a[0]==b[0] and a[-1]==b[-1])
发布于 2011-10-12 21:28:24
尝试assertItemsEqual,(在docs中):
class MyTestCase(unittest.TestCase):
def test_mytest(self):
a = (0,1,2,3,4)
self.assertItemsEqual(a, range(0,4))https://stackoverflow.com/questions/7740796
复制相似问题