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

标签 python unit-testing import python-module

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

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

最佳答案

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 的内部状态已经被重置。

关于python - 重新导入被测模块以丢失上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7460363/

相关文章:

java - 这些字符串操作在 Java 和 Python 中是否等效?

python - 按小时过滤 DataFrame 行

python - 访问不同级别的多级索引,然后将该索引的列转换为数组,然后传递给函数

python - 将值合并到有序字典中的一个键

python - 从文本文件导入变量并在方程中使用它

python-3.x - 模块未找到错误: No module named '__main__.xxxx' ; '__main__' is not a package

java - Mockito:模拟包含 lambda 表达式的方法调用

c# - 有没有更简单的方法来处理单元测试条件太多的方法?

node.js - 出于测试目的重放 RPC 调用

c# - 将两个csv文件导入mysql数据库