unittest unit tests run examples example espaƱol assertraises assertequal python unit-testing

python - tests - Unittest setUp/teardown para varias pruebas



unittest python 3 (3)

¿Hay una función que se dispara al principio / final de un escenario de pruebas? Las funciones setUp y tearDown se activan antes / después de cada prueba individual.

Normalmente me gustaría tener esto:

class TestSequenceFunctions(unittest.TestCase): def setUpScenario(self): start() #launched at the beginning, once def test_choice(self): element = random.choice(self.seq) self.assertTrue(element in self.seq) def test_sample(self): with self.assertRaises(ValueError): random.sample(self.seq, 20) for element in random.sample(self.seq, 5): self.assertTrue(element in self.seq) def tearDownScenario(self): end() #launched at the end, once

Por ahora, estos setUp y TearDown son pruebas unitarias y se extienden en todos mis escenarios (que contienen muchas pruebas), uno es la primera prueba, el otro es la última prueba.


A partir de 2.7 (según la documentación ), se setUpClass y tearDownClass que se ejecutan antes y después de ejecutar las pruebas en una clase determinada, respectivamente. Alternativamente, si tiene un grupo de ellos en un archivo, puede usar setUpModule y tearDownModule ( documentation ).

De lo contrario, probablemente la mejor opción sea crear su propio TestSuite derivado y anular el run() . Todas las otras llamadas serían manejadas por el padre, y ejecutar llamaría a su configuración y código de desmontaje alrededor de una llamada al método de run del padre.


Para Python 2.5, y cuando se trabaja con pydev, es un poco difícil. Parece que pydev no usa el banco de pruebas, pero encuentra todos los casos de prueba individuales y los ejecuta por separado.

Mi solución para esto fue usar una variable de clase como esta:

class TestCase(unittest.TestCase): runCount = 0 def setUpClass(self): pass # overridden in actual testcases def run(self, result=None): if type(self).runCount == 0: self.setUpClass() super(TestCase, self).run(result) type(self).runCount += 1

Con este truco, cuando usted hereda de esta TestCase (en lugar de la unittest.TestCase original), también heredará la runCount de 0. Luego, en el método de ejecución, se revisa e incrementa runCount de la prueba infantil. Esto deja la variable runCount para esta clase en 0.

Esto significa que setUpClass solo se ejecutará una vez por clase y no una vez por instancia.

Todavía no tengo el método tearDownClass , pero creo que se podría hacer algo con ese contador.


Tengo el mismo escenario, para mí los métodos setUpClass y tearDownClass funcionan perfectamente

import unittest class Test(unittest.TestCase): @classmethod def setUpClass(cls): cls._connection = createExpensiveConnectionObject() @classmethod def tearDownClass(cls): cls._connection.destroy()