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

Posted

技术标签:

【中文标题】自动检测 Python 中的非确定性行为【英文标题】:Automatically detect non-deterministic behaviour in Python 【发布时间】:2021-07-16 01:32:04 【问题描述】:

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

我意识到很多事情都在幕后发生,所以这对于调试器或任何工具来说可能太难了......

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

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

【问题讨论】:

【参考方案1】:

我不知道自动执行此操作的方法,但我建议您在测试失败时启动调试器,然后自动运行(过夜?)直到失败。然后,您可以检查变量,看看是否有任何突出的地方。如果您使用 pytest,使用 --pdb 标志运行将在失败时启动调试器。

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

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

【讨论】:

以上是关于自动检测 Python 中的非确定性行为的主要内容,如果未能解决你的问题,请参考以下文章

Python 3 - 主线程未检测到后台线程中的KeyboardInterrupt,直到用户将鼠标悬停在GUI窗口上

如何检测字符串中的非 ASCII 字符?

如何在 JPA 2.0 中自动检测实体

自动检测浏览器选项卡中的注销?

在Tomcat中自动检测URI编码

TeamCity 不会触发自动构建