повторно импортировать тестируемый модуль, чтобы потерять контекст - PullRequest
9 голосов
/ 18 сентября 2011

Многие модули Python сохраняют внутреннее состояние без определения классов, например, logging поддерживает несколько регистраторов, доступных через getLogger().

Как вы тестируете такой модуль?
Используя стандартные инструменты unittest, я бы хотел повторно импортировать различные тесты внутри класса TestCase мой тестируемый модуль, чтобы каждый раз он терял свой контекст. Можно ли это сделать?

Ответы [ 2 ]

9 голосов
/ 18 сентября 2011
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 было сброшено.

6 голосов
/ 18 сентября 2011

Это будет повторно импортировать модуль как новый для вас:

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