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

16 投票
2 回答
3795 浏览
提问于 2025-04-17 02:31

很多Python模块在内部会保持一些状态,但并不一定要定义类,比如说logging模块就有几个日志记录器,可以通过getLogger()来访问。

那么,怎么测试这样的模块呢?
我想用标准的unittest工具来做测试。我希望在一个TestCase类里的不同测试中,每次都重新导入我想测试的模块,这样每次测试的时候它都能“忘记”之前的状态。这样可以做到吗?

2 个回答

11

这段代码会把这个模块重新导入,像是给你一个全新的模块一样:

import sys
del sys.modules['my_module']
import my_module
17
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 的内部状态已经被重置了。

撰写回答