Django LiveServerTestCase: Пользователь, созданный в методе setUpClass, недоступен в test_method?

Я использую Django 1.4 LiveServerTestCase для тестирования Selenium, и у меня возникают проблемы с методом класса setUpClass. Насколько я понимаю, MembershipTests.setUpClass запускается один раз перед запуском модульных тестов.

Я добавил код для добавления пользователя в базу данных в MembershipTests.setUpClass, но когда я запускаю тест MembershipTests.test_signup, в базу данных тестов не добавлен пользователь. Что я делаю неправильно? Я ожидаю, что пользователь, созданный мной в setUpClass, будет доступен во всех модульных тестах.

Если я поместил код создания пользователя в MembershipTests.setUp и запустил MembershipTests.test_signup, я могу видеть пользователя, но не хочу, чтобы этот запуск выполнялся до каждых unit test как setUp. Как вы можете видеть, я использую собственный класс LiveServerTestCase для добавления базовых функций во все мои тесты (test_utils.CustomLiveTestCase). Я подозреваю, что это имеет какое-то отношение к моей проблеме.

Спасибо заранее.

test_utils.py

from selenium.webdriver.firefox.webdriver import WebDriver
from django.test import LiveServerTestCase

class CustomLiveTestCase(LiveServerTestCase):

    @classmethod
    def setUpClass(cls):
        cls.wd = WebDriver()
        super(CustomLiveTestCase, cls).setUpClass()

    @classmethod
    def tearDownClass(cls):
        cls.wd.quit()
        super(CustomLiveTestCase, cls).tearDownClass()

tests.py

from django.contrib.auth.models import User
from django.test.utils import override_settings
from test_utils import CustomLiveTestCase 
from test_constants import *

@override_settings(STRIPE_SECRET_KEY='xxx', STRIPE_PUBLISHABLE_KEY='xxx')
class MembershipTests(CustomLiveTestCase):

    fixtures = [
        'account_extras/fixtures/test_socialapp_data.json',
        'membership/fixtures/basic/plan.json',
    ]

    def setUp(self):
        pass

    @classmethod
    def setUpClass(cls):
        super(MembershipTests, cls).setUpClass()
        user = User.objects.create_user(
            TEST_USER_USERNAME,
            TEST_USER_EMAIL,
            TEST_USER_PASSWORD
        )

    def test_signup(self):
        print "users: ", User.objects.all()

Ответ 1

Поскольку вы используете LiveServerTestCase, он почти такой же, как TransactionTestCase, который создает и уничтожает базу данных (обрезает таблицы) для каждого тестового теста.

Таким образом, вы действительно не можете делать глобальные данные с помощью LiveServerTestCase.

Ответ 2

База данных срывается и перезагружается по каждому методу тестирования, а не по тестовому классу. Таким образом, ваш пользователь будет потерян каждый раз. Сделайте это в setUp не setUpClass.

Ответ 3

Вы должны быть в состоянии использовать TestCase.setUpTestData следующим образом (небольшие изменения в вашем базовом классе):

test_utils.py:

from selenium.webdriver.firefox.webdriver import WebDriver
from django.test import LiveServerTestCase, TestCase

class CustomLiveTestCase(LiveServerTestCase, TestCase):

    @classmethod
    def setUpClass(cls):
        cls.wd = WebDriver()
        super(CustomLiveTestCase, cls).setUpClass()

    @classmethod
    def tearDownClass(cls):
        cls.wd.quit()
        super(CustomLiveTestCase, cls).tearDownClass()

tests.py:

from django.contrib.auth.models import User
from django.test.utils import override_settings
from test_utils import CustomLiveTestCase
from test_constants import *

@override_settings(STRIPE_SECRET_KEY='xxx', STRIPE_PUBLISHABLE_KEY='xxx')
class MembershipTests(CustomLiveTestCase):

    fixtures = [
        'account_extras/fixtures/test_socialapp_data.json',
        'membership/fixtures/basic/plan.json',
    ]

    @classmethod
    def setUpTestData(cls):
        super(MembershipTests, cls).setUpTestData()
        user = User.objects.create_user(
            TEST_USER_USERNAME,
            TEST_USER_EMAIL,
            TEST_USER_PASSWORD
        )

    def test_signup(self):
        print "users: ", User.objects.all()

Вместо того, чтобы изменять базовый класс, вы можете наследовать от TestCase в MembershipTests, но вам придется делать это каждый раз, когда вам нужны тестовые данные.

Обратите внимание, что я также удалил def setUp: pass, так как это нарушит обработку транзакций.

Проверьте эту тему для получения дополнительной информации: https://groups.google.com/forum/#!topic/django-developers/sr3gnsc8gig

Дайте мне знать, если у вас возникнут проблемы с этим решением!