8

我已经使用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或某些StagingServerTestCase子类TransactionTestCase)。这一点也不逊色,而且我的 IDE 也可能不会喜欢它。
  • 编写委托给StaticLiveServerTestCaseTransactionTestCase(组合而不是继承)的第三个类。看起来要完成这一件事需要做很多工作。
4

2 回答 2

2

尽管这种 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 可以与本地和远程服务器一起使用,看看它的设置

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

于 2016-05-08T14:33:33.010 回答