本文目录导读:

在 Django 中进行端到端(E2E)测试,最主流的工具是 Playwright 和 Selenium,还有 Cypress(主要针对前端,但也可以用于 Django)。
以下是详细的工具推荐、选择建议以及代码示例。
核心推荐:Playwright
Playwright 是目前最推荐的 Django E2E 测试工具,它比 Selenium 更快、更稳定,并且拥有更好的 API。
优点:
- 速度快: 运行速度远快于 Selenium。
- 自动等待: 内置智能等待机制,减少
time.sleep()的使用。 - 多浏览器支持: 原生支持 Chromium、Firefox、WebKit。
- API 简洁: 代码编写起来非常直观。
- 内置 Debug 工具: 支持 Trace Viewer 和 Codegen(录制操作并生成代码)。
在 Django 项目中集成 Playwright:
-
安装:
# 安装 Playwright 库 pip install pytest-playwright # 安装浏览器驱动(首次使用) playwright install
-
基本测试代码示例(使用 pytest):
# tests/test_e2e.py import pytest from playwright.sync_api import Page @pytest.mark.django_db # 如果需要操作数据库 def test_user_can_login(page: Page, live_server): # live_server 是 pytest-django 提供的 fixture,用于启动 Django 测试服务器 page.goto(f"{live_server.url}/login/") # 填写表单 page.fill('input[name="username"]', 'admin') page.fill('input[name="password"]', 'password123') # 点击提交按钮 page.click('button[type="submit"]') # 断言:登录成功后,页面跳转且包含特定文本 expect(page).to_have_url(f"{live_server.url}/dashboard/") expect(page.locator('h1')).to_contain_text("Welcome")
经典选择:Selenium
Selenium 是行业内的老牌工具,生态成熟,但如果追求现代化开发体验,它已逐渐被 Playwright 取代。
优点:
- 生态最全: 几乎支持所有语言和浏览器,有很多第三方库支持。
- 文档丰富: 遇到问题几乎都能找到解决方案。
- 移动端测试: 可以通过 Appium 扩展进行移动端测试。
缺点:
- 速度慢: 通常在浏览器与代码之间通过 WebDriver 通信,速度较慢。
- 需要手动等待: 经常需要显式等待元素加载。
- API 较冗长: 编写代码不如 Playwright 简洁。
在 Django 项目中集成 Selenium:
-
安装:
pip install selenium pytest-django # 还需要下载 chromedriver 或 geckodriver 并放到 PATH 中
-
基本测试代码示例:
# tests/test_e2e_selenium.py import pytest from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC @pytest.mark.django_db def test_user_can_login_selenium(live_server): driver = webdriver.Chrome() # 需要安装 ChromeDriver try: driver.get(f"{live_server.url}/login/") # 显式等待元素出现 wait = WebDriverWait(driver, 10) username_input = wait.until( EC.presence_of_element_located((By.NAME, "username")) ) username_input.send_keys("admin") driver.find_element(By.NAME, "password").send_keys("password123") driver.find_element(By.CSS_SELECTOR, "button[type='submit']").click() # 等待跳转并断言 wait.until(EC.url_contains("/dashboard/")) assert "/dashboard/" in driver.current_url finally: driver.quit()
其他选项
-
Cypress:
- 适用场景: 如果你的前端是 Vue/React 等 SPA(单页应用),且与后端 Django 分离开发。
- 特点: 前端开发者非常喜欢,调试体验极好(支持时间旅行),但它只能运行在 Chrome 系浏览器(基于 Electron),且主要针对前端的测试。
- Django 集成方式: 在独立的项目中运行 Cypress,测试时请确保 Django 的
runserver正在运行。
-
Django 原生
LiveServerTestCase:-
是什么: Django 内置的测试类,用于在测试用例中启动真实的 HTTP 服务器。
-
作用是: 它本身不是一个测试工具,而是 连接 Django 后端与 Playwright/Selenium 的桥梁,上面的
live_serverfixture 就是基于它实现的。 -
示例:
from django.test import LiveServerTestCase from playwright.sync_api import sync_playwright class MyE2ETest(LiveServerTestCase): def test_homepage(self): with sync_playwright() as p: browser = p.chromium.launch() page = browser.new_page() page.goto(self.live_server_url) # 使用 LiveServerTestCase 的 live_server_url # ... 断言逻辑 browser.close()
-
总结与选择建议
| 特性 | Playwright | Selenium | Cypress |
|---|---|---|---|
| 推荐指数 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| 运行速度 | 非常快 | 较慢 | 快 |
| 兼容性 | Chromium, Firefox, WebKit | 所有主流浏览器 | 仅 Chromium(Electron) |
| 自动等待 | 强(内置智能等待) | 弱(需手动编写) | 强(内置自动重试) |
| 代码简洁度 | 高 | 低 | 高 |
| 社区趋势 | ✅ 当前主流与未来趋势 | ❌ 维护模式,增长放缓 | ❌ 因商业化策略风评有争议 |
| Python 支持 | ✅ 完美 | ✅ 完美 | ❌ 不支持 Python(必须用 JS/TS) |
| 适合 Django | ✅ 首选 | ✅ 可以工作 | ⚠️ 仅当 Django 作为纯 API 后端时 |
最终建议
- 默认选择:Playwright,它的速度、自动等待机制和现代化的 API 是目前 Django 端到端测试的最佳选择,搭配
pytest-django使用效果更佳。 - 如果你必须测试 IE / Safari(旧版):选择 Selenium,但这种情况越来越少。
- 如果你是纯前端团队且快速迭代 UI:可以考虑 Cypress,但需要在独立的 CI 流程中运行,并确保 Django 后端先启动。