2017-05-05 52 views
2

我第一次使用PyUnit。我想要求一些測試在指定的時間內運行。據我所知,沒有內在的方法來做到這一點。PyUnit - 如何給單個單元測試添加超時

我找到了答案:PyUnit - How to unit test a method that runs into an infinite loop for some input?。但是,此解決方案會導致PyUnit忽略其他失敗的測試。這裏有一個例子:

import multiprocessing 
import unittest 
from functools import wraps 
import time 

def timeout(seconds=5, error_message="Timeout"): 
    def decorator(func): 
     def wrapper(*args, **kwargs): 
      process = multiprocessing.Process(None, func, None, args, kwargs) 
      process.start() 
      process.join(seconds) 
      if process.is_alive(): 
       raise TimeoutError(error_message) 

     return wraps(func)(wrapper) 
    return decorator 

class MyTestCase(unittest.TestCase): 

    @timeout(1) 
    def test_Sleepy(self): 
     time.sleep(5) 

    @timeout(1) 
    def test_Falsy(self): 
     self.assertTrue(False) 

if __name__ == '__main__': 
    unittest.main() 

當我運行試驗中,test_Falsy異常不被PyUnit中框架和測試輸出補時FAILED (errors=1)(而不是FAILED (errors=2)如你所期望)結束。

什麼是增加超時到單個PyUnit測試的正確方法?

回答

0

建議的方法: 1.將測試保留在主線程中 2.使用新線程而不是進程實現超時。新線程等待1秒(或任何超時時間),然後調用thread.interrupt_main

有關線程文檔,請參閱https://docs.python.org/2/library/thread.html