使用 Python 和 Pytest 自动化 API 测试
你有没有想过如何使用 Python 测试你的 API?在本文中,我们将学习如何使用 Python 和 Pytest 框架测试 API。
本教程需要你安装 Python,你可以在这里下载。
概括:
什么是 Python 和 Pytest 框架
Python
Python 是一种高级通用编程语言,以其简洁易读而闻名。它由 Guido van Rossum 创建,并于 1991 年首次发布。Python 的设计理念是易于学习,语法简洁明了,因此无论是初学者还是经验丰富的程序员,它都是热门的选择。
该 pytest
框架可以轻松编写小型、可读的测试,并可以扩展以支持应用程序和库的复杂功能测试。
我们的项目配置
使用python创建虚拟环境
在开始创建之前,我们先来了解一下 Python 中的虚拟环境是什么。Python
中的虚拟环境是一个独立的目录或文件夹,允许你为项目创建和管理独立的 Python 环境。有了环境,你可以轻松管理依赖项,避免与不同版本的 Python 发生冲突。
虚拟环境包括(除其他外):
- 用于包含特定的 Python 解释器以及支持项目(库或应用程序)所需的软件库和二进制文件。默认情况下,它们与其他虚拟环境中的软件以及操作系统中安装的 Python 解释器和库隔离。
- 包含一个目录,通常命名为
venv
或.venv
在项目目录中,或者在许多虚拟环境的容器目录下,例如~/.virtualenvs
。 - 未检查 Git 等源代码控制系统。
- 可丢弃——应该很容易删除并从头开始重新创建。您无需在环境中放置任何项目代码
- 不被视为可移动或可复制——您只需在目标位置重新创建相同的环境。
您可以在此处阅读有关 Python 环境的更多信息。
视窗
首先,为您的项目创建一个文件夹,然后打开您的 cmd 并使用命令 cd 导航到该文件夹:
cd tests_with_python
如果您不知道文件夹在哪里,可以运行命令ls
,您将看到文件夹列表并可以浏览它们。在我们的项目文件夹中,运行以下命令:
python -m venv name_of_environment
您的环境名称可以是任意的,只要记住 python 区分大小写即可,请查看PEP 8 样式指南以了解有关 Python 约定的更多信息。
为了激活我们的环境,我们使用以下命令:
name_of_environment\Scripts\Activate
如果一切正确,您的环境将被激活,并且在 cmd 上您将看到如下内容:
(name_of_environment) C:\User\tests
要禁用您的环境,只需运行:
deactivate
Linux 或 MacOS
为您的项目创建一个文件夹,然后打开您的 cmd 并使用命令 cd 导航到该文件夹:
cd tests_with_python
为了激活我们的环境,我们使用以下命令:
source name_of_environment/bin/activate
如果一切正确,您的环境将被激活,并且在 cmd 上您将看到如下内容:
(name_of_environment) your_user_name tests %
要禁用您的环境,只需运行:
deactivate
测试依赖项的设置
由于我们要测试 API,因此我们需要安装依赖项来帮助我们进行测试,首先我们将安装requests
库来帮助我们发出请求:
PS:在运行此命令之前,请确保您的环境已激活
pip install requests
为了进行测试,我们将安装pytests
框架:
pip install pytest
创建我们的第一个测试
待测试 API 的定义
在本教程中,我们将使用返回小行星列表的 Nasa API:小行星 - NeoWs,并且我们将测试根据小行星与地球最接近的日期检索小行星列表的端点。
关于 API:
- 基本网址:
https://api.nasa.gov/neo/rest/v1/feed
- 查询参数:
范围 | 类型 | 默认 | 描述 |
---|---|---|---|
开始日期 | 年-月-日 | 没有任何 | 小行星搜寻开始日期 |
结束日期 | 年-月-日 | start_date 后 7 天 | 小行星搜寻结束日期 |
api_key | 细绳 | 演示密钥 | api.nasa.gov 密钥用于扩展用途 |
在本教程中,我们将重点关注三种类型的测试:
- 合同:API 是否能够验证发送的查询参数
- 状态:如果状态代码正确
- 身份验证:即使此 API 不需要令牌,我们也可以用它来进行测试
我们的场景:
方法 | 测试 | 预期结果 |
---|---|---|
得到 | 搜索成功 | - 返回状态码 200 主体响应包含小行星列表 |
得到 | 无需任何查询参数即可进行搜索 | - 返回状态码 403 |
得到 | 仅按开始日期搜索 | - 返回状态码 200 主体响应包含小行星列表 |
得到 | 仅搜索结束日期 | - 返回状态码 200 主体响应包含小行星列表 |
得到 | 在有效日期范围内搜索 | - 返回状态码 200 - 响应主体包含所有非空字段 |
得到 | 当开始日期大于结束日期时进行搜索 | - 返回状态码 400 |
得到 | 使用无效的 API 令牌进行搜索 | - 返回状态码 403 主体响应包含小行星列表 |
创建我们的测试
首先,我们将创建一个名为的文件tests.py
,并在此文件中编写测试。为了帮助我们采用良好的实践并编写良好的自动化测试,我们将使用TDD(测试驱动开发)技术。
该技术包括:
- 红色 - 进行失败的测试
- 绿色 - 使此测试通过
- 重构——重构已完成的工作,删除重复内容
为了编写一套好的测试,我们将使用 3A 技术:
- 安排:准备背景。
- 行动:执行我们想要演示的动作。
- 断言:表明我们预期的结果确实发生了。
从红色开始并使用 3A 技术,我们将编写第一个测试Search asteroids with success
:
import pytest
def test_search_asteroids_with_sucess():
# Arrange:
api_key = "DEMO_KEY"
#Act:
response = make_request(api_key)
#Assertion:
assert response.status_code == 200 # Validation of status code
data = response.json()
# Assertion of body response content:
assert len(data) > 0
assert data["element_count"] > 0
- 安排:我们创建一个变量来插入 api_key,在此步骤中,您可以插入执行测试所需的任何数据。通常,在此步骤中,我们会创建模拟数据。
- 行动:在这一步中,我们调用负责发出请求的方法
- 断言:我们验证响应
The name of the method or class should starts with test
要运行我们的测试,请在命令提示符下运行:
pytest test.py
我们将收到一个错误,因为我们没有创建方法来执行请求:
test.py F [100%]
====================================================================== FAILURES ======================================================================
_________________________________________________________ test_search_asteroids_with_sucess __________________________________________________________
def test_search_asteroids_with_sucess():
> response = make_request()
E NameError: name 'make_request' is not defined
test.py:5: NameError
============================================================== short test summary info ===============================================================
FAILED test.py::test_search_asteroids_with_sucess - NameError: name 'make_request' is not defined
================================================================= 1 failed in 0.01s ==================================================================
现在,让我们创建方法来执行请求:
import requests
def make_request(api_key):
base_url = "https://api.nasa.gov/neo/rest/v1/feed/"
response = requests.get(f'{base_url}?api_key={api_key}')
return response
现在,再次运行我们的测试:
================================================================ test session starts =================================================================
platform darwin -- Python 3.11.5, pytest-7.4.3, pluggy-1.3.0
rootdir: /Users/Documents/tests_python
collected 1 item
test.py . [100%]
================================================================= 1 passed in 20.22s =================================================================
重构我们的测试
现在我们已经知道如何使用 pytest 创建测试以及如何创建请求,我们可以编写其他测试并开始重构测试。我们要做的第一个重构是从测试文件中删除请求方法。我们将创建一个名为 的新文件,make_requests.py
其中包含我们的请求,并将我们创建的请求移动到此文件中:
import requests
def make_request(api_key):
base_url = "https://api.nasa.gov/neo/rest/v1/feed/"
response = requests.get(f'{base_url}?api_key={api_key}')
return response
现在,我们需要考虑如何将此方法复用到其他测试中,因为我们需要为不同的测试传递不同的参数。有很多方法可以实现这一点,在本教程中,我们将参数名称从 更改为api_key
。query_parameters
这样做是为了让我们的方法更加灵活,并且只需为测试传递一次参数即可:
import requests
def make_request(query_parameters):
base_url = "https://api.nasa.gov/neo/rest/v1/feed/"
response = requests.get(f'{base_url}?{query_parameters}')
return response
之后,我们需要修改测试文件。我们将导入我们创建的方法:
from make_requests import make_request
为了更好地组织我们的测试,并按照 pytest 文档的建议,我们将测试移至一个类TestClass
:
再次运行我们的测试:
============================= test session starts ==============================
collecting ... collected 7 items
test.py::TestClass::test_search_asteroids_with_sucess
test.py::TestClass::test_search_asteroids_with_query_parameters_empty
test.py::TestClass::test_search_asteroids_with_start_date
test.py::TestClass::test_search_asteroids_with_end_date
test.py::TestClass::test_search_asteroids_in_valid_range
test.py::TestClass::test_search_asteroids_in_invalid_range
test.py::TestClass::test_search_asteroids_in_invalid_token
============================== 7 passed in 5.85s ===============================
PASSED [ 14%]PASSED [ 28%]PASSED [ 42%]PASSED [ 57%]PASSED [ 71%]PASSED [ 85%]PASSED [100%]
Process finished with exit code 0
生成html报告结果
为了更好地可视化您的测试结果,我们可以使用该pytest-html-reporter
库来生成报告 html,为此,首先我们需要安装包:
pip install pytest-html
要生成报告,请在运行测试时添加:
pytest test.py --html-report=./report/report.html
将生成一个包含测试结果的 .html 文件,如下所示:
结论
本文将指导您如何使用 Python 和 Pytest 框架为 API 编写自动化测试,以及如何生成 HTML 报告。您可以点击此处
访问本教程中使用的项目 。 希望本文对您有所帮助。
如果您有任何疑问,请随时与我联系!
Bisous,à la semaine prochaine 💅🏼
文章来源:https://dev.to/m4rri4nne/automating-your-api-tests-using-python-and-pytest-23cc