skipif - Python''s unittest y creación dinámica de casos de prueba
python unittest example (3)
Posible duplicado:
¿Cómo generar pruebas de unidades dinámicas (parametrizadas) en python?
¿Hay alguna manera de crear dinámicamente casos de prueba de prueba unittest
? He probado lo 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)
..que crea todos los métodos correctamente (se muestran en dir()
y son invocables), pero el detector de prueba de unittest, ni nosetest
ejecuta ("Pruebas de Ran 0 en ...")
Como puedo estar haciendo la pregunta incorrecta, lo que intento lograr:
Tengo un archivo que contiene datos de prueba, una lista de nombres de archivos de entrada y datos esperados (simplificados a episodenumber
en el código anterior), almacenados en un diccionario de Python. La clave es 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 solo self.assertEquals
todos los datos, llamo 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 mejor manera?
En la siguiente solución, las Tests
clase contienen la check
método auxiliar y no hay casos de prueba definidos estáticamente. Luego, para agregar dinámicamente casos de prueba, utilizo 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 la check
método auxiliar 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))
He publicado una solución a una pregunta similar que debería darle pistas sobre cómo hacer esto. Se basa en metaclass y decoradores.
Prueba de unidad Python: ¿Generar pruebas múltiples programáticamente?
Para esto deberías usar generators prueba 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