1

我的程序读取一个 python 脚本进行配置。到目前为止,我正在加载这样的脚本lab.py

self.lab_file = "/not/interesting/path/lab.py"
sys.path.insert(0, os.path.dirname(self.lab_file))
import lab as _config

但是当我对它进行单元测试时,我有一个奇怪的行为:

  • 当我只启动一个调用此代码的单元测试时,它会成功
  • 当我启动几个单元测试时,每一个都独立调用此代码,一些测试失败了

用 跟踪问题logging,似乎实验室脚本只是第一次导入。这种行为在 python 方面似乎是一致的,但我假设单元测试是相互隔离的。我错了 ?如果测试在导入方面不是独立的,我如何编写测试来强制每次加载我的脚本?

4

3 回答 3

2

尝试使用reload.

例如:

    import lab as _config
    reload(_config)
于 2013-09-19T19:46:06.137 回答
1

我建议从 sys.modules 中删除模块

 import sys
 if 'lab' in sys.modules:
     del sys.modules['lab']
 import lab as _config

仅删除导入将不起作用,因为如果模块已导入,则导入会检查 sys.modules。

如果您导入然后重新加载它可以工作,因为它首先将模块从 sys.modules 加载到本地命名空间,然后从文件重新加载模块。

于 2013-09-19T20:34:11.553 回答
1

nose如果您使用此标志运行可能会有所帮助:

--with-isolation

来自鼻子医生

启用插件 IsolationPlugin:激活隔离插件,将外部模块的更改隔离到单个测试模块或包。隔离插件在每个测试模块或包运行到测试前的状态后重置 sys.modules 的内容。请注意,此插件不应与覆盖插件一起使用,或者在模块重新加载可能产生不良副作用的任何其他情况下使用。[NOSE_WITH_ISOLATION]

于 2013-09-19T20:43:02.733 回答