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