2009-07-28 20 views
21

Duplicar posibles:
How to generate dynamic (parametrized) unit tests in python?de Python creación unittest y dinámica de casos de prueba

¿Hay una manera de crear dinámicamente unittest casos de prueba? He intentado el siguiente ..

class test_filenames(unittest.TestCase): 

    def setUp(self): 
     for category, testcases in files.items(): 
      for testindex, curtest in enumerate(testcases): 
       def thetest(): 
        parser = FileParser(curtest['input']) 
        theep = parser.parse() 
        self.assertEquals(theep.episodenumber, curtest['episodenumber']) 

       setattr(self, 'test_%s_%02d' % (category, testindex), thetest) 

..which crea todos los métodos correctamente (que aparecen en dir() y son exigibles), pero la prueba de detector de unittest, ni nosetest los ejecuta ("Ran 0 pruebas en .. . ")

Dado que se me puede hacer la pregunta equivocada - lo que yo estoy tratando de lograr:

tengo un archivo que contiene los datos de prueba, una lista de nombres de archivos de entrada, y esperaba datos (simplificados para episodenumber en el código anterior), almacenado en un diccionario de Python. La clave está en la categoría, el valor es una lista de casos de prueba, por ejemplo ..

test_cases = {} 
test_cases['example_1'] = [ 
    {'input': 'test.01', 
    'episodenumber': 1}, 
    {'input': 'test.02', 
    'episodenumber': 2} 
] 

test_cases['example_2'] = [ 
    {'input': 'another.123', 
    'episodenumber': 123}, 
    {'input': 'test.e42', 
    'episodenumber': 32} 
] 

Actualmente acabo de bucle sobre todos los datos, llame self.assertEquals en cada prueba. El problema es que, si uno falla, no veo el resto de las fallas, ya que también se agrupan en una prueba, que se cancela cuando falla una afirmación.

La forma de solucionar esto, pensé, sería (dinámicamente) crear una función para cada caso de prueba, ¿tal vez hay una manera mejor?

Respuesta

12

Para esto usted debe usar la prueba generators en la nariz. Todo lo que necesita hacer es ceder una tupla, siendo la primera una función y el resto los args. De los documentos aquí está el ejemplo.

def test_evens(): 
    for i in range(0, 5): 
     yield check_even, i, i*3 

def check_even(n, nn): 
    assert n % 2 == 0 or nn % 2 == 0 
+0

PYtest (http://pytest.org/) también es compatible con las pruebas basadas en generador. –

+0

+1 para un enlace útil --- los enlaces en respuestas similares sobre esta y otras preguntas no tenían ese enlace. –

21

En la siguiente solución, la clase Tests contiene el método auxiliar check y no hay casos de prueba estáticamente definidos. Luego, para agregar dinámicamente casos de prueba, uso setattr para definir funciones en la clase. En el siguiente ejemplo, genero casos de prueba test_<i>_<j> con i y j abarcando [1,3] y [2,5] respectivamente, que usan el método auxiliar check con diferentes valores de i y j.

class Tests(unittest.TestCase): 
    def check(self, i, j): 
     self.assertNotEquals(0, i-j) 



for i in xrange(1, 4): 
    for j in xrange(2, 6): 
     def ch(i, j): 
      return lambda self: self.check(i, j) 
     setattr(Tests, "test_%r_%r" % (i, j), ch(i, j)) 
Cuestiones relacionadas