在临时服务器上使用Django的StaticLiveServerCase
我用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
或某个继承自TransactionTestCase
的StagingServerTestCase
)。这也不算是个好办法,我的IDE可能也不会喜欢这样。 - 写一个第三个类,负责调用
StaticLiveServerTestCase
或TransactionTestCase
(使用组合而不是继承)。为了实现这一点,看起来需要做很多工作。
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 可以在本地和远程服务器上使用,具体设置可以查看 这里。