Тесты преуспевают, все еще получают трассировку
Я использую библиотеку Python unittest
, и все тесты успешны, но я все еще получаю трассировку, и я не могу понять, как я могу исправить эту проблему.
........
----------------------------------------------------------------------
Ran 8 tests in 0.020s
OK
Traceback (most recent call last):
File "C:\Users\Paul\Desktop\bloomfilter\test_bloomfilter.py", line 85, in <module>
unittest.main()
File "C:\Programming\PythonX86\Python27\lib\unittest\main.py", line 95, in __init__
self.runTests()
File "C:\Programming\PythonX86\Python27\lib\unittest\main.py", line 231, in runTests
sys.exit(not self.result.wasSuccessful())
SystemExit: False
>>>
Ответы
Ответ 1
Кажется, что вы работаете в оболочке Python, которая ловит исключения для вас, поэтому вы можете продолжить отладку. Если вы запускали из командной строки, строка
sys.exit(not self.result.wasSuccessful())
выйдет из вашей программы с кодом выхода 0, что указывает на успех (это может быть противоречиво, если вы не знакомы с тем, как программы взаимодействуют с оболочкой). Однако, поскольку вы работаете в интерпретаторе, исключение попадает.
Я бы предположил, что нет ничего плохого в вашей программе или тестах. Рамка unittests, вероятно, просто не ожидала, что она будет запущена в интерактивном режиме!
Ответ 2
Чтобы избежать завершения выполнения трассировки:
if __name__ == '__main__':
unittest.main(exit=False)
Ответ 3
завершите свой файл unittest с помощью
if __name__=='__main__':
try:
unittest.main()
except SystemExit as inst:
if inst.args[0] is True: # raised by sys.exit(True) when tests failed
raise
Ответ 4
sys.exit(not self.result.wasSuccessful())
Я столкнулся с этим, когда предположил, что мой __main__.py
в моем пакете Python всегда будет иметь __name__
, "__main__"
, но когда я запускал свои unittests через обнаружение там, я обнаружил, что они будут выполнены, но с другой __name__
- "package.__main__"
.
Поэтому мне понадобилось следующее в моем __main__.py
, как в простых сценариях Python:
if __name__ == '__main__':
main()
вместо
main()
Если main
- unittest.main
, вызовите его с помощью
if __name__ == '__main__':
main(exit=False)
если вы хотите, чтобы процесс зависал в интерактивном режиме, если вы вызываете
python -im package_name
Если вы используете:
python -m unittest discover
то я не думаю, что exit=False
должен иметь значение.
Ответ 5
Независимо от того, что вы используете для запуска этих тестов, оно захватывает исключение SystemExit и печатает трассировку. Когда вы пишете код, который ловит исключения, вы должны позаботиться о том, чтобы не перехватывать исключения, которые вы на самом деле не хотите улавливать, например SystemExit
(поднятые sys.exit()
для завершения программы) и обычно KeyboardInterrupt
(поднятые с помощью элемента управления -С.)