重新导入被测模块以丢失上下文

时间:2011-09-18 08:33:12

标签: python unit-testing import python-module

许多Python模块保留内部状态而不定义类,例如logging通过getLogger()维护了几个记录器。

如何测试这样的模块?
使用标准unittest工具,我希望TestCase类中的各种测试重新导入我的模块测试,以便每次失去其上下文。可以这样做吗?

2 个答案:

答案 0 :(得分:9)

import unittest
import sys

class Test(unittest.TestCase):
    def tearDown(self):
        try:
            del sys.modules['logging']
        except KeyError:
            pass
    def test_logging(self):
        import logging
        logging.foo=1
    def test_logging2(self):
        import logging
        print(logging.foo)

if __name__ == '__main__':
    unittest.sys.argv.insert(1,'--verbose')
    unittest.main(argv = unittest.sys.argv)    

% test.py Test.test_logging通过:

test_logging (__main__.Test) ... ok

% test.py Test.test_logging2没有:

test_logging2 (__main__.Test) ... ERROR

因为logging的内部状态已被重置。

答案 1 :(得分:5)

这将为您重新导入模块:

import sys
del sys.modules['my_module']
import my_module