2012-02-08 22 views
15

Używam biblioteki Pythona unittest, a wszystkie testy zakończą się powodzeniem, ale nadal otrzymuję komunikat zwrotny i nie mogę zrozumieć, w jaki sposób mogę rozwiązać problem.Testy zakończone sukcesem, nadal dostają traceback

........ 
---------------------------------------------------------------------- 
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

Czy [this] (http://stackoverflow.com/questions/79754/unittest-causing-sys-exit) może pomóc? [Na przykład, przekazanie wyjścia = False do głównego.) – DSM

Odpowiedz

13

Wygląda na to, że działasz w powłoce Pythona, która przechwytuje wyjątki, abyś mógł kontynuować debugowanie. Jeśli został uruchomiony z linii poleceń, linii

sys.exit(not self.result.wasSuccessful()) 

by wyszły na swój program z kodem wyjściowym od 0, co oznacza sukces (może to być sprzeczne z intuicją, jeśli jesteś zaznajomiony z tym, jak wchodzić w interakcje z programów muszla). Ponieważ jednak korzystasz z interpretera, wyjątek zostaje złapany.

Sugerowałbym, że nie ma nic złego w twoim programie lub twoich testach. Struktura unittests prawdopodobnie nie spodziewała się, że zostanie uruchomiona interaktywnie!

1

Cokolwiek używasz do prowadzenia tych badań, to złapanie wyjątku SystemExit i drukowanie traceback. Podczas pisania kodu, który łapie wyjątki, należy zadbać, aby nie złapać wyjątki, które w rzeczywistości nie chcą złapać, jak SystemExit (podniesione przez sys.exit() do końca programu) i zazwyczaj KeyboardInterrupt (podniesione przez Ctrl-C).

6

zakończyć unittest plik z:

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 
+0

Nie powinieneś sprawdzać, czy "jest True" - powinien po prostu usunąć tę część. Zamiast tego wszystkiego powinieneś zamiast tego podać 'exit = False' ... –

6

Aby uniknąć zakończeniu wykonywania TracBack:

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

sys.exit(not self.result.wasSuccessful())

Wpadłem na to, kiedy przyjęto moje __main__.py w moim pakiecie Pythona zawsze miałbym __name__, "__main__" - ale kiedy poprowadziłem moje unittests przez odkrycie tam, odkryłem, że oni będą exe wycięte, ale z innym __name__ - - - .

Dlatego zrobiłem potrzebne następujące w moim __main__.py podobnie jak w prostych skryptów Pythona:

if __name__ == '__main__': 
    main() 

zamiast tylko

main() 

Jeśli main jest unittest.main, nazywają go

if __name__ == '__main__': 
    main(exit=False) 

jeśli chcesz, aby proces s trzymać się w trybie interaktywnym jeśli dzwonisz

python -im package_name 

Jeśli używasz:

python -m unittest discover 

potem nie sądzę exit=False powinno mieć znaczenia.

+0

Najbardziej kompletna i przydatna odpowiedź tutaj. Człowieku, nienawidzę tego, jak spóźnione odpowiedzi mają tak surowy interes. – CandiedOrange

Powiązane problemy