使用 Python 和 Pytest 自动化 API 测试

2025-05-27

使用 Python 和 Pytest 自动化 API 测试

你有没有想过如何使用 Python 测试你的 API?在本文中,我们将学习如何使用 Python 和 Pytest 框架测试 API。
本教程需要你安装 Python,你可以在这里下载。


概括:


什么是 Python 和 Pytest 框架

PythonPython 是一种高级通用编程语言,以其简洁易读而闻名。它由 Guido van Rossum 创建,并于 1991 年首次发布。Python 的设计理念是易于学习,语法简洁明了,因此无论是初学者还是经验丰富的程序员,它都是热门的选择。

该 pytest 框架可以轻松编写小型、可读的测试,并可以扩展以支持应用程序和库的复杂功能测试。


我们的项目配置

使用python创建虚拟环境

在开始创建之前,我们先来了解一下 Python 中的虚拟环境是什么。Python
中的虚拟环境是一个独立的目录或文件夹,允许你为项目创建和管理独立的 Python 环境。有了环境,你可以轻松管理依赖项,避免与不同版本的 Python 发生冲突。

虚拟环境包括(除其他外):

  • 用于包含特定的 Python 解释器以及支持项目(库或应用程序)所需的软件库和二进制文件。默认情况下,它们与其他虚拟环境中的软件以及操作系统中安装的 Python 解释器和库隔离。
  • 包含一个目录,通常命名为 venv 或 .venv 在项目目录中,或者在许多虚拟环境的容器目录下,例如 ~/.virtualenvs
  • 未检查 Git 等源代码控制系统。
  • 可丢弃——应该很容易删除并从头开始重新创建。您无需在环境中放置任何项目代码
  • 不被视为可移动或可复制——您只需在目标位置重新创建相同的环境。

您可以在此处阅读有关 Python 环境的更多信息

视窗

首先,为您的项目创建一个文件夹,然后打开您的 cmd 并使用命令 cd 导航到该文件夹​​:

 cd tests_with_python
Enter fullscreen mode Exit fullscreen mode

如果您不知道文件夹在哪里,可以运行命令ls,您将看到文件夹列表并可以浏览它们。在我们的项目文件夹中,运行以下命令:

 python -m venv name_of_environment
Enter fullscreen mode Exit fullscreen mode

您的环境名称可以是任意的,只要记住 python 区分大小写即可,请查看PEP 8 样式指南以了解有关 Python 约定的更多信息。

为了激活我们的环境,我们使用以下命令:

name_of_environment\Scripts\Activate
Enter fullscreen mode Exit fullscreen mode

如果一切正确,您的环境将被激活,并且在 cmd 上您将看到如下内容:

(name_of_environment) C:\User\tests 
Enter fullscreen mode Exit fullscreen mode

要禁用您的环境,只需运行:

deactivate
Enter fullscreen mode Exit fullscreen mode

Linux 或 MacOS

为您的项目创建一个文件夹,然后打开您的 cmd 并使用命令 cd 导航到该文件夹​​:

 cd tests_with_python
Enter fullscreen mode Exit fullscreen mode

为了激活我们的环境,我们使用以下命令:

source name_of_environment/bin/activate
Enter fullscreen mode Exit fullscreen mode

如果一切正确,您的环境将被激活,并且在 cmd 上您将看到如下内容:

(name_of_environment) your_user_name tests %
Enter fullscreen mode Exit fullscreen mode

要禁用您的环境,只需运行:

deactivate
Enter fullscreen mode Exit fullscreen mode

测试依赖项的设置

由于我们要测试 API,因此我们需要安装依赖项来帮助我们进行测试,首先我们将安装requests库来帮助我们发出请求:
PS:在运行此命令之前,请确保您的环境已激活

pip install requests
Enter fullscreen mode Exit fullscreen mode

为了进行测试,我们将安装pytests框架:

pip install pytest
Enter fullscreen mode Exit fullscreen mode

创建我们的第一个测试

待测试 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
Enter fullscreen mode Exit fullscreen mode
  • 安排:我们创建一个变量来插入 api_key,在此步骤中,您可以插入执行测试所需的任何数据。通常,在此步骤中,我们会创建模拟数据。
  • 行动:在这一步中,我们调用负责发出请求的方法
  • 断言:我们验证响应

The name of the method or class should starts with test

要运行我们的测试,请在命令提示符下运行:

pytest test.py
Enter fullscreen mode Exit fullscreen mode

我们将收到一个错误,因为我们没有创建方法来执行请求:

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 ==================================================================
Enter fullscreen mode Exit fullscreen mode

现在,让我们创建方法来执行请求:

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
Enter fullscreen mode Exit fullscreen mode

现在,再次运行我们的测试:

================================================================ 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 =================================================================
Enter fullscreen mode Exit fullscreen mode

重构我们的测试

现在我们已经知道如何使用 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
Enter fullscreen mode Exit fullscreen mode

现在,我们需要考虑如何将此方法复用到其他测试中,因为我们需要为不同的测试传递不同的参数。有很多方法可以实现这一点,在本教程中,我们将参数名称从 更改为api_keyquery_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
Enter fullscreen mode Exit fullscreen mode

之后,我们需要修改测试文件。我们将导入我们创建的方法:

from make_requests import make_request
Enter fullscreen mode Exit fullscreen mode

为了更好地组织我们的测试,并按照 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
Enter fullscreen mode Exit fullscreen mode

生成html报告结果

为了更好地可视化您的测试结果,我们可以使用该pytest-html-reporter库来生成报告 html,为此,首先我们需要安装包:

pip install pytest-html
Enter fullscreen mode Exit fullscreen mode

要生成报告,请在运行测试时添加:

pytest test.py --html-report=./report/report.html 
Enter fullscreen mode Exit fullscreen mode

将生成一个包含测试结果的 .html 文件,如下所示:

报告示例

结论

本文将指导您如何使用 Python 和 Pytest 框架为 API 编写自动化测试,以及如何生成 HTML 报告。您可以点击此处
访问本教程中使用的项目  希望本文对您有所帮助。

如果您有任何疑问,请随时与我联系! 

Bisous,à la semaine prochaine 💅🏼

文章来源:https://dev.to/m4rri4nne/automating-your-api-tests-using-python-and-pytest-23cc
PREV
16 小时发布——我在一个周末内设计、构建并发布一款产品的详细过程。背景
NEXT
孙子兵法——如何更快更有效地消灭虫子