Глобальная настройка в тестовой среде django?

Есть ли какой-то способ (используя стандартную структуру Django.test.TestCase) для выполнения глобальной инициализации определенных переменных, так что это происходит только один раз.

Помещение вещей setUp() делает его таким, чтобы переменные инициализировались перед каждым тестом, что убивает производительность, когда установка включает дорогостоящие операции. Я хотел бы запустить функцию типа установки один раз, а затем инициализировать переменные здесь, чтобы они были видны всем моим тестам.

Я бы предпочел не переписывать структуру тестового бегуна.

Я думаю о чем-то подобном предыдущему (: all) в мире Ruby/RSpec.

-S

Ответ 1

Вам не нужно "переписывать всю структуру тестового бегуна", но вам нужно будет создать пользовательский test_runner (вы можете просто скопировать существующий и изменить его, чтобы включить ваш глобальный код настройки). Это около 100 строк кода. Затем установите параметр TEST_RUNNER, чтобы указать на свой пользовательский бегун и уйти.

Ответ 2

Это частично рассматривается в более новых версиях python/django с помощью setUpClass(), который, по крайней мере, позволит мне запускать настройку уровня.

Ответ 3

Как насчет класса со статическими переменными? Что-то вроде:

class InitialSetup(object):
    GEOLOCATOR = GeoLocator()
    DEFAULT_LOCATION = GEOLOCATOR.get_geocode_object(settings.DEFAULT_ADDRESS, with_country=True)

    def setUp(self):
        self.geolocator = InitialSetup.GEOLOCATOR
        self.default_location = InitialSetup.DEFAULT_LOCATION
        p = Page.objects.create(site_id=settings.SITE_ID, template='home_page.html')
        p.publish()
        self.client = Client()


class AccessTest(InitialSetup, Testcase):  # Diamond inheritance issue! inheritance order matters
    def setUp(self):
        super(AccessTest, self).setUp()


    def test_access(self):
        # Issue a GET request.
        response = self.client.get('/')

        # Check that the response is 200 OK.
        self.assertEqual(response.status_code, 200)