2012-05-13 11 views
6

me gustaría utilizar un self.attr de una clase unittest.TestCase, sin embargo, parece que no es persistente entre las pruebas:self.attr restablece entre las pruebas en unittest.TestCase

import unittest 

class TestNightlife(unittest.TestCase): 
    _my_param = 0 

    def test_a(self): 
     print 'test A = %d' % self._my_param 
     self._my_param = 1 

    def test_b(self): 
     print 'test B = %d' % self._my_param 
     self._my_param = 2 

if __name__ == "__main__": 
    unittest.main() 

Esto da el siguiente resultado:

test A = 0 
test B = 0 

¿La instancia de unittest.TestCase cambia entre las ejecuciones de prueba? ¿Por qué?

+0

** motivación: ** Por supuesto que no se puede asumir pedido de prueba, pero a veces una cierta prueba cambia algo en el medio ambiente y otra prueba debe saber si ya tiene ha sido cambiado o no para tomar o abstenerse de ciertas acciones. A veces es más simple y más legible mantener esta información en una variable en lugar de tener funciones auxiliares que inspeccionan informan el estado. Incluso si no está de acuerdo con esta idea, sigue siendo interesante saber qué pasa con el "yo" entre las pruebas, por lo que la pregunta es interesante – Jonathan

Respuesta

7

Funciona de esa manera porque unittest.main() crea objetos separados para cada prueba (en este caso se crean dos objetos).

Acerca de su motivación: la prueba no debe cambiar el estado global. Debería revertir estado global a estado antes de probar en tearDown o probarse a sí mismo. Es muy problemático si las pruebas cambian el estado global, caerá en escenarios que no puede predecir, tarde o temprano.

import unittest 

class TestNightlife(unittest.TestCase): 
    _my_param = 0 

    def test_a(self): 
     print 'object id: %d' % id(self) 
     print 'test A = %d' % self._my_param 
     self._my_param = 1 

    def test_b(self): 
     print 'object id: %d' % id(self) 
     print 'test B = %d' % self._my_param 
     self._my_param = 2 

if __name__ == "__main__": 
    unittest.main() 

de salida:

object id: 10969360 
test A = 0 
.object id: 10969424 
test B = 0 
. 
---------------------------------------------------------------------- 
Ran 2 tests in 0.000s 

OK 
+1

Estoy completamente de acuerdo con el estado global, sin embargo, lo estoy haciendo para acelerar las pruebas y 'practicidad beats pureity ... ' – Jonathan

+0

Por cierto, ¿tiene alguna referencia al hecho de que unittest.main() crea un objeto separado por prueba? Si es así, agrégalo y marcaré la pregunta como aceptada. – Jonathan

+0

No tengo referencia a la documentación, Unittest solo funciona de esa manera (ver código de ejemplo). –

Cuestiones relacionadas