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错误模块的主要内容,如果未能解决你的问题,请参考以下文章