我有一個python函數,如果通過不良數據被陷入無限循環。我想編寫一個單元測試來確認它能夠優雅地處理錯誤的參數。問題當然是,如果它沒有檢測到錯誤的參數,它將不會返回。針對潛在的無限循環Python單元測試
使用線程爲這種類型的事物編寫測試可以接受嗎?
import threading, unittest
import mymodule
class CallSuspectFunctionThread(threading.Thread):
def __init__(self, func, *args):
self.func = func
self.args = args
super(CallSuspectFunctionThread, self).__init__()
def run(self):
self.func(*self.args)
class TestNoInfiniteLoop(unittest.TestCase):
def test_no_infinite_loop(self):
myobj = mymodule.MyObject()
bad_args = (-1,0)
test_thread = CallSuspectFunctionThread(mybj.func_to_test, *bad_args)
test_thread.daemon = True
test_thread.start()
# fail if func doesn't return after 8 seconds
for i in range(32):
test_thread.join(0.25)
if not test_thread.is_alive():
return
self.fail("function doesn't return")
我這個看到的唯一的問題是,如果測試失敗,我堅持這個額外的線程,可能消耗CPU和內存資源,而測試的其餘部分被執行。另一方面,我已經修復了代碼,並且這裏的迴歸可能性非常小,所以我不知道是否包含測試是否重要。
好點。所以這是單元測試的限制。一個**如何證明**終止?就我而言,我試圖確定數學函數的一些簡單屬性。邊緣情況似乎是描述的曲線表現不佳(即不會收斂/沒有局部極端)。我承認我可以採取懶惰的方式;編寫測試並繼續前進然後找出卡住的位置會更容易。 – 2011-04-14 17:23:51
@Aryeh Leib Taurog:這不是「單元測試」的限制。這是所有測試的限制。您無法測試終止。你必須證明它。如果你正在做功能分析,你必須真正做數學來確定什麼約束定義收斂,並拒絕所有不能收斂的初始條件。對不起,但你必須做數學。 – 2011-04-14 17:29:53
並非所有問題都有解決方案。在這種情況下確定一組完整的輸入約束不是一個現實的方法。我的意思是簡單地使用循環計數器來停止計算,一旦它變得太過分了。但是,知道距離太遠並不總是那麼簡單。 – 2011-04-14 19:21:25