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

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

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

【问题讨论】:

  • 除了重新导入模块,这在某些情况下可能是必要的,如果你正在重置的状态很好地包含在模块的一个或几个属性中,你可以使用mock.patch将它们模拟出来,然后将模拟替换为其他测试。

标签: python unit-testing import python-module


【解决方案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']
    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 2019-01-11
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    相关资源
    最近更新 更多