2014-12-29 4 views
1

Я пытаюсь запустить мои тесты с помощью unittest. Вот моя структура:Unittest failed with sys.exit

projectname/ 
    projectname/ 
     foo.py 
     bar.py 
    tests/ 
     test_foo.py 
     test_bar.py 

я запускаю его с:

cd tests/ 
python -m unittest discover 

Но в одном файле, например foo.py, я использую sys.exit(0) и UnitTest не очень нравится :

$ python -m unittest discover 
....E. 
====================================================================== 
ERROR: test_foo (...) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
... 
... 
File "/home/.../projectname/foo.py", line 12, in write 
    sys.exit(0) 
SystemExit: 0 

---------------------------------------------------------------------- 
Ran 6 tests in 0.018s 

FAILED (errors=1) 

sys.exit() использование является добровольным, я не могу удалить его. Я знаю, что есть вариант называется exit для unittest.main функции:

if __name__ == "__main__": 
    unittest.main(exit=False) 

Но я хочу, чтобы проверить все файлы в тестов каталогов. Другой способ сделать:

if __name__ == '__main__': 
    tests = unittest.TestLoader().discover('.') 
    unittest.TextTestRunner(verbosity=1).run(tests) 

Он находит все test_ файлы, но sys.exit() делает UnitTest аварии.

+2

Все, что вызывает 'sys.exit', не является многоразовым устройством из-за его абсолютной природы, поэтому модульное тестирование на самом деле не применимо. Однако вы можете заменить 'sys.exit' для этой части кода, хотя это также изменит поведение тестируемого. Возможно, вам удастся поймать исключение, которое он вызывает, вы должны будете поймать 'ExceptionBase', я полагаю. –

ответ

0

Я не думаю, что использование sys.exit() в модуле - хорошая идея. Но если вам нужно, то вам следует написать тестовый пример, который обертывает модуль как подпроцесс, возможно, используя модуль подпроцесса, и проверяет код выхода. Вероятно, вам также понадобится сценарий оболочки для вызова. Другими словами, вы вызываете внешний скрипт Python, который импортирует этот модуль, а затем он выходит. Рамка unittest может сообщать о прохождении/сбое, проверяя возвращаемое значение подпроцесса.

4

sys.exit фактически не выходит из интерпретатора. Он просто поднимет SystemExit. Если это исключение попадает в верхнюю часть стека, интерпретатор начинает процесс выхода (с соответствующим значением выхода).

unittest недоволен тем, что это исключает исключение SystemExit (поэтому интерпретатор фактически не выходит), но тест не описывается как ожидающий повышения этого исключения.

Попробуйте следующее.

def test_exit_func(self): 
    with self.assertRaises(SystemExit): 
     sys.exit(0)