Pytest实践:使用Pytest进行API测试!

1. 简介

API 测试为什么很重要

如果你正在构建或维护现代 Web 服务,那么你可能正在处理 API。它们是当今互联软件领域的支柱。但关键在于:API 的好坏取决于其可靠性、速度和正确性。这就是 API 测试的作用所在。

它不仅仅是你开发待办事项清单上的一个复选框;它是确保你的 API 能够按预期运行的安全网,即使用户(或其他服务)向它抛出难题。

Pytest作为API测试工具

现在,你可能会问:"为什么要使用 Pytest?"

好吧,如果你是 Python 开发人员,你可能已经遇到过用于通用测试的 Pytest,但它的用处不止于此。

Pytest 用途广泛,也是API测试的强大工具。凭借其简单的语法和丰富的插件架构,可以编写干净、简洁、全面的 API 测试。

2. API 测试基础

2.1. 什么是 API 测试?

定义和意义

API 测试就是将请求发送到 API 端点并验证响应。听起来很简单,对吧?但它不仅仅是检查你是否获得 200 OK 状态(200 OK status)。你需要验证数据结构、数据类型、数据值、性能,甚至不同条件下的行为。它就像 API 的 QA,确保它强大、可靠且随时可用。

API 测试的类型

对于 API 测试,没有万能的方法。下面简要介绍一下可能会遇到的测试类型:

  • 单元测试:这是最基本的测试,主要关注 API 的各个组件。可以考虑单独测试单个端点。

  • 集成测试:现在我们讨论的是确保服务的不同部分能够很好地协同工作。这涉及测试多个端点之间的交互。

  • 功能测试:这些测试不仅限于单个组件和交互,还着眼于完整的功能。例如,测试用户为完成某项任务可能进行的一系列 API 调用。

  • 其他:还有性能测试、安全测试,甚至合同测试,以确保API 符合某些商定的标准。

2.2. 为什么使用 Pytest 进行 API 测试?

使 Pytest 适合 API 测试的功能

那么,为什么我们都喜欢用 Pytest 进行 API 测试呢?首先,它是 Pythonic,如果你正在阅读这篇文章,那么你很可能是 Python 的粉丝。但这不仅仅与语言偏好有关。Pytest 提供了一些杀手级功能:

  • 简单:可以从简单的assert语句开始,然后逐步升级到更复杂的测试。

  • 灵活性:使用 Pytest 装置,可以创建可重复使用的测试组件。在到达端点之前需要进行身份验证?为此创建一个装置。

  • 可扩展性:Pytest 具有丰富的插件架构。无论是使用 pytest-xdist 进行并行测试执行,还是使用 pytest-benchmark 进行性能基准测试,都可能有插件可以实现。

与其他测试框架的比较

你可能会想,"那么 unittest 或 Nose 等其他框架怎么样?"好吧,它们并不是糟糕的选择,但 Pytest 提供了一种更直接、更 Pythonic 的方法。此外,它的插件生态系统是首屈一指的,这意味着可以扩展其功能以满足几乎任何需求。

简而言之,Pytest 就像测试框架中的瑞士军刀;它功能多样、可靠,是

API 测试的首选。

3.测试 RESTful API

好吧,让我们深入了解使用 Pytest 进行 API 测试的本质。我们讨论的是 RESTful API,这是大多数 Web 服务的基础。

使用 Pytest 进行首次 API 测试

在我们开始之前,请确保您已经安装了 pytest 和 requests 。如果没有,快速执行 pip install pytest requests 应该可以解决问题。

RESTful API 中的请求和响应结构

在 RESTful API 中,有标准的 HTTP 方法------GET、POST、PUT、DELETE------并且每种方法都有其自身的一套规则。请求通常由 URL、方法、标头(headers)组成,有时还包括有效负载(对于 POST 和 PUT)。响应将为你提供状态代码、标头以及 JSON 或 XML 主体。

编写并运行简单测试

让我们从简单的开始。我们将编写一个测试,从一个虚构的 API 中获取一个用户。创建一个名为 test_first_api.py 的 Python 文件,并粘贴以下代码:

使用 pytest test_first_api.py 运行它,你应该看到它通过。恭喜,你已经编写了第一个 API 测试!

测试各种 HTTP 方法

GET、POST、PUT、DELETE

不同的 HTTP 方法有不同的用途。GET 用于检索数据,POST 用于创建新数据,PUT 用于更新现有数据,而 DELETE 则用于删除数据。让我们看看如何使用 Pytest 来测试这些方法。

创建一个名为 test_http_methods.py 的文件:

运行 pytest test_http_methods.py 来执行这些测试。

测试响应代码和标头

检查状态码

状态码能告诉你很多正在发生的事情。200 OK 表示一切正常,201 Created 表示您的 POST 操作成功,404 Not Found 表示您正在请求不存在的东西。

在你的测试中,可以断言这些代码,以确保API 表现符合预期。在上面的示例中,我们一直在使用 assert response.status_code == 200 来做这件事。

验证响应标头

响应标头可以包含有价值的信息,如内容类型、认证令牌和缓存设置。要检查这些,您可以使用 response.headers,它会返回一个包含响应头的字典。

以下是一个在名为 test_response_headers.py 的文件中的快速示例:

使用 pytest test_response_headers.py 运行此代码。

4. 测试异步 API

你已经掌握了基础知识,并且感觉自己像个 Pytest "武士"。但是那些不遵循常规规则的 API 怎么办?我说的是异步 API。

API 中的异步性简介

什么是异步 API?

在典型的同步 API 中,你发出请求并等待响应。很简单,对吧?但在现实世界中,某些操作需要花费时间 --- 比如说,很多时间。这就是异步 API 的作用所在。你发出请求,收到确认,然后稍后获取实际数据,这样你就可以腾出时间去做其他事情。

为什么它很重要

异步 API 对于耗时且不应阻碍用户其他活动的操作至关重要。它们在聊天应用、在线游戏和金融交易平台等实时应用中很常见。

测试 WebSocket API

WebSocket 是一种协议,它通过单个长期存在的连接提供全双工通信通道。这就像在客户端和服务器之间有一条开放的电话线。

如何使用 Pytest 进行 WebSocket 测试

要测试 WebSocket API,你可以使用 pytest-asyncio 和 websockets 库。首先,安装它们:

创建一个名为test_websocket.py的 Python 文件:

使用 pytest test_websocket.py 运行测试。

测试 GraphQL API

GraphQL 是一种 API 查询语言,由于其灵活性而受到广泛关注。与 REST 不同,可以精确指定所需的数据,从而减少通过网络传输的数据量。

如何使用 Pytest 进行 GraphQL 测试

对于 GraphQL,可以使用该requests库发送带有包含查询的 JSON 有效负载的 POST 请求。

创建一个名为 test_graphql.py的 Python 文件:

使用 pytest test_graphql.py 运行测试。

5. 高级技术

现在,你已经掌握了基础知识,甚至涉足了一些异步 API 测试。但我们不会止步于此,让我们深入研究一些高级技术。

性能测试和基准测试

性能不仅仅关乎速度;它还关乎 API 在各种条件下的表现。当多个用户访问时,它是否会变慢?它会崩溃吗?让我们来一探究竟。

如何使用 pytest-benchmark 进行性能测试

插件pytest-benchmark是你的好朋友。请先安装它:

创建一个名为 test_performance.py的 Python 文件:

使用 pytest test_performance.py 运行测试。

模拟和存根 API

你并不总是希望访问实际的 API,尤其是在测试可能更改数据的内容或受到速率限制时。

使用 unittest.mock 模拟 API 响应

Python 的内置unittest.mock库非常适合此用途。

创建一个名为的 Python 文件test_mocking.py:

使用 pytest test_mocking.py 运行测试。

自动化和 CI/CD

自动化测试是拼图的最后一块。它确保每次有人推送代码时测试都会运行,从而控制 API。

与 Jenkins、Travis CI 和 GitHub Actions 集成

对于 Jenkins 和 Travis CI,你通常会编写一个脚本来安装 Python、安装依赖项,然后运行 pytest。

对于 GitHub Actions,创建一个.github/workflows/main.yml文件:

6.案例研究和最佳实践

好了,你已经掌握了工具和技术。现在,让我们看看一些真实场景和最佳实践。

现实世界中复杂的 API 测试场景示例

测试微服务架构

想象一下,你正在开发类似 Netflix 的流媒体服务。你拥有用于用户身份验证、视频流和推荐的微服务。如何测试它?

创建一个名为 test_microservices.py的 Python 文件:

使用 pytest test_microservices.py 运行测试。

测试速率受限的 API

某些 API 有速率限制,需要测试应用程序如何处理此问题。

创建一个名为 test_rate_limit.py 的 Python 文件:

使用 pytest test_rate_limit.py 运行测试。

API 测试最佳实践讨论

保持测试原子性

每个测试都应该代表一个逻辑概念。混合使用多个断言可能会让人难以理解测试失败的原因。

对可重用组件使用 Fixture

Pytest 装置非常适合设置测试条件。将它们用于身份验证令牌或数据库连接等。

测试边缘情况

不要只测试"快乐路径"。确保测试边缘情况,例如无效输入、速率限制和超时。

自动化一切

如果你没有自动化测试,那你就做错了。确保你的测试自动运行,特别是在代码合并之前。

结论

阅读完本文后,我希望你已经相信 Pytest 是一款功能强大的工具,可用于各个级别的 API 测试。它不仅可以测试基本的 API 功能;它还提供异步测试、基准测试和 CI/CD 集成等高级功能。

本文的关键点是,有效的 API 测试不仅仅是检查端点是否正常工作。它还涉及了解 API 的不同元素如何相互作用、如何管理测试数据以及如何自动化这些测试以持续保证质量

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

相关推荐
李少兄1 小时前
Unirest:优雅的Java HTTP客户端库
java·开发语言·http
此木|西贝1 小时前
【设计模式】原型模式
java·设计模式·原型模式
可乐加.糖1 小时前
一篇关于Netty相关的梳理总结
java·后端·网络协议·netty·信息与通信
s9123601011 小时前
rust 同时处理多个异步任务
java·数据库·rust
9号达人1 小时前
java9新特性详解与实践
java·后端·面试
cg50171 小时前
Spring Boot 的配置文件
java·linux·spring boot
啊喜拔牙2 小时前
1. hadoop 集群的常用命令
java·大数据·开发语言·python·scala
anlogic2 小时前
Java基础 4.3
java·开发语言
非ban必选3 小时前
spring-ai-alibaba第七章阿里dashscope集成RedisChatMemory实现对话记忆
java·后端·spring
A旧城以西3 小时前
数据结构(JAVA)单向,双向链表
java·开发语言·数据结构·学习·链表·intellij-idea·idea