2011-08-29 101 views
1

我有一個隨機失敗的測試,我想讓它在發送錯誤消息之前重試很多次。Python單元測試:鼻子失敗時重試?

我使用Python與鼻子。

我寫了以下內容,但不幸的是,即使使用try/except處理,當第一次嘗試失敗時,Nose也會返回一個錯誤。

def test_something(self): 
    maxAttempts = 3 
    func = self.run_something 

    attempt = 1 
    while True: 
     if attempt == maxAttempts: 
      yield func 
      break 

     else: 
      try: 
       yield func 
       break 
      except: 
       attempt += 1 

def run_something(self): 
    #Do stuff 

感謝

+0

如果失敗只是有時,這是一個原因,把它當作一個特定的討厭的錯誤,而不是掩蓋它。 – delnan

+3

在我的情況下,它是可以接受的,它通常是失敗的(這取決於外部資源等) – jerome

回答

1

通過使用一臺發電機,你給鼻子maxAttempts測試運行。如果其中任何都失敗,套件將失敗。 try/catch並不特別適用於測試你的屈服,因爲它的鼻子可以運行它們。重寫你的測試,像這樣:

def test_something(self): 
    maxAttempts = 3 
    func = self.run_something 

    attempt = 1 
    while True: 
     if attempt == maxAttempts: 
      func() # <<<-------- 
      break 

     else: 
      try: 
       func() # <<<-------- 
       break 
      except: 
       attempt += 1 

def run_something(self): 
    #Do stuff 
+0

謝謝,我嘗試使用生成器來清理處理setup和teardown,但是這個工作也一樣 – jerome

2

您可以使用您的功能屬性與flaky nose plugin即會自動重新運行測試,讓您使用先進的參數(例如,如果2 3測試通不過,那麼它是一個通)

GitHub flaky project

如何安裝用於Python片狀插件:

pip install flaky 

實施例的鼻子測試運行的配置:

nosetests.exe your_python_tests.py --with-flaky --force-flaky --max-runs=3 

與功能的示例Python代碼標記爲片狀屬性:

from flaky import flaky 

@flaky 
def test_something_that_usually_passes(self): 
    value_to_double = 21 
    result = get_result_from_flaky_doubler(value_to_double) 
    self.assertEqual(result, value_to_double * 2, 'Result doubled incorrectly.')