2009-08-04 36 views
5

Tôi đã có mã nơi assertRaises ném một ngoại lệ khi assertRaises thất bại. Tôi nghĩ rằng nếu assertRaises thất bại thì thử nghiệm sẽ thất bại và tôi sẽ nhận được một báo cáo ở cuối nói rằng thử nghiệm thất bại. Tôi đã không mong đợi ngoại lệ được ném ra. Dưới đây là mã của tôi. Tôi đang làm gì sai? Tôi đang sử dụng Python 2.6.2.python unittest assertRaises ném ngoại lệ khi assertRaises thất bại

import unittest 

class myClass: 

    def getName(self): 

     raise myExcOne, "my exception one" 
     #raise myExcTwo, "my exception two" 
     #return "a" 

class myExcOne(Exception): 
    "exception one" 

class myExcTwo(Exception): 
    "exception two" 


class test_myClass(unittest.TestCase): 

    def setUp(self): 

     self.myClass = myClass() 

    def testgetNameEmpty(self): 
     #self.assertRaises(myExcOne,self.myClass.getName) 
     #self.assertRaises(myExcTwo,self.myClass.getName) 

     try: 
      self.assertRaises(myExcTwo,self.myClass.getName) 
     except Exception as e: 
      pass 

if __name__ == "__main__": 

    #unittest.main() 

    suite = unittest.TestLoader().loadTestsFromTestCase(test_myClass) 
    unittest.TextTestRunner(verbosity=2).run(suite) 
+0

bạn đặc biệt có ý nghĩa gì khi 'khẳng định không thành công'? Bạn có thể đăng một stacktrace hoặc một thông báo lỗi? –

+0

Tôi đọc lại tài liệu và ném một ngoại lệ khi assertRaises thất bại là hành vi mong đợi. Tôi hiểu lầm cách công cụ hoạt động. Tôi quên đề cập đến điều này trong bài trước. Nếu tôi bắt được ngoại lệ, báo cáo nói với tôi rằng bài kiểm tra đã được thông qua mặc dù nó không xảy ra. Tôi đã cập nhật mã của mình trên –

Trả lời

6

Mã như đã đăng không đúng. Để bắt đầu, class myClass(): shoudl là class myClass:. Cũng if name == "main": nên là:

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

Ngoài những vấn đề này, điều này không thành công vì getName() được nâng cao ngoại lệ myExcOne và thử nghiệm của bạn hy vọng ngoại lệ myExcTwo.

Dưới đây là một số mã hoạt động. Hãy chỉnh sửa mã trong câu hỏi của bạn để nó rất dễ dàng cho chúng tôi để cắt và dán nó vào một phiên Python:

import unittest 

class myExcOne(Exception): "exception one" 

class myExcTwo(Exception): "exception two" 

class myClass: 
    def getName(self): 
     raise myExcTwo 

class test_myClass(unittest.TestCase): 
    def setUp(self): 
     self.myClass = myClass() 
    def testgetNameEmpty(self): 
     #self.assertRaises(myExcOne,self.myClass.getName) 
     self.assertRaises(myExcTwo,self.myClass.getName) 

if __name__ == "__main__": 
    unittest.main() 
+0

Xin chào mhawke, __main__ đã bị rối tung trong quá trình sao chép và dán. Đối với lớp myClass(), lớp gốc kế thừa vì vậy tôi đã quên xóa() khi tôi tạo testcase nhỏ. Thử nghiệm được cho là không thành công. Tôi đang cố gắng để hiểu cách công cụ hoạt động khi một khẳng định thất bại. Đối với bài đăng gốc của tôi, tôi hiểu lầm rằng công cụ này được cho là sẽ ném một ngoại lệ nếu khẳng định không thành công. Tôi đã cập nhật mã để bắt ngoại lệ và không làm gì với nó. Mặc dù khẳng định không thành công, báo cáo nói rằng nó đã trôi qua. Brian –

5

Bắt đầu với một sang một bên, () sau classname trong một tuyên bố class là hoàn toàn đúng trong hiện đại Python - không phải là lỗi.

Trên thịt của vấn đề, assertRaises(MyException, foo) IS tài liệu để tuyên truyền ngoại lệ huy động bằng cách gọi foo() có loại KHÔNG phải là một lớp con của MyException - nó chỉ bắt MyException và lớp con đó. Khi mã của bạn đặt ra một ngoại lệ của một loại và thử nghiệm của bạn mong đợi một loại không liên quan khác nhau, ngoại lệ đã nêu sẽ lan truyền, theo tài liệu của mô-đun unittest, here và tôi báo: "kiểm tra vượt qua nếu ngoại lệ được nâng lên, là một lỗi nếu một ngoại lệ khác được nâng lên, hoặc thất bại nếu không có ngoại lệ được nâng lên "- và" là một lỗi "có nghĩa là" tuyên truyền ngoại lệ khác ".

Khi bạn nắm bắt được ngoại lệ lan truyền trong khối try/except của mình, bạn vô hiệu hóa lỗi và không có gì còn lại để không thể chẩn đoán được. Nếu mục đích của bạn là biến lỗi này thành lỗi (chiến lược gây tranh cãi ...), khối except của bạn sẽ gọi self.fail.

+0

Cảm ơn sự giúp đỡ của bạn !!! Tôi đã không hiểu được sự hiểu lầm của tôi cho đến khi tôi đăng tải. Với mã trên nếu tôi chạy nó, tôi nhận được thông báo . Tôi hy vọng nó sẽ thất bại nhưng hiểu tại sao nó đưa ra thông điệp. Khi tôi thêm self.fail trong khối ngoại trừ nó ném một ngoại lệ khác. Bất kỳ đề xuất nào để cho phép tất cả các thử nghiệm chạy và báo cáo lỗi ở cuối? Tôi tìm thấy nhưng tôi không chắc chắn làm thế nào (hoặc nếu tôi có thể) nhận được kết quả. –

+0

tất cả các testmethods DO chạy và báo cáo lỗi (E) và thất bại (F) [được chẩn đoán bởi ngoại lệ đặc biệt, thực sự] với á hậu kiểm tra đơn vị bình thường (unittest.main) - Tôi ngạc nhiên khi biết rằng TextTestRunner cư xử khác nhau cho bạn, vì đây là chính xác những gì unittest.main sử dụng (thông qua lớp unittest.TestProgram), kiểm tra các nguồn ... bạn DO có được kết quả mong đợi w/unittest.main, phải không? –

+0

Nếu tôi đưa ra khối thử/ngoại trừ và bỏ ghi chú thì đó là trình gỡ rối của tôi đang dừng thực thi. Tôi chạy chương trình từ một dòng lệnh nó chạy tất cả các bài kiểm tra và đưa ra kết quả tôi mong đợi. Đây là những gì tôi đang tìm kiếm. Nhưng nếu tôi chạy các mã như nó được liệt kê ở trên nó nói với tôi nó đi mặc dù nó sẽ thất bại. Tôi không lo lắng về điều này kể từ khi chạy thử nghiệm đơn vị từ dòng lệnh cho tôi những gì tôi muốn. Cảm ơn lần nữa vì sự giúp đỡ của bạn. –

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