簡體   English   中英

對具有try / except的函數的Python單元測試

[英]Python unit test for a function that has try/except

我有一個函數,嘗試/除以下:

def func_A():
  try:
       # do some stuff
  except Exception as e:
     log.error("there was an exception %s", str(e))

我想為這個func_A()寫一個單元測試更重要的是,我想確保這一點

  • A內沒有例外

try/except安全。 除非有錯誤,否則A中不應該拋出任何異常(雖然它會被try/except捕獲),這就是我想用單元測試驗證的。

單元測試的最佳方法是捕獲異常拋出和捕獲的情況?

如果你真的需要這個,一種可能的方法是模擬log.error對象。 在調用func_A函數之后,您可以斷言您的mock 未被調用。

請注意,如果您不打算實際處理它們,則根本不應捕獲異常。 為了獲得適當的測試覆蓋率,您應該在此處提供2個測試 - 一個用於檢查try / except的每個分支。

另一種可能的解決方案是將實現拆分為兩個函數:

  1. 函數foo()與邏輯沒有try語句。 這樣,您可以確保在您的實現中不會拋出任何異常。
  2. safe_foo()foo()包裝到try語句中。 然后你可以模擬foo()來模擬它拋出異常,並確保捕獲每個異常。

缺點是foo()將成為公共接口的一部分,或者您將為私有函數編寫測試。

您可以使用一個變量來跟蹤正常執行的函數或以異常結束。

def func_A():
  function_state = True 
  try:
       # do some stuff
  except Exception as e:
     log.error("there was an exception %s", str(e))
     function_state = False
return function_state

使用assertTrue驗證function_state

選擇1:不要。 這是測試實現細節。 嘗試編寫測試套件,以便功能完成您需要它完成的所有操作。 如果你想用你想要的輸入做你想要的,你就是好的。

選項2:您可以修改函數以將記錄器作為參數。 然后在測試用例中,傳入一個模擬對象並檢查是否調用了日志記錄方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM