在python中实时修补

时间:2015-08-04 11:20:18

标签: python testing pdb

我有一个python测试,setUp函数需要花费很多时间(几个小时)。我的测试函数失败,并调试它并检查如何修复异常,我使用pdb。

问题是当我在一行中有异常时,我用pdb修复它并更改测试功能,我需要重新运行测试,包括很长的设置,以便到达下一行并且检查它,然后重新开始(它抛出一个异常,用pdb到达它,修复等)。

有没有办法对我的脚本进行修补,并且在没有再次运行大厅脚本的情况下继续下一行?

1 个答案:

答案 0 :(得分:0)

重新加载模块

您可以将经常更改的代码部分移动到单独的模块中,并使用importlib.reload。 (在python 3.4之前它是imp.reload,而在python 2.x中它是一个内置函数。)

请注意,您应该小心导入:此代码仍将使用过时版本的模块 -

import changing
from changing import func1
...
func1()
...
reload(changing)  # ← this will reload import module, but separately imported func1 will remain intact
func1()

这个应该有效 -

import changing
...
changing.func1()
...
reload(changing)
changing.func1()  # ← now the new version is called!

猴子修补功能

在您的特定情况下不太方便的另一种方法是移动更改代码,例如模块中的顶级函数,然后替换该函数:

# my_module
def changeable():
    # do something

def test_something():
    ...
    changeable()

和pdb:

>>> ...
>>> def new_version():
        ... new actions ...
>>> my_module.changeable = new_version
>>> my_module.test_something()  # ← this will use updated changeable()