我正在编写一个测试套件,而且我正在测试的代码会过度使用延迟模块导入。所以有可能有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__'