Estoy implementando pruebas unitarias para una familia de funciones que comparten varias invariantes. Por ejemplo, llamar a la función con dos matrices produce una matriz de forma conocida.¿Cómo puedo implementar de forma concisa múltiples pruebas de unidad similares en el marco de prueba de Python?
Me gustaría escribir pruebas unitarias para probar toda la familia de funciones para esta propiedad, sin tener que escribir un caso de prueba individual para cada función (sobre todo porque se pueden agregar más funciones más adelante).
Una forma de hacer esto sería iterar sobre una lista de estas funciones:
import unittest
import numpy
from somewhere import the_functions
from somewhere.else import TheClass
class Test_the_functions(unittest.TestCase):
def setUp(self):
self.matrix1 = numpy.ones((5,10))
self.matrix2 = numpy.identity(5)
def testOutputShape(unittest.TestCase):
"""Output of functions be of a certain shape"""
for function in all_functions:
output = function(self.matrix1, self.matrix2)
fail_message = "%s produces output of the wrong shape" % str(function)
self.assertEqual(self.matrix1.shape, output.shape, fail_message)
if __name__ == "__main__":
unittest.main()
me ocurrió la idea para esto desde Dive Into Python. Allí, no es una lista de funciones que se están probando, sino una lista de pares de entrada y salida conocidos. El problema con este enfoque es que si algún elemento de la lista falla la prueba, los elementos posteriores no se prueban.
Miré subclassing unittest.TestCase y, de alguna manera, proporcioné la función específica para probar como argumento, pero hasta donde sé, eso nos impide usar unittest.main() porque no habría forma de pasar el argumento a la caja de prueba.
También miré dinámicamente adjuntando funciones "testSomething" a la caja de prueba, usando setattr con lamdba, pero el caso de prueba no las reconoció.
¿Cómo puedo volver a escribir esto por lo que sigue siendo trivial ampliar la lista de pruebas, al tiempo que se garantiza que se ejecuten todas las pruebas?
pregunta relacionada: http://stackoverflow.com/questions/32899/how-to-generate-dynamic-unit-tests-in-python – jfs