python unit-testing persistence testcase python-unittest

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)