python unittest错误模块

Posted

技术标签:

【中文标题】python unittest错误模块【英文标题】:python unittest faulty module 【发布时间】:2013-10-06 08:29:05 【问题描述】:

我有一个需要在 python 中测试的模块。

我正在使用 unittest 框架,但遇到了问题。

模块有一些方法定义,其中一个在导入时使用(readConfiguration),如下所示:

.
.
.
def readConfiguration(file = "default.xml"):
    # do some reading from xml

readConfiguration()

这是一个问题,因为当我尝试导入模块时,它还会尝试运行“readConfiguration”方法,这会使模块和程序失败(测试环境中不存在配置文件)。

我希望能够独立于任何配置文件来测试模块。

模块不是我编写的,它不能重构。

我知道我可以包含一个虚拟配置文件,但我正在寻找一个“更干净”、更优雅的解决方案。

【问题讨论】:

没有更清洁的解决方案;这是您无法在运行时修补的事情之一。 如果没有更多信息,我们真的无法为您提供帮助。但似乎如果你想解决这个问题,你需要修补、修改或重构模块。没有神奇的解决方案。 补丁作为重构? 是的,Inbar 的意思是重构。在导入时强制加载配置是非常糟糕的做法。 【参考方案1】:

正如评论者已经指出的那样,导入不应该有副作用,所以尽可能尝试更改模块。

如果你真的绝对不能这样做,可能还有另一种方法:让readConfiguration() 被调用,但删除它的依赖项。例如,如果它使用内置的open() 函数,您可以模拟它,如mock documentation 所示:

>>> mock = MagicMock(return_value=sentinel.file_handle)
>>> with patch('builtins.open', mock):
...     import the_broken_module
...     # do your testing here

如果您需要提供实际内容,请将sentinel.file_handle 替换为StringIO("<contents of mock config file>")

它很脆弱,因为它取决于readConfiguration() 的实现,但如果真的没有其他方法,它可能作为最后的手段有用。

【讨论】:

谢谢,这是一个不错的补丁,但可能不适合标准的单元测试结构。如果在重新检查后重新分解不会被批准,我可能会诉诸它,但现在它被搁置,因为没有提出好的解决方案(除了......重新分解)。 如果您需要多个测试方法,您可以在单元测试类的 setUp() 方法中执行此操作,并执行例如import the_broken_module; self.the_broken_module = the_broken_module。然后,您可以通过self.the_broken_module 的测试方法访问它。导入后,任何后续导入都不会产生任何影响,但也不会造成任何伤害。 它似乎可以工作(程序没有中断,但还没有编写测试)。如果我们最终会使用它,我会让你知道它的效果如何。谢谢!

以上是关于python unittest错误模块的主要内容,如果未能解决你的问题,请参考以下文章

unittes和developer

python unittest测试框架

unittest单元测试框架总结

python unittest错误模块

python单元测试之unittest

unittest测试框架_4_装饰器