python - real - Ejecutar setUp solo una vez
matplotlib python (5)
La versión de My Python es 2.6.
Me gustaría ejecutar el método setUp solo una vez, ya que estoy haciendo cosas que son necesarias para cada prueba.
Mi idea era crear una var booleana que se establecerá en ''true'' después de la primera ejecución.
class mySelTest(unittest.TestCase):
setup_done = False
def setUp(self):
print str(self.setup_done)
if self.setup_done:
return
self.setup_done = True
print str(self.setup_done)
La salida:
False
True
--- Test 1 ---
False
True
--- Test 2 ---
¿Por qué esto no funciona? ¿Me perdí algo?
Coloque todo el código que desee configurar una vez fuera de mySelTest.
setup_done = False
class mySelTest(unittest.TestCase):
def setUp(self):
print str(setup_done)
if setup_done:
return
setup_done = True
print str(setup_done)
Otra posibilidad es tener una clase Singleton que setUp()
instancia en setUp()
, que solo ejecutará el código __new__
una vez y devolverá la instancia del objeto para el resto de las llamadas. Ver: ¿Hay una manera simple y elegante de definir singletons?
class Singleton(object):
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(
cls, *args, **kwargs)
# PUT YOUR SETUP ONCE CODE HERE!
cls.setUpBool = True
return cls._instance
class mySelTest(unittest.TestCase):
def setUp(self):
# The first call initializes singleton, ever additional call returns the instantiated reference.
print(Singleton().setUpBool)
Tu manera también funciona.
No intente deducer las llamadas a setUp, simplemente llámelo una vez.
Por ejemplo:
class MyClass(object):
...
def _set_up():
code to do one-time setup
_set_up()
Esto llamará a _set_up () cuando el módulo se cargue por primera vez. Lo he definido como una función de nivel de módulo, pero también podrías convertirlo en un método de clase de MyClass.
Puede usar setUpClass
para definir métodos que solo se ejecutan una vez por conjunto de pruebas.
setup_done es una variable de clase, no una variable de instancia.
Lo está haciendo referencia como una variable de instancia:
self.setup_done
Pero necesita referenciarlo como una variable de clase:
mySelTest.setup_done
Aquí está el código corregido:
class mySelTest(unittest.TestCase):
setup_done = False
def setUp(self):
print str(mySelTest.setup_done)
if mySelTest.setup_done:
return
mySelTest.setup_done = True
print str(mySelTest.setup_done)
La respuesta de Daniel es correcta, pero aquí hay un ejemplo para evitar algunos errores comunes que encontré, como no llamar a super()
en setUpClass()
.
La documentación de setUpClass()
no menciona que debe llamar a super()
. Obtendrá un error si no lo hace, como se ve en esta pregunta relacionada .
class SomeTest(TestCase):
def setUp(self):
self.user1 = UserProfile.objects.create_user(resource=SomeTest.the_resource)
@classmethod
def setUpClass(cls):
""" get_some_resource() is slow, to avoid calling it for each test use setUpClass()
and store the result as class variable
"""
super(SomeTest, cls).setUpClass()
cls.the_resource = get_some_resource()