unittest unit examples example español assertraises assertequal python unit-testing timeout

examples - unittest python español



¿Cómo especificar el tiempo de espera de la prueba para python unittest? (2)

Estoy usando python framework unittest . ¿Es posible especificar por las capacidades del marco un tiempo de espera para la prueba? Si no, ¿es posible especificar con gracia un timeout de timeout para todas las pruebas y para algunas pruebas separadas un valor privado para cada una?
Quiero definir un global timeout de global timeout para todas las pruebas (lo usarán de forma predeterminada) y un tiempo de espera para algunas pruebas que pueden tomar mucho tiempo.


Construí una solución de tiempo de espera de prueba de unidad usando the with keyowrd, basado en esta respuesta .

Este enfoque también utiliza la signal , por lo que solo podría ser válido en sistemas * nix (solo lo he ejecutado en mi entorno Ubuntu 16.04).

  1. Importar señal, agregar una excepción TestTimeout :

import signal ... class TestTimeout(Exception): pass

  1. Defina la clase test_timeout , que manejará los bloques with :

class test_timeout: def __init__(self, seconds, error_message=None): if error_message is None: error_message = ''test timed out after {}s.''.format(seconds) self.seconds = seconds self.error_message = error_message def handle_timeout(self, signum, frame): raise TestTimeout(self.error_message) def __enter__(self): signal.signal(signal.SIGALRM, self.handle_timeout) signal.alarm(self.seconds) def __exit__(self, exc_type, exc_val, exc_tb): signal.alarm(0)

  1. with test_timeout() bloques with test_timeout() en sus pruebas unitarias:

def test_foo(self): with test_timeout(5): # test has 5 seconds to complete ... foo unit test code ...

Con este enfoque, las pruebas de que el tiempo de espera dará como resultado un error debido a la excepción de aumento de TestTimeout.

Opcionalmente, podría envolver el with test_timeout() en un bloque try: except TestTimeout: y manejar la excepción con mayor granularidad (omita una prueba en lugar de un error, por ejemplo).


Por lo que sé, unittest no contiene ningún soporte para el tiempo de espera de las pruebas.

Puede probar la biblioteca timeout-decorator desde PyPI. Aplique el decorador en pruebas individuales para hacer que terminen si toman demasiado tiempo:

import timeout_decorator class TestCaseWithTimeouts(unittest.TestCase): # ... whatever ... @timeout_decorator.timeout(LOCAL_TIMEOUT) def test_that_can_take_too_long(self): sleep(float(''inf'')) # ... whatever else ...

Para crear un tiempo de espera global, puede reemplazar la llamada

unittest.main()

con

timeout_decorator.timeout(GLOBAL_TIMEOUT)(unittest.main)()