我们有一个需要确定性的大而复杂的函数。它是我们公司的主力之一,涵盖了大量的代码。由于 python 的 dict 迭代器,此代码通常变得不确定。这种情况发生了很多次,很难追查到,而且往往不会立即注意到。我们想编写一个自动化测试来检测非确定性,但我不知道该怎么做。
我们尝试在循环中运行该函数,并且测试结果始终相同,但有时,即使该函数是非确定性的,由于 dict 迭代器的任意但有些一致的顺序,该函数也会通过此测试。
有没有办法编写一个自动化测试来捕捉这种错误?
也许有一种方法可以破解 python 的 dict 以便在此测试期间迭代器是随机的而不是任意的?这样重复调用函数就更有可能发散?这似乎是一个相当复杂的方法,但我想不出任何其他方法。
编辑:
我们目前使用的是 Python 2.7。
我们对各种子模块进行了单元测试,但是由于 dict 顺序的任意但一致的性质,它们通常不会暴露不确定性。
此外,也许非确定性不是描述这个问题的正确方法。这个函数需要 {id : data},但是 ids 的值不应该影响代码的结果,但是由于 python dict 排序,它有时会。也许最好的测试方法是用随机值替换 id 并检查在多次运行不同 id 后输出是否相同。