Persistir cambios variables entre pruebas en unittest?


¿Cómo mantengo los cambios realizados dentro del mismo objeto heredando 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 esas dos pruebas anteriores pasen

Author: A T, 2014-01-30

3 answers

Como algunos comentarios se han hecho eco, estructurar sus pruebas de esta manera es probablemente un defecto de diseño en las pruebas en sí y usted debe considerar la reestructuración de ellos. Sin embargo, si desea hacer esto y confiar en el hecho de que el corredor de prueba que está utilizando los ejecuta en un orden alfabético (aparentemente), le sugiero lo siguiente.

Similar a lo que @Matthias estaba diciendo, pero haría una cosa diferente para los casos en los que puede decidir heredar de la clase más tarde fecha.

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 aceptaste 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 otra y no tener ningún cruce entre las dos. Porque si eliges heredar de esta clase, nombrar explícitamente la referencia de clase causaría que ambas clases de prueba se ejecutaran contra esa referencia en lugar de sus propias clases respectivas.

 37
Author: rdp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-24 12:54:27

Me gusta su propia respuesta por la simplicidad de la misma, pero si desea mantener pruebas unitarias distintas:

Aparentemente unittest ejecuta pruebas separadas con instancias nuevas del TestCase. Bueno, solo ata los objetos a ser persistidos a algo más que a ti mismo. 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()

Puede que también te interesen setUpClass y tearDownClass: https://docs.python.org/3/library/unittest.html#setupclass-and-teardownclass

También tenga cuidado con la orden de ejecución de sus pruebas unitarias: https://docs.python.org/2/library/unittest.html#unittest.TestLoader.sortTestMethodsUsing

 8
Author: Matthias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-18 10:01:36

No podía averiguarlo; así que terminó pirateándolo con múltiples funciones no prefijadas 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)
 1
Author: A T,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-30 04:45:35