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).
- Importar señal, agregar una excepción
TestTimeout
:
import signal ... class TestTimeout(Exception): pass
- Defina la clase
test_timeout
, que manejará los bloqueswith
:
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)
-
with test_timeout()
bloqueswith 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)()