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()