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 的不同元素如何相互作用、如何管理测试数据以及如何自动化这些测试以持续保证质量

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

软件测试面试文档

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

相关推荐
棕豆兔&几秒前
Linux 搭建 Java 部署环境:安装 JDK 和 MySQL 的教程
java·开发语言·mysql
CN.LG11 分钟前
Java经典框架之MyBatis
java·开发语言
络711 分钟前
Spring01——Spring简介、Spring Framework架构、Spring核心概念、IOC入门案例、DI入门案例
java·后端·spring
梅孔立12 分钟前
钉钉打包以后发送报错 org.apache.tomcat.util.codec.binary.Base64.encodeBase64([B 解决描述
java·ubuntu·centos·tomcat·maven·apache·钉钉
醉颜凉12 分钟前
Eureka:Spring Cloud中的服务注册与发现如何实现?
java·后端·spring·spring cloud·面试·eureka·微服务架构
一只IT攻城狮33 分钟前
idea配置连接数据库的操作方法(适配不同版本)
java·数据库·后端·mysql·intellij-idea
是梦终空35 分钟前
JAVA毕业设计166—基于Java+Springboot+vue3的流浪宠物救助管理小程序(源代码+数据库)
java·spring boot·小程序·vue·毕业设计·课程设计·流浪宠物救助系统
秋夫人40 分钟前
org.apache.commons.lang.math.NumberUtils#isNumber 解释
java
bksheng1 小时前
【selenium点选下拉框】解决无法选中对应选项的问题
selenium·测试工具
qq_485015211 小时前
SpringBoot
java·spring boot