Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

re-import module-under-test to lose context

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?

like image 272
Jonathan Livni Avatar asked Sep 18 '11 08:09

Jonathan Livni


2 Answers

This will reimport the module as new for you:

import sys
del sys.modules['my_module']
import my_module
like image 151
ed. Avatar answered Sep 21 '22 17:09

ed.


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.

like image 22
unutbu Avatar answered Sep 20 '22 17:09

unutbu