2012-02-08 26 views
15

Tôi đang sử dụng thư viện unittest của Python và tất cả các bài kiểm tra thành công, nhưng tôi vẫn nhận được traceback và tôi không thể hiểu cách khắc phục sự cố.Thử nghiệm thành công, vẫn nhận được 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

[this] (http://stackoverflow.com/questions/79754/unittest-causing-sys-exit) có giúp gì không? [Ví dụ, đi qua exit = False to main.) – DSM

Trả lời

13

Dường như bạn đang chạy trong trình bao Python, sẽ bắt ngoại lệ cho bạn để bạn có thể tiếp tục gỡ lỗi. Nếu bạn đã được chạy từ dòng lệnh, dòng

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

sẽ thoát chương trình của bạn với một mã trả về 0, mà chỉ ra thành công (điều này có thể là phản trực giác nếu bạn không quen với cách các chương trình tương tác với vỏ). Vì bạn đang chạy trong trình thông dịch, tuy nhiên, ngoại lệ bị bắt.

Tôi khuyên bạn không nên làm gì với chương trình hoặc bài kiểm tra của mình. Khung unittests có lẽ chỉ không mong đợi để được chạy tương tác!

1

Dù bạn đang sử dụng để chạy các thử nghiệm này, nó sẽ bắt ngoại lệ SystemExit và in truy nguyên. Khi bạn viết mã bắt ngoại lệ, bạn nên cẩn thận để không bắt ngoại lệ mà bạn không thực sự muốn nắm bắt, như SystemExit (được nâng lên bởi sys.exit() để kết thúc chương trình) và thường là KeyboardInterrupt (được nâng lên bởi control-C.)

6

cuối tập tin unittest của bạn với:

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

Bạn không nên kiểm tra 'là True' - chỉ cần xóa phần đó. Thay vào đó, thay vào đó, bạn nên cung cấp 'exit = False' ... –

6

Để tránh kết thúc thực hiện TrackBack:

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

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

Tôi chạy vào điều này khi tôi cho rằng __main__.py tôi trong gói Python của tôi sẽ luôn có __name__, "__main__" - nhưng khi tôi chạy unittests của tôi thông qua khám phá ở đó, tôi thấy rằng họ sẽ được exe đã cắt nhưng với một khác nhau __name__ - "package.__main__".

Vì vậy, tôi đã làm cần sau trong __main__.py của tôi giống như trong kịch bản Python đơn giản:

if __name__ == '__main__': 
    main() 

thay vì chỉ

main() 

Nếu mainunittest.main, gọi nó với

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

nếu bạn muốn s để dính vào xung quanh trong chế độ tương tác nếu bạn đang gọi điện thoại

python -im package_name 

Nếu bạn đang sử dụng:

python -m unittest discover 

sau đó tôi không nghĩ exit=False nên quan trọng.

+0

Câu trả lời đầy đủ và hữu ích nhất ở đây. Người đàn ông tôi ghét câu trả lời trễ như thế nào có được một thỏa thuận thô. – CandiedOrange

Các vấn đề liên quan