正如本文中提到的Exception vs Assert?,異常用於運行時錯誤條件,斷言用於編碼錯誤。我們是否必須爲斷言或異常編寫單元測試?
據我所知,單元測試用於驗證函數的功能。除了我們已經知道結果的合法測試用例之外,我們是否必須在單元測試中編寫一些非法測試用例來測試斷言是否發生或異常是否被拋出?
正如本文中提到的Exception vs Assert?,異常用於運行時錯誤條件,斷言用於編碼錯誤。我們是否必須爲斷言或異常編寫單元測試?
據我所知,單元測試用於驗證函數的功能。除了我們已經知道結果的合法測試用例之外,我們是否必須在單元測試中編寫一些非法測試用例來測試斷言是否發生或異常是否被拋出?
您的問題無法以通用方式回答。
完美的單元測試是不可能的,即使是「非常好」的單元測試也非常困難,而且只有在測試「非常好」的代碼時纔有可能。注意不要陷入這個陷阱,這一切都取決於你的質量要求。
如果故障可能導致生命損失,您是否會開發關鍵任務系統?多走一步,儘可能多地測試。無論如何,任何改變都必須通過很多官僚手段。否則適應你的要求。自動化測試的一個主要優點是簡化了重構,當您可以更改(有時顯着)您的實現並仍然確保它在一定程度上有效。太多的測試和這把槍指向你,因爲任何改變都將需要很多測試變化,最終阻礙你的進步。
像往常一樣沒有銀彈
你可能。測試斷言和/或異常是否發生,何時發生「不良」情況是個不錯的主意。
詳情請閱讀:
PS:你有什麼打算?那麼,這取決於你的項目。
問問自己:是一個異常還是斷言代碼?你爲什麼寫這些例外和斷言?他們有功能!應該保護你的代碼免受例如來自「外部」的意外數據。所以如果你需要這種保護,你必須檢查你的代碼的功能。
,如果你不檢查你的代碼會發生什麼: 也許你檢查你的異常的範圍是錯誤的,你在那裏是沒有預料到的情況下拋出,或者你不扔,但你的執行,現在不確定的行爲運行。
我的看法很簡單:您編寫代碼和異常並聲明代碼。代碼做一些有用的事情,所以你必須檢查它。從邏輯的角度來看,斷言和異常與if/the/else錯誤處理沒有區別。爲了獲得完整的通話檢查,你必須檢查它。該C++具有特殊的語言功能並不意味着這可能導致不檢查使用此功能的那部分代碼。
你應該小心謹慎,不要因爲每個內部的測試都會中斷而無法改變任何東西。您只能測試用戶可以依賴的記錄行爲,而不是每個出現的行爲。 – nwp
你也應該測試錯誤情況,以確保被測試的方法能夠正確處理錯誤(例如,方法是否真的拋出異常或者它只是在壓力下發生段錯誤?)。
如果您使用gtest,那麼您可以使用EXPECT_THROW
或ASSERT_THROW
來測試是否拋出了特定異常。
取決於功能的功能。如果指定它必須在某些輸入上拋出異常,則必須對其進行測試。如果它被指定爲在某些輸入上產生某種行爲並且未定義的行爲,那麼你就不能。 – nwp
由於'assert'是編碼錯誤,你不應該能夠「啓動」它們(如果可以的話,它將在UB中釋放)。 – Jarod42