2011-05-30 105 views
13

在Python unittest框架中,如果未引發異常,是否有方法通過單元測試,否則將失敗並返回AssertRaise?如果沒有引發異常,請通過Python單元測試

+0

我只有在測試遺留代碼並進行一系列完整性測試時才發現需要這樣做。這些都是沒有任何Asserts的測試(基本上驗證代碼塊不會爆炸而執行)。任何意外的異常無論如何都會使測試失敗 - 不確定Python框架是否與xUnit系列類似。 – Gishu 2011-06-01 05:16:54

+1

可能的重複:http://stackoverflow.com/questions/4319825/python-unittest-opposite-of-assertraises – 2014-11-13 01:53:49

回答

12

如果我正確理解你的問題,你可以做這樣的事情:

def test_does_not_raise_on_valid_input(self): 
    raised = False 
    try: 
     do_something(42) 
    except: 
     raised = True 
    self.assertFalse(raised, 'Exception raised') 

...假設你有一個相應的測試正確Exception被上調無效的輸入,當然:

def test_does_raise_on_invalid_input(self): 
    self.assertRaises(OutOfCheese, do_something, 43) 

然而,正如評論指出的那樣,你需要考慮它是什麼,你是實際上測試。這可能是一個測試像...

def test_what_is_42(self): 
    self.assertEquals(do_something(42), 'Meaning of life') 

...更好,因爲它測試系統所需的行爲,如果一個異常提出將失敗。

+2

恕我直言,這樣的事情應該是unittest.TestCase類的一部分,這是一個尷尬的事情要,但我不能是唯一想要的人。 – 2011-05-30 23:50:52

+0

@Levi Campbell:我同意,一個'assertDoesNotRaise()'方法會更簡潔。 N.B:自從你接受之後,我編輯了我的答案。 – Johnsyweb 2011-05-30 23:57:20

+10

爲什麼要先弄個例外,然後再提出一個例外?只要調用'do_something()',並且如果引發異常,測試會自動失敗。這也是'assertDoesNotRaise()'不存在的原因。 – 2011-05-31 02:16:19

9

本頁面上的許多評論將錯誤和失敗視爲等同的,但事實並非如此。在我看來,正確的解決方案是在引發異常的情況下明確地通過測試。例如:

def test_does_not_error(self): 
    try: 
     code_under_test() 
    except ThatException: 
     self.fail("code_under_test raised ThatException") 
+1

同意 - 雖然控制檯輸出的錯誤和失敗的解析相當於人類閱讀,大多數自動化的單元測試工具對待兩者是完全不同的,對嗎? – hBy2Py 2015-10-08 02:17:36

-1

正如在Sven的評論中指出的那樣,只需調用你的功能,例如, do_something()。如果引發未處理的異常,測試會自動失敗!真的沒有理由做其他事情。這也是爲什麼assertDoesNotRaise()不存在的原因。

+0

爲什麼downvote?答案非常準確。 – 2017-08-04 02:22:23

相關問題