当前位置: 首页 > news >正文

Playwright Python API 测试:从入门到实践

Playwright Python API 测试:从入门到实践

在现代软件开发中,API 测试是确保应用程序后端功能正常运行的关键环节。Playwright 是一个强大的自动化测试工具,支持多种编程语言,其中包括 Python。通过 Playwright,我们可以方便地对 REST API 进行测试,而无需依赖于加载页面或运行 JavaScript 代码。本文将详细介绍如何使用 Playwright for Python 进行 API 测试,从环境配置到测试用例编写,再到测试的执行与验证。

内容架构

  1. Playwright API 测试简介
    • 介绍 Playwright 的 API 测试功能及其应用场景。
  2. 环境配置
    • 说明如何安装 Playwright 和配置必要的环境变量。
  3. 编写 API 测试
    • 通过具体示例展示如何使用 Playwright 的 APIRequestContext 发送 HTTP 请求。
  4. 测试用例的组织与执行
    • 介绍如何使用 Pytest 框架组织测试用例,并通过 fixtures 管理测试环境。
  5. 测试数据的准备与清理
    • 展示如何通过 API 调用准备测试数据,并在测试完成后清理资源。
  6. 测试用例的完整示例
    • 提供一个完整的测试用例,包括创建测试仓库、创建问题、验证问题列表等。
  7. 进阶应用
    • 介绍如何通过 API 调用准备服务器状态、验证用户操作后的服务器状态,以及如何复用认证状态。
  8. 总结
    • 总结 Playwright 在 API 测试中的优势和适用场景。

Playwright API 测试简介

Playwright 是一个跨浏览器的自动化测试工具,支持 Chrome、Firefox 和 WebKit 等主流浏览器。除了用于前端界面的自动化测试外,Playwright 还提供了强大的 API 测试功能。通过 API 测试,我们可以直接与服务器进行交互,发送 HTTP 请求并验证响应,从而实现以下目标:

  • 测试服务器端的 API 功能。
  • 在测试前端功能之前,通过 API 调用准备服务器端的状态。
  • 在用户操作后,通过 API 验证服务器端的状态是否符合预期。

环境配置

在开始编写 API 测试之前,我们需要先安装 Playwright 和配置必要的环境变量。以下是具体步骤:

  1. 安装 Playwright
    使用 pip 安装 Playwright for Python:

    pip install playwright
    playwright install
    
  2. 安装 Pytest
    Pytest 是一个流行的 Python 测试框架,Playwright 提供了对 Pytest 的支持,可以通过以下命令安装:

    pip install pytest pytest-playwright
    
  3. 配置环境变量
    GitHub API 需要认证令牌(Token),因此需要在环境变量中设置 GITHUB_API_TOKENGITHUB_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 验证服务器的状态是否符合预期

相关文章:

  • LearnOpenGL-笔记-其十三
  • ROS 2源换源后GPG错误解决方法
  • LangChain输出格式化实践:提升测试工程师LLM开发效率的完整指南
  • Python训练营---Day43
  • 云服务器突发宕机或无响应怎么办
  • <6>, 界面优化
  • 【PCB设计】STM32开发板——电源设计
  • 第二章支线五 ·CSS炼金续章:变量与暗黑主题术
  • 云服务器无法远程连接怎么办?
  • 动态规划(10):状态压缩
  • Flex弹性布局
  • 量子计算在大模型微调中的技术突破
  • 什么是线程上下文切换?
  • 推荐一款使用html开发桌面应用的工具——mixone
  • 描述性统计——让数据说话
  • 太极APP:免Root,畅享Xposed模块的神奇魅力
  • 【Spring底层分析】Spring AOP基本使用+万字底层源码阅读分析
  • 【DAY37】早停策略和模型权重的保存
  • Docker常用命令详解与高效记忆指南
  • 数值与字典解决方案二十七讲:两列数据相互去掉重复值后合并
  • 广州营销型网站建设公司哪家名气大/免费二级域名建站
  • 手机怎么建设视频网站/免费的发帖收录网站
  • 学习php做毕设网站方向/广州竞价托管公司
  • 博客网站建设基本流程/网站推广排名教程
  • 如何做好网络宣传工作/关键词优化平台有哪些
  • 什么是网站主机/中国十大搜索引擎网站