首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何以稳定的方式使用pytest断言列表?

如何以稳定的方式使用pytest断言列表?
EN

Stack Overflow用户
提问于 2018-11-23 09:32:16
回答 2查看 6K关注 0票数 4

在将Python应用程序从2.6迁移到2.7之后,我从pytest的结果中了解到列表的顺序发生了变化。列表的内容是第三方openLDAP库的结果。

这是Python2.6中的列表:

代码语言:javascript
复制
assert ['1', '2', '8'] == ['1', '2', '8']

但是使用Python2.7,列表的顺序发生了变化,这导致了一个AssertionError

代码语言:javascript
复制
assert ['1', '8', '2'] == ['1', '2', '8']

最好的建议是,更改实现以获得有序列表,或者更改测试,即将所有列表转换为set,以便以稳定的方式比较断言结果?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-23 09:37:13

您有几个选项,取决于数据的性质。我假设您需要通过测试,如果元素是相同的,而不考虑顺序。

如果可以保证列表中的所有项都是唯一的,请使用set

代码语言:javascript
复制
assert set(['1', '8', '2']) == set(['1', '2', '8'])

如果不能保证没有副本,请使用sorted

代码语言:javascript
复制
assert sorted(['1', '8', '2']) == sorted(['1', '2', '8'])
票数 15
EN

Stack Overflow用户

发布于 2022-02-24 21:27:46

有一个叫做吡喃-无序的pytest插件,它不仅用于处理这个基本用例,而且还可以应用于嵌套对象层次结构的各个级别。

代码语言:javascript
复制
pip install pytest-unordered
代码语言:javascript
复制
from pytest_unordered import unordered
代码语言:javascript
复制
assert ['1', '8', '2'] == unordered(['1', '2', '8'])

如果您的对象层次结构由您要比较的字典和列表组成,您甚至可以使用这样的递归方法来使所有列表无序:

代码语言:javascript
复制
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 obj
代码语言:javascript
复制
assert actual_results == unordered_deep(expected_results)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53443937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档