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

Posted

技术标签:

【中文标题】重新导入被测模块以丢失上下文【英文标题】:re-import module-under-test to lose context 【发布时间】:2011-11-19 14:17:39 【问题描述】:

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

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

【问题讨论】:

除了重新导入模块,这在某些情况下可能是必要的,如果你正在重置的状态很好地包含在模块的一个或几个属性中,你可以使用mock.patch将它们模拟出来,然后将模拟替换为其他测试。 【参考方案1】:
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 的内部状态已被重置。

【讨论】:

【参考方案2】:

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

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

【讨论】:

我想你的意思是del sys.modules['my_module']

以上是关于重新导入被测模块以丢失上下文的主要内容,如果未能解决你的问题,请参考以下文章

如何热重载包装在本机导入上下文中的模块?

错误:尚未正确初始化 Azure PowerShell 上下文。请导入模块并重试

CUDA 上下文中模块的持久性

Odoo模块开发教程5-导入导出以及模块数据第一讲

编辑并重新运行 Spring Boot 单元测试,无需重新加载上下文以加快测试速度

以编程方式重新启动 Spring Boot 应用程序/刷新 Spring 上下文