Django功能LiveServerTestCase - 使用selenium提交表单后,对象保存到非测试数据库

时间:2013-07-02 20:20:22

标签: python django

绝对失去了我的大脑。我无法弄清楚为什么会这样。每次运行此测试时,对象都会保存到正常的非测试数据库中。但是,测试结束时的两个断言都会失败,说他们无法在数据库中找到任何用户,即使每次测试运行,我都必须进入管理员删除它在localhost上创建的对象。我在我的设置中使用SQLITE3,我知道SQLITE测试应该在内存中运行,而不是命中数据库。我搜索并搜索过,在网上找不到任何有用的信息。这是测试功能:

 import time
import datetime

from django.test import TestCase, LiveServerTestCase
from django.core.urlresolvers import resolve
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from django.contrib.auth.models import User

from apps.registration.forms import RegistrationForm

class NewVisitorTest(LiveServerTestCase):

    def setUp(self):
        self.browser = webdriver.Firefox()
        self.browser.implicitly_wait(3)

    def tearDown(self):
        self.browser.quit()

    def test_registration_process(self):

        # Goes to registration page

        self.browser.get('http://localhost:8000/register/')

        # User can find sign up form
        registration_form = self.browser.find_element_by_id('id_registration_form')

        # User can fill out sign up form
        first_name_input = self.browser.find_element_by_id('id_first_name')
        first_name_input.send_keys('Jim')

        last_name_input = self.browser.find_element_by_id('id_last_name')
        last_name_input.send_keys('Barrow')

        date = datetime.date.today()
        date_input = self.browser.find_element_by_id('id_birthday')
        date_input.send_keys(str(date))

        username_input = self.browser.find_element_by_id('id_username')
        username_input.send_keys('jim_barrow')

        password_input = self.browser.find_element_by_id('id_password')
        password_input.send_keys('kittensarecute')

        password_1_input = self.browser.find_element_by_id('id_password1')
        password_1_input.send_keys('kittensarecute')

        email_input = self.browser.find_element_by_id('id_email')
        email_input.send_keys('jim_barrow@gmail.com')

        # User can submit sign up form
        registration_form.submit()

        # User is now registered as a user object
        users = User.objects.all()
        self.assertEqual(len(users), 1)

        # User is now registered as a person object
        persons = Person.objects.all()
        self.assertEqual(len(persons), 1)

if __name__ == '__main__':
    unittest.main()

如果我能提供其他任何背景信息,我很乐意向您展示。这实际上是一个空白项目,因此settings.py中没有任何奇怪或不寻常的设置可能会使事情变得混乱。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:12)

根据the LiveServerTestCase docs,默认情况下,实时服务器位于端口8081上。但是,您将从端口8000获取页面。

我希望您在端口8000上运行开发服务器,并且您的测试正在连接到它,因此您的新对象将出现在非测试数据库中。您需要更改代码以从端口8081获取页面。

答案 1 :(得分:3)

快速更新:

从Django 1.11开始,LiveServerTestCase的服务器设置使用 localhost分配的任何空闲端口,而不仅仅是8081。

根据docs

,您可以使用self.live_server_url访问实时服务器网址和端口