re-import module-under-test to lose context

2019-02-12 21:36发布

问题:

Many Python modules preserve an internal state without defining classes, e.g. logging maintains several loggers accessible via getLogger().

How do you test such a module?
Using the standard unittest tools, I would like the various tests inside a TestCase class to re-import my module-under-test so that each time it loses its context. Can this be done?

回答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 passes:

test_logging (__main__.Test) ... ok

but % test.py Test.test_logging2 does not:

test_logging2 (__main__.Test) ... ERROR

since the internal state of logging has been reset.



回答2:

This will reimport the module as new for you:

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