Tengo una función python que, si pasa datos incorrectos, queda atrapada en un bucle infinito. Me gustaría escribir una prueba unitaria para confirmar que maneja los parámetros incorrectos con elegancia. El problema es, por supuesto, que si no detecta los parámetros incorrectos, no volverá.prueba unitaria de Python contra un bucle infinito potencial
¿Es aceptable usar hilos para escribir una prueba para este tipo de cosas?
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")
El único problema que veo con esto es que si no pasa la prueba que estoy atascado con este hilo adicional, lo que podría consumir recursos de CPU y memoria, mientras que el resto de las pruebas se ejecutan. Por otro lado, he corregido el código y la probabilidad de regresión aquí es muy pequeña, así que no sé si importa si incluyo la prueba o no.
Buenos puntos. Entonces esta es una limitación de las pruebas unitarias. Sin embargo, ¿cómo se ** demuestra ** la finalización? En mi caso, estoy tratando de determinar algunas propiedades simples de una función matemática. Los casos de borde parecen ser donde la curva descrita no se comporta bien (es decir, no converge/sin extremo local). Admito que podría estar tomando el enfoque perezoso; es más fácil escribir una prueba y seguir adelante, luego averiguar dónde se está atascando. –
@Aryeh Leib Taurog: Esto no es una limitación de "Pruebas unitarias". Esta es una limitación de todas las pruebas. No puede probar la terminación. Debes probarlo. Si está haciendo análisis de funciones, tiene que hacer los cálculos para determinar qué restricciones definen la convergencia y rechazar todas las condiciones iniciales que no pueden converger. Lo siento, pero tienes que hacer los cálculos. –
No todos los problemas tienen una solución cerrada. La determinación de un conjunto completo de restricciones en la entrada en este caso no es un enfoque realista. Lo que quise decir es simplemente usar un contador de bucle para detener el cálculo una vez que se ha ido demasiado lejos. Pero también no siempre es fácil saber hasta qué punto está demasiado lejos. –