2017-04-16 67 views
1

我在python上越來越好,但我想找到一種方法來證明一段代碼不在無限循環中。假設我有一個方法foo(),它有一個無限循環,並且每次嘗試都會減少參數。如果循環在嘗試達到零時發生,我很好,但如果我在代碼中留下了一個錯誤,它將永遠循環。例如,假設我意外遞增而不是遞減,單元測試有沒有辦法檢測無限循環並且通過測試?類似於處理器上的看門狗,可以檢測進程是否佔用了所有CPU週期。見下面的代碼:證明代碼的單元測試避免了無限循環

# Given the following set of methods 
def foo(attempts): 
    while(attempts >= 0) 
    attempts += 1 # OH OH!! ACCIDENTAL INFINITE LOOP!!!! 
    # Keep doing work until attempts reaches zero (or so was expected...) 

    return True # return true once broken out of the loop 


# Here comes the Unit test 
class FooTestCase(unittest.TestCase): 
    def test_foo(self): 
    self.assertTrue(foo(5)) # Test foo - but how to test that an inf loop is not present?? 
+0

...只是讓它在那裏,你的構建將超時。 –

回答

0

單元測試通常依賴於代碼被測建立某種可觀察到的結果 - 一個返回值,在對象狀態的變化,或者例如一個異常 - 可以由測試被檢查碼。從來沒有完成執行的代碼不適合這種範式,但有幾種方法可以採用。

  1. 在你的測試中,在一個線程中執行該方法;在主線程中,定期檢查測試運行的時間,如果運行時間過長,則提高AssertionError

  2. 如果可能,請以不需要潛在無限循環的方式設計您的代碼。例如,你可以使用一個for循環,這樣完成保證: for x in range(attempts): if can_we_break_now(): break

  3. 如果您的使用情況要求attempts在循環中突變,嘗試提取突變代碼放到一個函數,編寫測試,以證明函數不能爲attempts分配一個非法值。
+0

我明白了 - 我認爲你的主意是我尋找的最接近的東西。我的意思是我相信我可以編寫代碼,使其不涉及無限循環,但其想法是將代碼看作一個黑盒子,而我並不知道它的內部工作原理。 – nndhawan