【发布时间】:2014-03-22 00:53:30
【问题描述】:
我们有一个需要确定性的大而复杂的函数。它是我们公司的主力之一,涵盖了大量的代码。由于 python 的 dict 迭代器,此代码通常变得不确定。这种情况发生了很多次,很难追查到,而且往往不会立即注意到。我们想编写一个自动化测试来检测非确定性,但我不知道该怎么做。
我们曾尝试在循环中运行该函数,并且测试结果始终相同,但有时,即使该函数是非确定性的,该函数也会通过此测试,因为该函数的顺序是任意但有些一致的dict 迭代器。
有没有办法编写自动化测试来捕捉这种错误?
也许有一种方法可以破解 python 的 dict,以便在此测试期间迭代器是随机的而不是任意的?这样重复调用函数就更有可能出现分歧?这似乎是一个相当复杂的方法,但我想不出任何其他方法。
编辑:
我们目前使用的是 Python 2.7。
我们对各种子模块进行了单元测试,但是由于 dict 顺序的任意但一致的性质,它们通常不会暴露不确定性。
另外,也许不确定性不是描述这个问题的正确方式。这个函数需要 {id : data},但是 ids 的值不应该影响代码的结果,但是由于 python dict 排序,它有时会。也许最好的测试方法是用随机值替换 id 并检查在多次使用不同 id 运行后输出是否相同。
【问题讨论】:
-
此行为取决于您运行的 python 版本。 Python 2 是任意但一致的,python 3.3+ 随机化哈希迭代顺序(安全原因)。
-
重构并覆盖单元测试。如果你展示你的代码,答案可能更具体。
标签: python dictionary iteration non-deterministic