在py.test测试中重启python(或重装模块)

Cla*_*ude 11 pytest python-3.x

我有一个(python3)包具有完全不同的行为,具体取决于它的init()编辑方式(可能不是最好的设计,但重写不是一个选项).该模块只能init()编辑一次,第二次产生错误.我想使用py.test测试这个包(两个行为).

注意:包的性质使得这两种行为相互排斥,没有任何理由可以在单一程序中同时使用这两种行为.

test_xxx.py我的测试目录中有几个模块.每个模块都会按照需要的方式启动包(使用fixture).由于py.test启动python解释器一次,在一个py.test运行中运行所有测试模块失败.

猴子修补程序包以允许一秒钟init()不是我想要做的事情,因为有内部缓存等可能导致无法解释的行为.

  • 是否有可能告诉py.test在一个单独的python进程中运行每个测试模块(从而不受另一个测试模块中的inits的影响)
  • 有没有办法可靠地重新加载包(包括所有子依赖项等)?
  • 还有另一个解决方案(我正在考虑导入然后在灯具中导入包,但这似乎过多了)?

Jer*_*nes 5

要重新加载模块,请尝试使用reload()from 库importlib

例子:

from importlib import reload
import some_lib
#do something
reload(some_lib) 
Run Code Online (Sandbox Code Playgroud)

此外,在新进程中启动每个测试是可行的,但多进程代码调试起来有点痛苦。

例子

import some_test
from multiprocessing import Manager, Process

#create new return value holder, in this case a list
manager = Manager()
return_value = manager.list()
#create new process
process =  Process(target=some_test.some_function, args=(arg, return_value))
#execute process
process.start()
#finish and return process
process.join()
#you can now use your return value as if it were a normal list, 
#as long as it was assigned in your subprocess
Run Code Online (Sandbox Code Playgroud)

  • 我使用的是 python3,所以 `imp` 应该是 `importlib`。以这种方式重新加载模块(不幸的是)不会清除该模块的全局字典,因此它没有帮助。恐怕它也不会重新加载所有依赖模块。您在新进程中运行每个测试看起来很有趣,但我不知道它如何与“py.test”结合起来。另外,我需要每个*模块*在单独的测试中运行,而不是每个函数。 (5认同)