one*_*ter 6 python unit-testing python-3.x
我的一个单元测试检查在读取日志文件后是否正确设置了一个范围,我想测试一下var == range(0,10).但是,range(0,1) == range(0,1)请False在Python 3中进行评估.
有没有一种直接的方法来测试Python 3中的范围等价?
unu*_*tbu 10
在Python3中,range返回一个可迭代的类型range.range当且仅当两个s相同时(即共享相同id),两个s是相等的.为了测试其内容的相等性,将其转换range为list:
list(range(0,1)) == list(range(0,1))
Run Code Online (Sandbox Code Playgroud)
这适用于短距离.对于很长的范围,Charles G Waldman的解决方案更好.
第一个提出的解决方案 - 使用"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])