tiempo real matrices graficos grafico graficas graficar coordenadas barras python unit-testing

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