【问题标题】:Using Django's StaticLiveServerCase with staging server as well将 Django 的 StaticLiveServerCase 与登台服务器一起使用
【发布时间】:2014-08-21 14:57:17
【问题描述】:

我已经使用StaticLiveServerCase 进行了一些功能测试。这非常适合本地测试,但现在我也想测试我的登台服务器。 the book I'm reading 的作者建议以下 hack:

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),因为直接忽略(祖)父级的实现感觉不对。

仍然是一个 hack,我想知道是否存在更清洁的解决方案。 Django 确实有自己的--liveserver 参数,但它只能用于更改临时服务器的绑定。

到目前为止,我提出了以下想法:

  • 子类化StaticLiveServerCase 以解析参数,相应地更改live_server_url 属性,并让临时服务器刚刚启动/停止而未使用。会消耗一些性能,并且在理论上会降低测试的可靠性。
  • 在运行时利用 Python 的动态类型确定基类(StaticLiveServerCase 或某些StagingServerTestCase 子类化TransactionTestCase)。这一点也不逊色,我的 IDE 可能也不喜欢它。
  • 编写委托给StaticLiveServerTestCaseTransactionTestCase 的第三个类(组合而不是继承)。看起来要完成这一件事需要做很多工作。

【问题讨论】:

  • @hwjp 只是给你一个 ping 以便你也知道我的问题。
  • 这里有同样的问题。在我的 Windows 机器上运行 FT 时出现以下错误:“[Errno 10013] 尝试以访问权限禁止的方式访问套接字”。我找到的解决方案是使用 --liveserver=localhost:8000 (或任何其他端口)。书中建议的 hack 破坏了我的 hacky 修复:-)
  • --liveserver 参数有什么问题?
  • 老问题,但您实际上不是在谈论 StaticLiveServerTestCase

标签: python django unit-testing django-1.7


【解决方案1】:

虽然这个 hack 可能会奏效,但我认为使用用于测试远程服务器的工具会更好。

最著名的工具是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 可用于本地和远程服务器,请查看its settings

【讨论】:

    【解决方案2】:

    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 来做到这一点,并避免与之相关的所有减速。您也可以使用相同的方法对开发服务器进行测试。

    【讨论】:

      猜你喜欢
      • 2018-10-05
      • 1970-01-01
      • 2013-04-30
      • 2011-02-01
      • 2016-05-07
      • 2014-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多