测试Django查询集:self.assertListEqual vs self.assertQuerysetEqual

7

在Django中进行测试时,我发现有两种不同的方法来测试涉及查询集的函数。第一种方法是:

test_instance = FooFactory()
self.assertListEqual(list(Foo.objects.all()), [test_instance])

第二个是:

test_instance = FooFactory()
self.assertQuerysetEqual(Foo.objects.all(), map(repr, [test_instance]))

这两个哪个更好?我从Django文档中读到,这就是assertQuerysetEqual的作用:
断言查询集qs返回特定的值列表values。 使用函数transform比较qs和values的内容;默认情况下,这意味着比较每个值的repr()。如果repr()不能提供唯一或有用的比较,可以使用任何其他可调用对象。 默认情况下,比较也依赖于排序。如果qs没有提供隐式排序,可以将ordered参数设置为False,将比较转换为collections.Counter比较。如果顺序未定义(如果给定的qs未排序并且比较针对多个有序值),则会引发ValueError。
我看到这里有两件重要的事情:一个是比较每个值的repr(),另一个是assertQuerysetEqual允许您使排序变成可选。
对于第一点,我认为最好比较模型本身而不是它们的“repr”值,因为这样你就知道它们完全相同(尽管有人可能也会认为“repr”值应该是不同的)。
对于第二点,我可以看出无序比较可能很有用。然而,如果你正在专门测试某些不重要/易于模拟排序的内容,我看不到那里的优势。
我能想到的唯一论据是,“assertQuerysetEqual”(在上述假设下)更可读/直接表达其目的。
有没有什么实际区别在“self.assertListEqual(list(), [])”和“self.assertQuerysetEqual(, map(repr, []))”之间,我没有考虑到的?
1个回答

0

唯一的实际区别在于Python如何进行对象和字符串比较。

self.assertListEqual:比较模型实例列表,委托给一个提供比较规则的__eq__方法。查看Django如何比较模型实例

self.assertQuerysetEqual:比较字符串列表,使用每个字符串中每个字符的ord值。

根据对象的__eq____repr__的实现方式,其中一个可能会提供轻微的性能优势。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接