當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。