Тесты преуспевают, все еще получают трассировку

Я использую библиотеку 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 (поднятые с помощью элемента управления -С.)