如何編寫僅在函數未引起預期異常的狀況下失敗的單元測試? less
看一下unittest
模塊的assertRaises方法。 函數
使用unittest模塊中的TestCase.assertRaises
(或TestCase.failUnlessRaises
),例如: 單元測試
import mymod class MyTestCase(unittest.TestCase): def test1(self): self.assertRaises(SomeCoolException, mymod.myfunc)
您的代碼應遵循如下模式(這是一個unittest模塊樣式測試): 測試
def test_afunction_throws_exception(self): try: afunction() except ExpectedException: pass except Exception: self.fail('unexpected exception raised') else: self.fail('ExpectedException not raised')
在Python <2.7上,此構造對於檢查預期異常中的特定值頗有用。 unittest函數assertRaises
僅檢查是否引起了異常。 spa
我上一個答案中的代碼能夠簡化爲: 命令行
def test_afunction_throws_exception(self): self.assertRaises(ExpectedException, afunction)
若是函數接受參數,則將它們傳遞給assertRaises,以下所示: code
def test_afunction_throws_exception(self): self.assertRaises(ExpectedException, afunction, arg1, arg2)
我幾乎在全部地方都使用doctest [1],由於我喜歡同時記錄和測試函數的事實。 ip
看一下這段代碼: 文檔
def throw_up(something, gowrong=False): """ >>> throw_up('Fish n Chips') Traceback (most recent call last): ... Exception: Fish n Chips >>> throw_up('Fish n Chips', gowrong=True) 'I feel fine!' """ if gowrong: return "I feel fine!" raise Exception(something) if __name__ == '__main__': import doctest doctest.testmod()
若是將此示例放在模塊中並從命令行運行它,則將評估並檢查兩個測試用例。 get