Playwright Python API 测试:从入门到实践
Playwright Python API 测试:从入门到实践
在现代软件开发中,API 测试是确保应用程序后端功能正常运行的关键环节。Playwright 是一个强大的自动化测试工具,支持多种编程语言,其中包括 Python。通过 Playwright,我们可以方便地对 REST API 进行测试,而无需依赖于加载页面或运行 JavaScript 代码。本文将详细介绍如何使用 Playwright for Python 进行 API 测试,从环境配置到测试用例编写,再到测试的执行与验证。
内容架构
- Playwright API 测试简介
- 介绍 Playwright 的 API 测试功能及其应用场景。
- 环境配置
- 说明如何安装 Playwright 和配置必要的环境变量。
- 编写 API 测试
- 通过具体示例展示如何使用 Playwright 的
APIRequestContext
发送 HTTP 请求。
- 通过具体示例展示如何使用 Playwright 的
- 测试用例的组织与执行
- 介绍如何使用 Pytest 框架组织测试用例,并通过 fixtures 管理测试环境。
- 测试数据的准备与清理
- 展示如何通过 API 调用准备测试数据,并在测试完成后清理资源。
- 测试用例的完整示例
- 提供一个完整的测试用例,包括创建测试仓库、创建问题、验证问题列表等。
- 进阶应用
- 介绍如何通过 API 调用准备服务器状态、验证用户操作后的服务器状态,以及如何复用认证状态。
- 总结
- 总结 Playwright 在 API 测试中的优势和适用场景。
Playwright API 测试简介
Playwright 是一个跨浏览器的自动化测试工具,支持 Chrome、Firefox 和 WebKit 等主流浏览器。除了用于前端界面的自动化测试外,Playwright 还提供了强大的 API 测试功能。通过 API 测试,我们可以直接与服务器进行交互,发送 HTTP 请求并验证响应,从而实现以下目标:
- 测试服务器端的 API 功能。
- 在测试前端功能之前,通过 API 调用准备服务器端的状态。
- 在用户操作后,通过 API 验证服务器端的状态是否符合预期。
环境配置
在开始编写 API 测试之前,我们需要先安装 Playwright 和配置必要的环境变量。以下是具体步骤:
-
安装 Playwright
使用 pip 安装 Playwright for Python:pip install playwright playwright install
-
安装 Pytest
Pytest 是一个流行的 Python 测试框架,Playwright 提供了对 Pytest 的支持,可以通过以下命令安装:pip install pytest pytest-playwright
-
配置环境变量
GitHub API 需要认证令牌(Token),因此需要在环境变量中设置GITHUB_API_TOKEN
和GITHUB_USER
:export GITHUB_API_TOKEN="your_github_token" export GITHUB_USER="your_github_username"
编写 API 测试
Playwright 的 APIRequestContext
提供了发送 HTTP 请求的功能。以下是一个简单的示例,展示如何使用 APIRequestContext
向 GitHub API 发送请求。
示例:创建 GitHub 问题
import os
import pytest
from playwright.sync_api import Playwright, APIRequestContextGITHUB_API_TOKEN = os.getenv("GITHUB_API_TOKEN")
assert GITHUB_API_TOKEN, "GITHUB_API_TOKEN is not set"GITHUB_USER = os.getenv("GITHUB_USER")
assert GITHUB_USER, "GITHUB_USER is not set"GITHUB_REPO = "test"@pytest.fixture(scope="session")
def api_request_context(playwright: Playwright) -> APIRequestContext:headers = {"Accept": "application/vnd.github.v3+json","Authorization": f"token {GITHUB_API_TOKEN}",}request_context = playwright.request.new_context(base_url="https://api.github.com", extra_http_headers=headers)yield request_contextrequest_context.dispose()
编写测试用例
以下是一个测试用例,验证是否可以通过 GitHub API 创建一个新的问题:
def test_should_create_bug_report(api_request_context: APIRequestContext) -> None:data = {"title": "[Bug] report 1","body": "Bug description",}new_issue = api_request_context.post(f"/repos/{GITHUB_USER}/{GITHUB_REPO}/issues", data=data)assert new_issue.okissues = api_request_context.get(f"/repos/{GITHUB_USER}/{GITHUB_REPO}/issues")assert issues.okissues_response = issues.json()issue = list(filter(lambda issue: issue["title"] == "[Bug] report 1", issues_response))[0]assert issueassert issue["body"] == "Bug description"
测试用例的组织与执行
在 Playwright 中,测试用例通常使用 Pytest 框架进行组织和执行。Pytest 提供了强大的 fixtures 功能,可以用于管理测试环境的初始化和清理。
使用 fixtures 管理测试环境
以下是一个使用 fixtures 管理测试环境的示例:
@pytest.fixture(scope="session", autouse=True)
def create_test_repository(api_request_context: APIRequestContext) -> None:# Before allnew_repo = api_request_context.post("/user/repos", data={"name": GITHUB_REPO})assert new_repo.okyield# After alldeleted_repo = api_request_context.delete(f"/repos/{GITHUB_USER}/{GITHUB_REPO}")assert deleted_repo.ok
在这个示例中,create_test_repository
fixture 在所有测试用例执行之前创建一个新的 GitHub 仓库,并在所有测试用例执行完成后删除该仓库。
测试数据的准备与清理
在测试过程中,我们通常需要准备一些测试数据,并在测试完成后清理这些数据,以确保测试环境的干净和稳定。以下是一个完整的测试用例,包括测试数据的准备和清理:
完整测试用例
import os
import pytest
from playwright.sync_api import Playwright, APIRequestContextGITHUB_API_TOKEN = os.getenv("GITHUB_API_TOKEN")
assert GITHUB_API_TOKEN, "GITHUB_API_TOKEN is not set"GITHUB_USER = os.getenv("GITHUB_USER")
assert GITHUB_USER, "GITHUB_USER is not set"GITHUB_REPO = "test"@pytest.fixture(scope="session")
def api_request_context(playwright: Playwright) -> APIRequestContext:headers = {"Accept": "application/vnd.github.v3+json","Authorization": f"token {GITHUB_API_TOKEN}",}request_context = playwright.request.new_context(base_url="https://api.github.com", extra_http_headers=headers)yield request_contextrequest_context.dispose()@pytest.fixture(scope="session", autouse=True)
def create_test_repository(api_request_context: APIRequestContext) -> None:# Before allnew_repo = api_request_context.post("/user/repos", data={"name": GITHUB_REPO})assert new_repo.okyield# After alldeleted_repo = api_request_context.delete(f"/repos/{GITHUB_USER}/{GITHUB_REPO}")assert deleted_repo.okdef test_should_create_bug_report(api_request_context: APIRequestContext) -> None:data = {"title": "[Bug] report 1","body": "Bug description",}new_issue = api_request_context.post(f"/repos/{GITHUB_USER}/{GITHUB_REPO}/issues", data=data)assert new_issue.okissues = api_request_context.get(f"/repos/{GITHUB_USER}/{GITHUB_REPO}/issues")assert issues.okissues_response = issues.json()issue = list(filter(lambda issue: issue["title"] == "[Bug] report 1", issues_response))[0]assert issueassert issue["body"] == "Bug description"
进阶应用
通过 API 调用准备服务器状态
在某些测试场景中,我们可能需要在用户操作之前通过 API 调用准备服务器的状态。以下是一个示例,展示如何通过 API 创建问题,并验证问题是否出现在页面上:
def test_last_created_issue_should_be_first_in_the_list(api_request_context: APIRequestContext, page: Page) -> None:def create_issue(title: str) -> None:data = {"title": title,"body": "Feature description",}new_issue = api_request_context.post(f"/repos/{GITHUB_USER}/{GITHUB_REPO}/issues", data=data)assert new_issue.okcreate_issue("[Feature] request 1")create_issue("[Feature] request 2")page.goto(f"https://github.com/{GITHUB_USER}/{GITHUB_REPO}/issues")first_issue = page.locator("a[data-hovercard-type='issue']").firstexpect(first_issue).to_have_text("[Feature] request 2")
验证用户操作后的服务器状态
在用户通过界面完成操作后,我们可以通过 API 验证服务器的状态是否符合预期