我正在使用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()
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()
答案 0 :(得分:16)
数据库被拆除并重新加载每个测试方法,而不是测试类。因此,您的用户每次都会丢失。在setUp
而不是setUpClass
中执行此操作。
答案 1 :(得分:11)
由于您使用的是LiveServerTestCase,因此它几乎与TransactionTestCase相同,后者为每个运行的测试用例创建和销毁数据库(截断表)。
所以你真的无法用LiveServerTestCase做全局数据。
答案 2 :(得分:0)
您应该可以按以下方式使用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()
您可以从MembershipTests中的TestCase
继承而不是更改基类,但是每次需要测试数据时都必须这样做。
请注意,我还删除了def setUp: pass
,因为这会破坏事务处理。
查看此线程以获取更多详细信息:https://groups.google.com/forum/#!topic/django-developers/sr3gnsc8gig
让我知道您是否遇到此解决方案的任何问题!