如何测试范围的等价性

时间:2011-10-12 13:26:39

标签: python unit-testing python-3.x

我的一个单元测试会在读取日志文件后检查是否正确设置了范围,我只想测试var == range(0,10)。但是,range(0,1) == range(0,1)在Python 3中评估为False

有没有直接的方法来测试Python 3中的范围等价?

4 个答案:

答案 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应该提供一种从范围对象本身获取这些属性的方法!