2012-02-24 22 views
6

Trabajo en un conjunto de pruebas de unidad de python que actualmente se crean utilizando pitones integradas en el marco de prueba. Me gustaría escribir pruebas paramaterizadas que se ejecutarán varias veces en función del conjunto de datos que le dé.Pruebas de unidad de paramaterización en python

es decir. si mi conjunto de datos es [1,2,3,4] mi función de prueba se ejecutará cuatro veces usando la entrada en mi conjunto de datos.

def test(data): 
    if data > 0: 
     #Pass the test 

Según tengo entendido, esto no es posible actualmente en el marco integrado, a menos que ponga un bucle en mi función de prueba. No quiero hacer esto porque necesito que la prueba continúe ejecutándose incluso si falla una entrada.

He visto que es posible usar la nariz o pyTest. ¿Cuál es el mejor marco para usar? ¿Hay otro marco que podría usar que sería mejor que cualquiera de estos?

¡Gracias de antemano!

Respuesta

6

Tenga en cuenta que este es precisamente uno de los usos más comunes de la reciente adición de funcargs en py.test.

En su caso se obtendría:

def pytest_generate_tests(metafunc): 
    if 'data' in metafunc.funcargnames: 
     metafunc.parametrize('data', [1,2,3,4]) 

def test_data(data): 
    assert data > 0 

[EDIT], probablemente, debo añadir que también se puede hacer eso tan simplemente como

@pytest.mark.parametrize('data', [1,2,3,4]) 
def test_data(data): 
    assert data > 0 

así que diría que py .test es un gran marco para pruebas de unidades parametrizadas ...

1

Puede crear pruebas dinámicamente basándose en el conjunto de datos de la siguiente manera:

import unittest 

data_set = [1,2,3,4] 

class TestFunctions(unittest.TestCase): 
    pass # all your non-dynamic tests here as normal 

for i in data_set: 
    test_name = "test_number_%s" % i # a valid unittest test name starting with "test_" 
    def dynamic_test(self, i=i): 
     self.assertTrue(i % 2) 
    setattr(TestFunctions, test_name, dynamic_test) 

if __name__ == '__main__': 
    unittest.main() 

La pregunta Python unittest: Generate multiple tests programmatically? tiene una mayor discusión de este, incluyendo another approach que logra lo mismo mediante la creación dinámica de varias instancias de la prueba caso en una suite de prueba.

Cuestiones relacionadas