__init__ para unittest.TestCase

122

Me gustaría agregar un par de cosas a lo que hace la unittest.TestCaseclase al inicializarse, pero no puedo averiguar cómo hacerlo.

Ahora mismo estoy haciendo esto:

#filename test.py

class TestingClass(unittest.TestCase):

    def __init__(self):
        self.gen_stubs()

    def gen_stubs(self):
        # Create a couple of tempfiles/dirs etc etc.
        self.tempdir = tempfile.mkdtemp()
        # more stuff here

Me gustaría que todos los stubs se generen solo una vez para todo este conjunto de pruebas. No puedo usar setUpClass()porque estoy trabajando en Python 2.4 (tampoco he podido hacer que eso funcione en Python 2.7).

¿Qué estoy haciendo mal aquí?

Me sale este error:

 `TypeError: __init__() takes 1 argument (2 given)` 

... y otros errores cuando muevo todo el código auxiliar __init__cuando lo ejecuto con el comando python -m unittest -v test.

novato
fuente
@Neeraj Creo que mi pregunta es anterior a esa.
incipiente
@Abhijeet Esta pregunta se hizo en 2013, la que enlazas se hizo en 2016, y tiene menos respuestas y discurso, ¿tal vez deberías marcar la otra pregunta como duplicada? La respuesta está relacionada con Python 3 y esta pregunta habla sobre Python 2.
novato
lo siento por eso mi mal.
Abhijeet

Respuestas:

166

Prueba esto:

class TestingClass(unittest.TestCase):

    def __init__(self, *args, **kwargs):
        super(TestingClass, self).__init__(*args, **kwargs)
        self.gen_stubs()

Está anulando los TestCasede __init__, por lo que es posible que desee dejar que la clase base maneje los argumentos por usted.

karthikr
fuente
+1 Inicializaría la clase base antes de llamar a cualquier método de objeto.
Joachim Isaksson
Esto no me funciona. Las cosas dentro de gen_stub no se están ejecutando. De hecho, parece que gen_stub no se está llamando en absoluto ... Puedo decirlo porque el self.tempdir que se supone que existe, no se puede acceder a través de los otros métodos de la clase. Recibo un AttributeError: el objeto 'TestingClass' no tiene atributo 'tempdir'
novato
22
¿No debería llamar a esto en setUplugar de anularlo __init__?
karthikr
2
@karthikr Quiero generar los stubs una vez para todas las pruebas en lugar de volver a crearlos para cada prueba cada vez. Algunos de los talones ni siquiera serán utilizados por algunas de las pruebas. Usaría setUpClass, pero no creo que python 2.4 lo admita.
novato
2
También puede ser un poco más explícito en este caso (lo que ayuda con la legibilidad en mi opinión) y usar: en unittest.TestCase.__init__(self,*args,**kwargs)lugar desuper(TestingClass, self).__init__(*args, **kwargs)
Onyooo
22

Solo quería agregar algunas aclaraciones sobre cómo anular la función init de

unittest.TestCase

La función se llamará antes de cada método en su clase de prueba. Tenga en cuenta que si desea agregar algunos cálculos costosos que deben realizarse una vez antes de ejecutar todos los métodos de prueba, utilice el método de clase SetUpClass

@classmethod
def setUpClass(cls):
    cls.attribute1 = some_expensive_computation()

Esta función se llamará una vez antes de todos los métodos de prueba de la clase. Consulte setUpun método que se llama antes de cada método de prueba.

Thomas Vetterli
fuente
4

Instale unittest2 y use unittest de ese paquete.

import unittest2 

y luego use la clase setupModule / tearDownModule o setupClass / tearDown para una lógica de inicialización especial

Más información: http://www.voidspace.org.uk/python/articles/unittest2.shtml

También lo más probable es que esté creando una prueba de integración más que una prueba unitaria. Elija un buen nombre para las pruebas para diferenciarlas o coloque un módulo contenedor diferente.

fabrizioM
fuente
Gracias por el enlace de documentación.
Chris