python - ¿Persiste cambios de variable entre pruebas en unittest?
unit-testing persistence (3)
¿Cómo TestCase
cambios realizados dentro del mismo objeto heredado de TestCase
en unitttest?
from unittest import TestCase, main as unittest_main
class TestSimpleFoo(TestCase):
foo = ''bar''
def setUp(self):
pass
def test_a(self):
self.assertEqual(self.foo, ''bar'')
self.foo = ''can''
def test_f(self):
self.assertEqual(self.foo, ''can'')
if __name__ == ''__main__'':
unittest_main()
Es decir: quiero que pasen esas dos pruebas anteriores
Como se han hecho eco de algunos comentarios, estructurar sus pruebas de esta manera es probablemente un defecto de diseño en las pruebas en sí y debería considerar reestructurarlas. Sin embargo, si desea hacer esto y confiar en el hecho de que el corredor de prueba que está utilizando los ejecuta en orden alfabético (aparentemente), le sugiero lo siguiente.
Similar a lo que decía @Matias, pero yo haría una cosa diferente para los casos en los que puedes decidir heredar de la clase en una fecha posterior.
from unittest import TestCase, main as unittest_main
class TestSimpleFoo(TestCase):
foo = ''bar''
def setUp(self):
pass
def test_a(self):
self.assertEqual(self.__class__.foo, ''bar'')
self.__class__.foo = ''can''
def test_f(self):
self.assertEqual(self.__class__.foo, ''can'')
if __name__ == ''__main__'':
unittest_main()
La diferencia entre esta respuesta y la respuesta de @Matthias que usted aceptó es la declaración explícita de la clase versus la búsqueda de dicha referencia de clase.
TestSimpleFoo vs self.__class__
Prefiero la dinámica para poder heredar las pruebas más tarde y ejecutar ambas clases de prueba una detrás de la otra y no tener ningún cruce entre las dos. Porque si elige heredar de esta clase, nombrar explícitamente la referencia de clase provocaría que ambas clases de prueba se ejecuten contra esa referencia en lugar de sus propias clases respectivas.
Me gusta tu propia respuesta por la simplicidad de la misma, pero si quieres mantener distintas pruebas unitarias:
Aparentemente unittest ejecuta pruebas separadas con instancias nuevas de TestCase. Bueno, solo une los objetos para persistir con otra cosa que no sea el yo. Por ejemplo:
from unittest import TestCase, main as unittest_main
class TestSimpleFoo(TestCase):
def setUp(self):
pass
def test_a(self):
TestSimpleFoo.foo = ''can''
def test_f(self):
self.assertEqual(TestSimpleFoo.foo, ''can'')
if __name__ == ''__main__'':
unittest_main()
También podría interesarle setUpClass y tearDownClass: https://docs.python.org/3/library/unittest.html#setupclass-and-teardownclass
También tenga cuidado con el orden de ejecución de las pruebas de su unidad: https://docs.python.org/2/library/unittest.html#unittest.TestLoader.sortTestMethodsUsing
No pude resolverlo; así que terminé test_
con múltiples funciones con prefijo no test_
:
def test_password_credentials_grant(self):
for user in self.user_mocks:
self.register(user)
self.login(user)
self.access_token(user, self.assertEqual) # Ensures access_token is generated+valid
self.logout(user)
self.access_token(user, self.assertNotEqual) # Ensures access_token is now invalid
self.unregister(user)