【发布时间】:2017-08-08 15:56:30
【问题描述】:
我刚刚花了半天时间将一个错误追踪到一个我在迭代它时忘记排序的字典。即使这部分代码已经过测试,测试也没有选择它,因为该 dict 在测试期间具有可重复的顺序。 只有当我洗牌时,测试才会失败!(我使用了一个中间 random.shuffle'd 列表并构建了一个 OrderedDict)
这让我有点害怕,因为可能到处都有类似的错误!
有没有办法在测试期间全局强制所有dicts无序?
更新:我想我至少弄清楚了导致该错误的原因。正如here 所描述的,具有 int 键的字典通常是排序的,但可能并不总是如此。我的假设:在我的测试中,整数总是很小(10 阶),因此总是有序的。然而,在实际运行中,整数要大得多(顺序为 10^13),因此并不总是有序的。我能够在交互式会话中重现此行为:list(foo.keys()) == sorted(foo.keys()) 对于小键始终是 True,但不是对于每个具有非常大键的字典。
【问题讨论】:
-
字典是 not 排序的。但是在构建时,通常顺序是 deterministic (这是不同的)。您可以将 Python 与
-R标志一起使用。 -
使用 -R 标志,给定 Python 进程的键顺序将保持不变,对吧?
-
@RagingRoosevelt:是的。但是每次测试,你都会使用不同的顺序。所以这意味着经过几次测试后,错误可能会开始发生。例如,任意测试是 Haskell 对
QuickCheck使用的东西之一:您生成随机列表/整数/字符串/...并验证条件是否成立。 -
@wim:我不认为这是一个真正的答案。
-
确实,它只与 Python2 相关,并且问题现在被标记为 Python3。那么,也许您可以删除 cmets。
标签: python python-3.x unit-testing