我的一个单元测试会在读取日志文件后检查是否正确设置了范围,我只想测试var == range(0,10)
。但是,range(0,1) == range(0,1)
在Python 3中评估为False
。
有没有直接的方法来测试Python 3中的范围等价?
答案 0 :(得分:10)
在Python3中,range
返回类型range
的可迭代。当且仅当两个range
相同时(即共享相同的id
),两个range
是相等的。)为了测试其内容的相等性,将list
转换为list(range(0,1)) == list(range(0,1))
:
{{1}}
这适用于短距离。对于很长的范围,Charles G Waldman's solution更好。
答案 1 :(得分:6)
第一个提出的解决方案 - 使用“list”将范围转换为列表 - 是无效的,因为它首先将范围对象转换为列表(如果范围很大,可能会消耗大量内存),然后比较每个元件。考虑例如a =范围(1000000), “范围”对象本身很小但是如果你把它强制到一个列表就会变得很大。然后你必须比较一百万个元素。
答案(2)效率更低,因为assertItemsEqual不仅要实例化列表,而且还要在进行元素比较之前对它们进行排序。
相反,由于您知道对象是范围,因此当它们的步幅,起始值和结束值相等时它们是相等的。 E.g。
ranges_equal = len(a)==len(b) and (len(a)==0 or a[0]==b[0] and a[-1]==b[-1])
答案 2 :(得分:1)
尝试assertItemsEqual
,(在docs中):
class MyTestCase(unittest.TestCase):
def test_mytest(self):
a = (0,1,2,3,4)
self.assertItemsEqual(a, range(0,4))
答案 3 :(得分:1)
另一种方法:
ranges_equal = str(a)==str(b)
字符串表示指示范围的开始,结束和步骤。
这个问题让我觉得Python应该提供一种从范围对象本身获取这些属性的方法!