2017-05-05 55 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