2012-09-17 19 views
3

我正在编写一个测试套件,而且我正在测试的代码会过度使用延迟模块导入。所以有可能有5个不同的输入到同一个方法,这可能最终导入5个额外的模块。我想要做的就是设置测试,以便我可以断言,使用一个输入运行该方法会导致一个导入,并且不会导致其他输入4.我有几个想法,从这开始,但迄今为止都没有成功。我已经有一个自定义导入程序,并且可以将日志记录代码放入导入程序中。但是这不起作用,因为import语句只运行一次。我需要执行日志语句,而不管模块是否先前已导入。只运行del sys.modules['modname']也不起作用,因为它运行在测试代码中,并且我无法在正在测试的代码中重新加载模块。如何记录在一段代码中执行的所有导入?

我试过的下一件事情是继承dict来做监视,并用这个子类替换sys.modules。这个子类有一个重新实现的方法__getitem__,但调用import module似乎没有触发子类中的__getitem__调用。我也不能直接分配到sys.modules.__getitem__,因为它是只读的。

我试图做甚至可能吗?

UPDATE

nneonneo的答案似乎如果logImports()实行的是同一模块中因为它是用来唯一工作。如果我创建一个包含这个功能的基础测试类,它就会有问题。第一,它无法找到刚刚__import__,与示数:

#  old_import = __import__ 
# UnboundLocalError: local variable '__import__' referenced before assignment 

当我改变,要__builtin__.__import__,我另一个错误:

myunittest.py:

import unittest 
class TestCase(unittest.TestCase): 
    def logImports(self): 
     old_import = __builtins__.__import__ 
     def __import__(*args, **kwargs): 
      print args, kwargs 
      return old_import(*args, **kwargs) 

     __builtins__.__import__ = __import__ 

测试。 py:

import myunittest 
import unittest 
class RealTest(myunittest.TestCase): 
    def setUp(self): 
     self.logImports() 
    def testSomething(self): 
     import unittest 
     self.assertTrue(True) 
unittest.main() 

#  old_import = __builtins__.__import__ 
# AttributeError: 'dict' object has no attribute '__import__' 

回答

2

尝试

old_import = __import__ 
def __import__(*args, **kwargs): 
    print args, kwargs 
    return old_import(*args, **kwargs) 

__builtins__.__import__ = __import__ 

这完全覆盖了__import__,允许您监视每个调用import

相关问题