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 文件,并粘贴以下代码:
![](https://img-blog.csdnimg.cn/img_convert/56a34d47918a060df11bffe7e4bdb0ae.png)
使用 pytest test_first_api.py 运行它,你应该看到它通过。恭喜,你已经编写了第一个 API 测试!
测试各种 HTTP 方法
GET、POST、PUT、DELETE
不同的 HTTP 方法有不同的用途。GET 用于检索数据,POST 用于创建新数据,PUT 用于更新现有数据,而 DELETE 则用于删除数据。让我们看看如何使用 Pytest 来测试这些方法。
创建一个名为 test_http_methods.py 的文件:
![](https://img-blog.csdnimg.cn/img_convert/c43c85d4a5fe67f4ca6956c8ba03a991.png)
运行 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 的文件中的快速示例:
![](https://img-blog.csdnimg.cn/img_convert/e2a3b03e7dcc8d17af2f93d25c27b160.png)
使用 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 库。首先,安装它们:
![](https://img-blog.csdnimg.cn/img_convert/66fa0de547741b3a02e38d36f5c2bba5.png)
创建一个名为test_websocket.py的 Python 文件:
![](https://img-blog.csdnimg.cn/img_convert/d25187c8b5b3866538e8d64d5cde1e8e.png)
使用 pytest test_websocket.py 运行测试。
测试 GraphQL API
GraphQL 是一种 API 查询语言,由于其灵活性而受到广泛关注。与 REST 不同,可以精确指定所需的数据,从而减少通过网络传输的数据量。
如何使用 Pytest 进行 GraphQL 测试
对于 GraphQL,可以使用该requests库发送带有包含查询的 JSON 有效负载的 POST 请求。
创建一个名为 test_graphql.py的 Python 文件:
![](https://img-blog.csdnimg.cn/img_convert/9e3098601bcf9b9e2afcfacd223c87cc.png)
使用 pytest test_graphql.py 运行测试。
5. 高级技术
现在,你已经掌握了基础知识,甚至涉足了一些异步 API 测试。但我们不会止步于此,让我们深入研究一些高级技术。
性能测试和基准测试
性能不仅仅关乎速度;它还关乎 API 在各种条件下的表现。当多个用户访问时,它是否会变慢?它会崩溃吗?让我们来一探究竟。
如何使用 pytest-benchmark 进行性能测试
插件pytest-benchmark是你的好朋友。请先安装它:
![](https://img-blog.csdnimg.cn/img_convert/a43f1a4fa3c0fa1372bfb76e4eddabab.png)
创建一个名为 test_performance.py的 Python 文件:
![](https://img-blog.csdnimg.cn/img_convert/1c914c19e5d33759ae247b408fb11f0a.png)
使用 pytest test_performance.py 运行测试。
模拟和存根 API
你并不总是希望访问实际的 API,尤其是在测试可能更改数据的内容或受到速率限制时。
使用 unittest.mock 模拟 API 响应
Python 的内置unittest.mock库非常适合此用途。
创建一个名为的 Python 文件test_mocking.py:
![](https://img-blog.csdnimg.cn/img_convert/ee52d53f08dae132fde0def5ef93521f.png)
使用 pytest test_mocking.py 运行测试。
自动化和 CI/CD
自动化测试是拼图的最后一块。它确保每次有人推送代码时测试都会运行,从而控制 API。
与 Jenkins、Travis CI 和 GitHub Actions 集成
对于 Jenkins 和 Travis CI,你通常会编写一个脚本来安装 Python、安装依赖项,然后运行 pytest。
对于 GitHub Actions,创建一个.github/workflows/main.yml文件:
![](https://img-blog.csdnimg.cn/img_convert/daada534df5b4708ed514a95ddc4806f.png)
6.案例研究和最佳实践
好了,你已经掌握了工具和技术。现在,让我们看看一些真实场景和最佳实践。
现实世界中复杂的 API 测试场景示例
测试微服务架构
想象一下,你正在开发类似 Netflix 的流媒体服务。你拥有用于用户身份验证、视频流和推荐的微服务。如何测试它?
创建一个名为 test_microservices.py的 Python 文件:
![](https://img-blog.csdnimg.cn/img_convert/5904342de39157e9630909f54e8e50b8.png)
使用 pytest test_microservices.py 运行测试。
测试速率受限的 API
某些 API 有速率限制,需要测试应用程序如何处理此问题。
创建一个名为 test_rate_limit.py 的 Python 文件:
![](https://img-blog.csdnimg.cn/img_convert/7fe282d3f19639d6c4743f9c80809d75.png)
使用 pytest test_rate_limit.py 运行测试。
API 测试最佳实践讨论
保持测试原子性
每个测试都应该代表一个逻辑概念。混合使用多个断言可能会让人难以理解测试失败的原因。
对可重用组件使用 Fixture
Pytest 装置非常适合设置测试条件。将它们用于身份验证令牌或数据库连接等。
测试边缘情况
不要只测试"快乐路径"。确保测试边缘情况,例如无效输入、速率限制和超时。
自动化一切
如果你没有自动化测试,那你就做错了。确保你的测试自动运行,特别是在代码合并之前。
结论
阅读完本文后,我希望你已经相信 Pytest 是一款功能强大的工具,可用于各个级别的 API 测试。它不仅可以测试基本的 API 功能;它还提供异步测试、基准测试和 CI/CD 集成等高级功能。
本文的关键点是,有效的 API 测试不仅仅是检查端点是否正常工作。它还涉及了解 API 的不同元素如何相互作用、如何管理测试数据以及如何自动化这些测试以持续保证质量
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!
![](https://img-blog.csdnimg.cn/direct/e5e4d5d6e115452390cf7ff12498db1a.png)
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
![](https://img-blog.csdnimg.cn/057f075a555e43b5ae94ac4c2c7f6dc1.png)
![](https://i-blog.csdnimg.cn/direct/71ac2cf451a5470ab2abefb64729cf98.jpeg)