本文介绍 django.test.LiveServerTestCase
的用法。
声明
class LiveServerTestCase
LiveServerTestCase
与
基本相同,但有一个额外函数:它在设置时在后台启动一个实时 Django 服务器,并在拆卸时将其关闭。这允许使用除 Django 虚拟客户端之外的自动化测试客户端,例如 Selenium 客户端,在浏览器中执行一系列函数测试并模拟真实用户的操作。TransactionTestCase
实时服务器侦听 localhost
并绑定到端口 0,该端口使用操作系统分配的空闲端口。在测试期间,可以使用self.live_server_url
访问服务器的 URL。
为了演示如何使用 LiveServerTestCase
,让我们编写一个 Selenium 测试。首先,您需要将selenium package 安装到您的 Python 路径中:
$ python -m pip install selenium
...\> py -m pip install selenium
然后,将基于 LiveServerTestCase
的测试添加到应用的测试模块(例如:myapp/tests.py
)。对于此示例,我们假设您正在使用
应用程序并希望在执行测试期间提供静态文件,类似于我们在开发时使用 staticfiles
DEBUG=True
获得的文件,即无需使用收集它们
。我们将使用提供该函数的collectstatic
子类。如果不需要,将其替换为 StaticLiveServerTestCase
django.test.LiveServerTestCase
。
此测试的代码可能如下所示:
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from selenium.webdriver.firefox.webdriver import WebDriver
class MySeleniumTests(StaticLiveServerTestCase):
fixtures = ['user-data.json']
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.selenium = WebDriver()
cls.selenium.implicitly_wait(10)
@classmethod
def tearDownClass(cls):
cls.selenium.quit()
super().tearDownClass()
def test_login(self):
self.selenium.get('%s%s' % (self.live_server_url, '/login/'))
username_input = self.selenium.find_element_by_name("username")
username_input.send_keys('myuser')
password_input = self.selenium.find_element_by_name("password")
password_input.send_keys('secret')
self.selenium.find_element_by_xpath('//input[@value="Log in"]').click()
最后,您可以按如下方式运行测试:
$ ./manage.py test myapp.tests.MySeleniumTests.test_login
...\> manage.py test myapp.tests.MySeleniumTests.test_login
此示例将自动打开 Firefox,然后转到登录页面,输入凭据并按 “Log in” 按钮。如果您没有安装 Firefox 或希望使用其他浏览器,Selenium 提供了其他驱动程序。上面的例子只是 Selenium 客户端可以做的一小部分;查看full reference了解更多详情。
注意
当使用内存中的 SQLite 数据库运行测试时,相同的数据库连接将由两个线程并行共享:运行实时服务器的线程和运行测试用例的线程。防止两个线程通过此共享连接同时进行数据库查询很重要,因为这有时可能会随机导致测试失败。所以需要保证两个线程不会同时访问数据库。特别是,这意味着在某些情况下(例如,在单击链接或提交表单之后),您可能需要检查 Selenium 是否接收到响应以及是否已加载下一页,然后再继续执行进一步的测试。例如,通过让 Selenium 等到在响应中找到 <body>
HTML 标记(需要 Selenium > 2.13)来执行此操作:
def test_login(self):
from selenium.webdriver.support.wait import WebDriverWait
timeout = 2
...
self.selenium.find_element_by_xpath('//input[@value="Log in"]').click()
# Wait until the response is received
WebDriverWait(self.selenium, timeout).until(
lambda driver: driver.find_element_by_tag_name('body'))
这里的棘手之处在于,实际上并没有“页面加载”之类的东西,尤其是在服务器生成初始文档后动态生成 HTML 的现代 Web 应用程序中。因此,检查响应中是否存在<body>
可能不一定适用于所有用例。请参阅Selenium FAQ 和Selenium documentation 了解更多信息。
相关用法
- Python List remove()用法及代码示例
- Python List insert()用法及代码示例
- Python Django Library.filter用法及代码示例
- Python Django Library.inclusion_tag用法及代码示例
- Python List clear()用法及代码示例
- Python List reverse()用法及代码示例
- Python Django LineString.y用法及代码示例
- Python List append()用法及代码示例
- Python List cmp()用法及代码示例
- Python List pop()用法及代码示例
- Python List index()用法及代码示例
- Python List sort()用法及代码示例
- Python Django LinearRing用法及代码示例
- Python Django ListView用法及代码示例
- Python Django LineString.x用法及代码示例
- Python List list()用法及代码示例
- Python List max()用法及代码示例
- Python List count()用法及代码示例
- Python List len()用法及代码示例
- Python Django LineString用法及代码示例
- Python List min()用法及代码示例
- Python Django Library.simple_tag用法及代码示例
- Python List copy()用法及代码示例
- Python Django LineString.z用法及代码示例
- Python List extend()用法及代码示例
注:本文由纯净天空筛选整理自djangoproject.com大神的英文原创作品 django.test.LiveServerTestCase。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。