13

我正在使用 Django 1.4 的 LiveServerTestCase 进行 Selenium 测试,并且在使用setUpClass类方法时遇到了问题。据我了解MembershipTests.setUpClass,在运行单元测试之前运行一次。

我已经将代码添加到数据库中,MembershipTests.setUpClass但是当我运行MembershipTests.test_signup测试时,没有用户被添加到测试数据库中。我做错了什么?我希望我创建的用户setUpClass在所有单元测试中都可用。

如果我将用户创建代码放入MembershipTests.setUp并运行,MembershipTests.test_signup我可以看到用户,但不希望在每个单元测试之前运行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()

测试.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()
4

3 回答 3

17

数据库被拆除并在每个测试方法上重新加载,而不是在测试类上。因此,您的用户每次都会丢失。不这样setUpsetUpClass

于 2013-02-20T16:36:58.237 回答
14

由于您使用的是 LiveServerTestCase,它几乎与 TransactionTestCase 相同,它为每个运行的测试用例创建和销毁数据库(截断表)。

所以你真的不能用 LiveServerTestCase 做全局数据。

于 2013-02-21T15:39:25.793 回答
2

您应该能够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()

测试.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()

您可以从 MembershipTests 中继承而不是更改基类,TestCase但是每次需要测试数据时都必须这样做。

请注意,我还删除了def setUp: pass,因为这会破坏事务处理。

查看此线程以获取更多详细信息:https ://groups.google.com/forum/#!topic/django-developers/sr3gnsc8gig

如果您遇到此解决方案的任何问题,请告诉我!

于 2019-05-03T18:22:03.767 回答