自动检测 Python 中的非确定性行为

问题描述

这可能是不可能的,但我只是想知道是否有任何工具可以在我运行 Python 脚本时帮助检测非确定性行为。也许调试器中有一些奇特的选项?我想我在想象,从理论上讲,可以逐条比较堆栈指令或相同代码的两次后续运行之间的其他内容,从而找出任何分歧的开始。

我意识到很多事情都在幕后发生,所以这可能很难要求调试器或任何工具......

本质上我的问题是我的测试偶尔会失败,几乎可以肯定是因为在某处代码意外地依赖于迭代字典的输出顺序,或者一些实际上无法保证顺序的事情。我只是想要一个工具来帮助我找到这类问题的根源:)

以下问题类似,但没有太多关于如何真正以自动化或通用方式处理此问题的建议:Testing for non-deterministic behavior of python function

解决方法

我不知道有什么方法可以自动执行此操作,但我建议您在测试失败时启动调试器,然后自动运行(隔夜?)直到失败。然后,您可以检查变量,看看是否有任何突出之处。如果您使用的是 pytest,使用 return httpClient(url).then(({ headers,json }) => { if (!headers.has('x-total-count')) { throw new Error( 'The X-Total-Count header is missing in the HTTP Response...' ); } return { data: json,total: parseInt( headers.get('x-total-count').split('/').pop(),10 ),} 标志运行将在失败时启动调试器。

您也可以考虑使用 Hypothesis 来运行生成测试用例。

您还可以考虑一遍又一遍地运行测试,收集每次运行的输出(成功或失败)。当您有代表性样本时,请比较两者,特别是运行的测试的顺序!

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...