比方說,我有一個接受用戶名和密碼的功能,它就從數據庫中檢索記錄,並對這些數據進行以下檢查編寫測試失敗的單元測試?
- 今天的日期是一個日期範圍
- 用戶是外禁用
- 的參數比較時
如果任何這些條件爲真則拋出異常。
很顯然,我想要寫我的單元測試,以測試他的邏輯,但是如果我做了一個會拋出異常,我的測試將失敗,這是不正確的 - 是什麼呢?
比方說,我有一個接受用戶名和密碼的功能,它就從數據庫中檢索記錄,並對這些數據進行以下檢查編寫測試失敗的單元測試?
如果任何這些條件爲真則拋出異常。
很顯然,我想要寫我的單元測試,以測試他的邏輯,但是如果我做了一個會拋出異常,我的測試將失敗,這是不正確的 - 是什麼呢?
是的,你的測試將正確地拋出一個異常,但在大多數(全部?)測試框架,您可以指定預期的異常,測試會通過。
在MSTest的和NUnit
[ExpectedException(typeof(ArgumentException))]
只是要小心其中可能拋出異常的情況下,但對於那些比你預期等原因。
既然你沒有說你正在使用哪個測試框架,我不能進入具體細節,但是框架將允許你將測試標記爲期望異常。當拋出異常時,這將停止測試失敗,並允許您檢查異常本身的類型和內容。另一方面,如果您使用的框架不支持這個功能(儘管我不認爲有任何不支持),您可以在測試中手動添加try ... catch塊,以便異常不會傳播出去並導致測試失敗。
我不知道我在這裏看到問題。有合同主叫方和被叫方和,該合同是否涉及異常之間被拋出,或錯誤返回碼(例如,如果將例外被叫內捕獲並轉換成返回代碼),你只需要檢查問題是否以某種方式發出信號。
例如,如果你的合同規定的getDbRow()
將拋出DbNotOpenException
如果數據庫未打開,這樣做:
db.Close()
try:
x = db.getDbRow()
catch DbNotOpenException e:
return PASSED_TEST
return FAILED_TEST
換句話說,如果你的單元測試期望爲給定的特定異常情況下,他們應該陷入困境並報告說沒問題。如果發生異常不發生,他們應該標記失敗。
+1 - 正是你應該做的。大多數單元測試框架允許您繼續前進,並且如果不拋出期望的異常,將會失敗。單元測試不僅應該測試那些功能在給定條件成功時工作,而且在沒有這些條件的情況下適當地失敗。 – 2010-05-17 09:16:01