当我 运行 多个测试时,Django LiveServerTestCase 无法加载页面
Django LiveServerTestCase fails to load a page when I run multiple tests
我正在尝试 运行 在一个 Django LiveServerTestCase 中进行多项测试。当我 运行 任何单个测试(其他人评论)时,一切都按预期进行。但是当我 运行 测试用例有两个测试时,第一个工作正常但第二个加载带有 "internal server error" 消息的页面。
代码:
from django.test import LiveServerTestCase
from selenium.webdriver.firefox.webdriver import WebDriver
class MyLiveServerTestCase(LiveServerTestCase):
"""
BaseCleass for my selenium test cases
"""
@classmethod
def setUpClass(cls):
cls.driver = WebDriver()
cls.url = cls.live_server_url
super(MyLiveServerTestCase, cls).setUpClass()
@classmethod
def tearDownClass(cls):
cls.driver.quit()
super(MyLiveServerTestCase, cls).tearDownClass()
class AdminEditFormTest(MyLiveServerTestCase):
"""
Some test case
"""
def test_valid_data(self):
"""
test when user enters correct data
"""
self.driver.get(self.url)
# ...
def test_invalid_data(self):
""" test when user enters INcorrect data """
self.driver.get(self.url)
# ...
如果我使用 close()
而不是 quit()
它会失败 "error 98: address already in use" 类似于 this 的情况,除了我只有在一个 LiveServerTestCase 中有多个测试时才会出错class 或一个 .py 文件中的多个测试用例。
如何在拆卸时使 LiveServerTestCase 空闲端口(如果它是核心问题)?
有什么解决办法吗?我想要的只是功能性硒测试 运行 在本地和远程服务器上同样地进行测试。
我正在使用 Django 1.6.7、Firefox 37.0、Selenium 2.45.0
upd
使用方法而不是 class方法会导致同样的问题。
def setUp(self):
self.driver = WebDriver()
self.url = self.live_server_url
def tearDown(self):
self.driver.quit()
最后,"internal server error" 消息的原因是 WebDriver 从 quit()
、 的数据库中删除了所有数据,包括内容类型和其他默认表。
这会导致在下一次测试开始时尝试加载固定装置时出错。
N.B. 这种行为实际上是由于 TransactionTestCase
(LiveServerTestCase
继承)在测试后重置数据库的方式运行s: it truncates all tables.
到目前为止,我的解决方案是在每个测试 运行.
中加载包含所有数据(还有 "default" Django 数据,例如内容类型)的装置
class MyLiveServerTestCase(LiveServerTestCase):
"""
BaseClass for my Selenium test cases
"""
fixtures = ['my_fixture_with_all_default_stuff_and_testing_data.json']
@classmethod
def setUpClass(cls):
cls.driver = WebDriver()
cls.url = cls.live_server_url
super(MyLiveServerTestCase, cls).setUpClass()
@classmethod
def tearDownClass(cls):
cls.driver.quit()
super(MyLiveServerTestCase, cls).tearDownClass()
感谢@help_asap 在 quit()
问题上指出这个刷新数据库!
我正在尝试 运行 在一个 Django LiveServerTestCase 中进行多项测试。当我 运行 任何单个测试(其他人评论)时,一切都按预期进行。但是当我 运行 测试用例有两个测试时,第一个工作正常但第二个加载带有 "internal server error" 消息的页面。
代码:
from django.test import LiveServerTestCase
from selenium.webdriver.firefox.webdriver import WebDriver
class MyLiveServerTestCase(LiveServerTestCase):
"""
BaseCleass for my selenium test cases
"""
@classmethod
def setUpClass(cls):
cls.driver = WebDriver()
cls.url = cls.live_server_url
super(MyLiveServerTestCase, cls).setUpClass()
@classmethod
def tearDownClass(cls):
cls.driver.quit()
super(MyLiveServerTestCase, cls).tearDownClass()
class AdminEditFormTest(MyLiveServerTestCase):
"""
Some test case
"""
def test_valid_data(self):
"""
test when user enters correct data
"""
self.driver.get(self.url)
# ...
def test_invalid_data(self):
""" test when user enters INcorrect data """
self.driver.get(self.url)
# ...
如果我使用 close()
而不是 quit()
它会失败 "error 98: address already in use" 类似于 this 的情况,除了我只有在一个 LiveServerTestCase 中有多个测试时才会出错class 或一个 .py 文件中的多个测试用例。
如何在拆卸时使 LiveServerTestCase 空闲端口(如果它是核心问题)?
有什么解决办法吗?我想要的只是功能性硒测试 运行 在本地和远程服务器上同样地进行测试。
我正在使用 Django 1.6.7、Firefox 37.0、Selenium 2.45.0
upd
使用方法而不是 class方法会导致同样的问题。
def setUp(self):
self.driver = WebDriver()
self.url = self.live_server_url
def tearDown(self):
self.driver.quit()
最后,"internal server error" 消息的原因是 WebDriver 从 quit()
、 的数据库中删除了所有数据,包括内容类型和其他默认表。
这会导致在下一次测试开始时尝试加载固定装置时出错。
N.B. 这种行为实际上是由于 TransactionTestCase
(LiveServerTestCase
继承)在测试后重置数据库的方式运行s: it truncates all tables.
到目前为止,我的解决方案是在每个测试 运行.
中加载包含所有数据(还有 "default" Django 数据,例如内容类型)的装置class MyLiveServerTestCase(LiveServerTestCase):
"""
BaseClass for my Selenium test cases
"""
fixtures = ['my_fixture_with_all_default_stuff_and_testing_data.json']
@classmethod
def setUpClass(cls):
cls.driver = WebDriver()
cls.url = cls.live_server_url
super(MyLiveServerTestCase, cls).setUpClass()
@classmethod
def tearDownClass(cls):
cls.driver.quit()
super(MyLiveServerTestCase, cls).tearDownClass()
感谢@help_asap 在 quit()
问题上指出这个刷新数据库!