在将Python应用程序从2.6迁移到2.7之后,我从pytest的结果中了解到列表的顺序发生了变化。列表的内容是第三方openLDAP库的结果。
这是Python2.6中的列表:
assert ['1', '2', '8'] == ['1', '2', '8']但是使用Python2.7,列表的顺序发生了变化,这导致了一个AssertionError
assert ['1', '8', '2'] == ['1', '2', '8']最好的建议是,更改实现以获得有序列表,或者更改测试,即将所有列表转换为set,以便以稳定的方式比较断言结果?
发布于 2018-11-23 09:37:13
您有几个选项,取决于数据的性质。我假设您需要通过测试,如果元素是相同的,而不考虑顺序。
如果可以保证列表中的所有项都是唯一的,请使用set
assert set(['1', '8', '2']) == set(['1', '2', '8'])如果不能保证没有副本,请使用sorted
assert sorted(['1', '8', '2']) == sorted(['1', '2', '8'])发布于 2022-02-24 21:27:46
有一个叫做吡喃-无序的pytest插件,它不仅用于处理这个基本用例,而且还可以应用于嵌套对象层次结构的各个级别。
pip install pytest-unorderedfrom pytest_unordered import unorderedassert ['1', '8', '2'] == unordered(['1', '2', '8'])如果您的对象层次结构由您要比较的字典和列表组成,您甚至可以使用这样的递归方法来使所有列表无序:
def unordered_deep(obj):
if isinstance(obj, dict):
return dict((k, unordered_deep(v)) for k, v in obj.items())
if isinstance(obj, list):
return unordered((unordered_deep(x) for x in obj))
return objassert actual_results == unordered_deep(expected_results)https://stackoverflow.com/questions/53443937
复制相似问题