使用PyTest进行RESTful API测试:完整指南

作者:API传播员 · 2025-12-10 · 阅读时间:6分钟
本文详细介绍了使用PyTest进行RESTful API测试的完整指南,涵盖HTTP方法、状态代码、响应验证等关键概念,以及GET、POST、PUT、DELETE请求的测试方法。通过参数化测试和Fixtures等进阶技巧,帮助开发者提升测试效率和可维护性,确保Web服务质量和可靠性。

了解关键测试概念

在开始编写测试之前,我们需要先了解一些对有效进行 RESTful API 测试至关重要的基本概念。

HTTP 方法

RESTful API 使用标准的 HTTP 方法来指示对资源的操作。以下是常见的 HTTP 方法及其用途:

  • GET:从服务器检索数据(例如,获取书籍列表,按 ID 获取一本书)。
  • POST:在服务器上创建新资源(例如,将新书添加到目录中)。
  • PUT:更新服务器上的现有资源(例如,编辑一本书的信息)。
  • DELETE:从服务器中删除资源(例如,删除一本书)。

状态代码

服务器通过返回 API 请求的结果。了解这些代码有助于测试的成功:

  • 2xx 成功:表示操作成功(例如,200 表示 GET 成功,201 表示 POST 成功创建资源)。
  • 4xx 客户端错误:表示请求本身可能存在问题(例如,400 表示请求无效,404 表示资源未找到)。
  • 5xx 服务器错误:表示服务器端的问题(例如,500 表示内部服务器错误)。

验证

API 测试的一个关键方面是确保服务器的响应有效并符合预期。这包括:

  • 结构:验证响应是否符合预期格式,通常是 JSON。
  • 内容类型:确认 Content-Type 标头正确指定了响应的格式(例如 application/json)。
  • 数据完整性:检查响应中的数据是否在值及类型上符合预期。

以下是一个示例,展示如何在 PyTest 测试中验证状态代码和响应结构:

def test_get_book_by_id():
    url = "https://run.mocky.io/v3/9b2fc100-4c56-473d-b488-323dfd26396c/books/1"

# 发送 GET 请求
    response = requests.get(url)# 验证状态码
    assert response.status_code == 200# 验证内容类型
    assert response.headers["Content-Type"] == "application/json; charset=UTF-8"# 验证响应结构
    data = response.json()
    assert isinstance(data, dict)
    assert "id" in data
    assert "title" in data
    assert "author" in data

示例说明

  1. 使用 requests 库向模拟 API 端点发送 GET 请求。
  2. 验证响应的状态码是否为 200 OK,表示请求成功。
  3. 检查 Content-Type 标头是否为 application/json
  4. 将响应转换为 JSON 格式,并验证是否包含预期的键(idtitleauthor)。

注意:请将示例中的模拟 API URL 替换为实际的 API URL。


扩展测试套件

在掌握了测试 GET 请求的基础知识后,我们可以扩展测试套件,覆盖 RESTful API 的完整操作范围。

POST 请求(创建资源)

测试在服务器上创建新资源的能力。以下是添加新书的示例:

def test_create_book():
    url = "https://run.mocky.io/v3/628dca34-286a-4850-902b-b5fdd89e0ce3/books"

# 模拟新书数据
    new_book = {"title": "The Hobbit", "author": "J.R.R. Tolkien"}
    response = requests.post(url, json=new_book)# 验证状态码
    assert response.status_code == 201
    assert response.headers["Content-Type"] == "application/json; charset=UTF-8"# 验证响应内容
    data = response.json()
    assert "id" in data
    assert data["title"] == "The Hobbit"
    assert data["author"] == "J.R.R. Tolkien"

PUT 请求(更新资源)

测试修改服务器上现有资源的能力:

def test_update_book():
    url = "https://run.mocky.io/v3/..."
    book_id = 1

# 模拟更新数据
    updated_book = {"title": "The Lord of the Rings: The Fellowship of the Ring", "author": "J.R.R. Tolkien"}
    response = requests.put(url, json=updated_book)# 验证状态码
    assert response.status_code == 200
    assert response.headers["Content-Type"] == "application/json; charset=UTF-8"# 验证更新结果
    data = response.json()
    assert data["id"] == book_id
    assert data["title"] == updated_book["title"]
    assert data["author"] == updated_book["author"]

DELETE 请求(删除资源)

测试从服务器中删除资源的能力:

def test_delete_book():
    url = "https://run.mocky.io/v3/..."
    book_id = 2

# 发送 DELETE 请求
    response = requests.delete(url)# 验证状态码
    assert response.status_code == 204# 验证响应内容为空
    assert response.text == ""

进阶测试技巧

随着 RESTful API 测试的复杂度增加,可以考虑以下进阶技巧:

参数化测试

使用 PyTest 的 parametrize 装饰器,可以在单个测试函数中测试多种输入和输出场景,从而简化测试并减少重复。

@pytest.mark.parametrize("book_id, status_code", [
    (1, 200),

# 有效的书籍 ID
    (999, 404)# 不存在的书籍 ID
])
def test_get_book_various_ids(book_id, status_code):
    url = f"https://run.mocky.io/v3/9b2fc100-4c56-473d-b488-323dfd26396c/books/{book_id}"
    response = requests.get(url)
    assert response.status_code == status_code

使用 Fixtures

Fixtures 是 PyTest 中用于管理测试资源的函数,能够减少重复代码并提高测试的可维护性。

@pytest.fixture
def book_data():
    return {"title": "The Hitchhiker's Guide to the Galaxy", "author": "Douglas Adams"}

def test_create_book(book_data):
    url = "https://run.mocky.io/v3/..."
    response = requests.post(url, json=book_data)# 验证逻辑

最佳实践

保持可维护性

  • 组织测试文件和函数,确保逻辑清晰。
  • 避免不必要的复杂性,保持代码简洁。

高覆盖率

  • 确保测试覆盖所有可能的成功和失败场景。
  • 包括错误处理测试,例如无效输入或资源缺失。

集成测试

  • 持续集成(CI):在代码变更时自动运行测试,及时发现问题。
  • 持续部署(CD):将 API 测试作为发布前的必备步骤,确保发布的可靠性。

总结

通过掌握使用 PyTest 进行 RESTful API 测试的技巧,您可以有效保障 Web 服务的质量和可靠性。本文涵盖了从基础到进阶的测试方法,包括 GET、POST、PUT 和 DELETE 请求的测试,以及参数化和 Fixtures 等高级技巧。

持续测试是构建健壮应用程序的关键。随着 API 的发展,本文介绍的技术和最佳实践将帮助您应对更复杂的测试需求。

祝您测试顺利!

原文链接: https://laerciosantanna.medium.com/mastering-restful-api-testing-with-pytest-56d22460a9c4