在临时服务器上使用Django的StaticLiveServerCase

8 投票
2 回答
824 浏览
提问于 2025-04-18 18:05

我用StaticLiveServerCase写了一些功能测试。这在本地测试时效果很好,但现在我想测试我的预发布服务器。正在阅读的书的作者建议了一个小技巧:

import sys
[...]

class NewVisitorTest(StaticLiveServerCase):

    @classmethod
    def setUpClass(cls):
        for arg in sys.argv:
            if 'liveserver' in arg:
                cls.server_url = 'http://' + arg.split('=')[1]
                return
        super().setUpClass()
        cls.server_url = cls.live_server_url

    @classmethod
    def tearDownClass(cls):
        if cls.server_url == cls.live_server_url:
            super().tearDownClass()

    # Now use self.server_url instead of self.live_server_url

我调整了代码,让它在不使用“临时服务器”的时候调用super(LiveServerTestCase, cls).setUpClass()(还有tearDownClass),因为直接忽略父类的实现感觉不太对。

不过这仍然是个小技巧,我想知道有没有更好的解决方案。Django确实有一个--liveserver参数,但它只能用来改变临时服务器的绑定。

到目前为止,我想到了以下几种方法:

  • 创建一个StaticLiveServerCase的子类,解析参数,按需更改live_server_url属性,让临时服务器在不使用时启动/停止。这样做会影响一些性能,并且理论上会让测试变得不那么可靠。
  • 利用Python的动态类型特性,在运行时确定基类(StaticLiveServerCase或某个继承自TransactionTestCaseStagingServerTestCase)。这也不算是个好办法,我的IDE可能也不会喜欢这样。
  • 写一个第三个类,负责调用StaticLiveServerTestCaseTransactionTestCase(使用组合而不是继承)。为了实现这一点,看起来需要做很多工作。

2 个回答

0

Django可以直接和Selenium一起使用,甚至不需要像django-selenium这样的第三方包。其实这样做会更简单。你可以在自己的开发机器上使用LiveServerTestCase进行测试。其实在大多数情况下,StaticLiveServerTestCase并不是必需的。

from selenium import webdriver
os.environ['DJANGO_LIVE_TEST_SERVER_ADDRESS'] = 'localhost:8082'

class MySeleniumTest(LiveServerTestCase):

    def setup_webdriver(self, driver_name = 'Firefox', mobile_emulation = None, 
                    implicit_wait = None, desired_capabilities = None):

        if driver_name == 'Firefox':
            profile = webdriver.FirefoxProfile('/home/raditha/.mozilla/firefox/bjfo3emg.selenium/')
            self.driver = webdriver.Firefox()     
            self.driver.set_window_position(1200, 0)
            self.driver.maximize_window()    
            self.driver.implicitly_wait(10)
            self.driver.set_page_load_timeout(5)

     def test_something(self):
         p = self.driver.get('http://localhost:8082')
         self.assertEqual(self.driver.get_title(),'My Home Page')

如果你想在生产服务器上进行测试,也可以使用unittest.TestCase来代替LiveServerTestCase,这样可以避免所有相关的速度慢的问题。你也可以用同样的方法在开发服务器上进行测试。

2

虽然这个方法可能有效,但我觉得用专门测试远程服务器的工具会更好。

最常用的工具是 Selenium,它和Django的结合非常不错。用 Django + Selenium 进行测试,和你之前用 StaticLiveServerTestCase 做的测试很相似,比如:

class MyTestCase(SeleniumLiveTestCase):

    def test_home(self):
        self.driver.open_url(reverse('main'))
        self.assertEquals(self.driver.get_title(), 'Sample Test Page')
        self.driver.type_in('input#id_query', 'search something')
        self.driver.click('.form-search button[type="submit"]')

        self.assertEquals(self.driver.get_text('#success'), 'SUCCESS')

Django-Selenium 可以在本地和远程服务器上使用,具体设置可以查看 这里

撰写回答