我在测试返回可迭代的 python 函数时遇到困难,例如产生的函数或仅返回可迭代的函数,例如return imap(f, some_iter)
or return permutations([1,2,3])
。
因此,对于排列示例,我希望函数的输出为[(1, 2, 3), (1, 3, 2), ...]
. 所以,我开始测试我的代码。
def perm3():
return permutations([1,2,3])
# Lets ignore test framework and such details
def test_perm3():
assertEqual(perm3(), [(1, 2, 3), (1, 3, 2), ...])
这不起作用,因为perm3()
它是可迭代的,而不是列表。所以我们可以修复这个特定的例子。
def test_perm3():
assertEqual(list(perm3()), [(1, 2, 3), (1, 3, 2), ...])
这很好用。但是如果我有嵌套的迭代呢?那是迭代产生迭代吗?喜欢说表情
product(permutations([1, 2]), permutations([3, 4]))
。现在这可能没用,但很明显(一旦展开迭代器)它将类似于[((1, 2), (3, 4)), ((1, 2), (4, 3)), ...]
. 但是,我们不能只环绕list
我们的结果,因为它只会iterable<blah>
变成[iterable<blah>, iterable<blah>, ...]
. 好吧,我当然可以map(list, product(...))
,但这仅适用于嵌套级别 2。
那么,python 测试社区是否有针对测试迭代的问题的解决方案呢?当然,有些可迭代对象不能以这种方式进行测试,比如如果你想要一个无限的生成器,但这个问题仍然应该足够普遍,以至于有人已经考虑过这个问题。