如何断言列表中确实包含预期的元素?

How to assert that exactly the expected elements are in a list?

我想对接受列表和 returns(一个非常不同的)列表的函数进行单元测试。我知道我期望的元素是什么,但我不知道它们在返回列表中的顺序。我如何断言这些元素恰好在列表中,没有其他元素?我想使用 py.test 来做到这一点。另外:我希望有多个重复项。

假设元素是可哈希且唯一的,只需使用集合:

set(l) == set(f(l))

如果这些条件不适用,请对它们进行排序:

sorted(l) == sorted(f(l))

还有 collections.Counter,如果元素是可散列的且非唯一的:

import collections

collections.Counter(l) == collections.Counter(f(l))

如果顺序无关紧要,对两个列表进行排序并检查它们是否相等

assert sorted(exampleOutput) == sorted(func(inputList))

你可能想使用set操作的区别:

list_to_test = [1,2,3,4,5,5,4,3,2,1,2]
wanted_elements = [1,2,3]
d = set(list_to_test).difference(set(wanted_elements))
print d
set([4, 5])

所以最终你会断言 len(d) == 0。

如果我没理解错的话,你想测试列表 A 和列表 B 是否具有完全相同的元素,包括重复但不考虑顺序。
这需要使用计数器:

from collections import Counter
wanted_elements = [1, 1, 2, 3, 4, 4, 4, 4]
input_list = [1, 2, 1, 4, 4, 4, 4, 3]
c1 = Counter(wanted_elements)
c2 = Counter(input_list)
assert c1 == c2