当我运行多个测试时,Django LiveServerTestCase无法加载页面

时间:2015-03-31 20:51:58

标签: python django selenium selenium-webdriver

我正在尝试在一个Django LiveServerTestCase中运行多个测试。当我运行任何单个测试(其他人评论)时,一切都按预期工作。但是当我运行带有两个测试的测试用例时,第一个工作正常,但第二个用“内部服务器错误”消息加载页面。

代码:

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(),它会因“错误98:地址已在使用”而失败,类似于this情况除外我只有在我有多个测试时才会出错一个LiveServerTestCase类或一个.py文件中的多个测试用例。

如何在tearDown上创建LiveServerTestCase空闲端口(如果是核心问题)?

有没有解决方法?我想要的只是在本地和远程服务器上运行的功能性selenium测试。

我使用的是Django 1.6.7,Firefox 37.0,Selenium 2.45.0

UPD

使用方法而不是类方法会导致同样的问题。

def setUp(self):
    self.driver = WebDriver()
    self.url = self.live_server_url    

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

1 个答案:

答案 0 :(得分:2)

最后,"内部服务器错误的原因"消息是WebDriver从quit()中删除数据库中的所有数据,包括contenttypes和其他默认表

在下次测试开始时尝试加载灯具时会出错。

NB 此行为实际上是由于TransactionTestCaseLiveServerTestCase继承)在测试运行后重置数据库的方式:it truncates all tables


到目前为止,我的解决方案是在每次测试运行时加载包含所有数据(也包括#34;默认" 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()问题上指出了这个刷新数据库!