当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python Django LiveServerTestCase用法及代码示例


本文介绍 django.test.LiveServerTestCase 的用法。

声明

class LiveServerTestCase

LiveServerTestCase TransactionTestCase 基本相同,但有一个额外函数:它在设置时在后台启动一个实时 Django 服务器,并在拆卸时将其关闭。这允许使用除 Django 虚拟客户端之外的自动化测试客户端,例如 Selenium 客户端,在浏览器中执行一系列函数测试并模拟真实用户的操作。

实时服务器侦听 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 FAQSelenium documentation 了解更多信息。

相关用法


注:本文由纯净天空筛选整理自djangoproject.com大神的英文原创作品 django.test.LiveServerTestCase。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。