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

Jon*_*han 10 python import unit-testing python-module

许多Python模块在不定义类的情况下保留内部状态,例如logging通过维护可访问的几个记录器getLogger().

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

unu*_*tbu 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)    
Run Code Online (Sandbox Code Playgroud)

% test.py Test.test_logging 经过:

test_logging (__main__.Test) ... ok
Run Code Online (Sandbox Code Playgroud)

% test.py Test.test_logging2不是:

test_logging2 (__main__.Test) ... ERROR
Run Code Online (Sandbox Code Playgroud)

因为内部状态logging已被重置.


ed.*_*ed. 6

这将为您重新导入该模块为新模块:

import sys
del sys.modules['my_module']
import my_module
Run Code Online (Sandbox Code Playgroud)