python pytest接口自动化源码
时间: 2025-05-23 12:47:09 浏览: 11
### 关于 Python Pytest API 自动化测试的源码示例
以下是基于 `pytest` 的接口自动化测试框架实现方式及其源码示例:
#### 工程结构
通常情况下,一个完整的 `pytest` 接口自动化测试项目会遵循以下目录结构[^2]:
```plaintext
project/
│
├── tests/ # 存放测试用例文件
│ ├── test_api.py # 示例测试用例文件
│ └── conftest.py # 配置文件,用于共享fixture等资源
│
├── fixtures/ # 存放公共fixture逻辑
│ └── api_client.py # 封装API客户端工具类
│
├── reports/ # 测试报告存储路径
│ └── allure-report # Allure生成的HTML报告
│
└── requirements.txt # 依赖包列表
```
---
#### 示例代码:封装 API 客户端
为了简化接口调用过程,可以通过创建一个通用的 HTTP 请求工具类来完成。以下是一个简单的 `api_client.py` 实现:
```python
import requests
class APIClient:
def __init__(self, base_url):
self.base_url = base_url
def get(self, endpoint, headers=None, params=None):
url = f"{self.base_url}{endpoint}"
response = requests.get(url, headers=headers, params=params)
return response.json(), response.status_code
def post(self, endpoint, data=None, json=None, headers=None):
url = f"{self.base_url}{endpoint}"
response = requests.post(url, data=data, json=json, headers=headers)
return response.json(), response.status_code
def put(self, endpoint, data=None, json=None, headers=None):
url = f"{self.base_url}{endpoint}"
response = requests.put(url, data=data, json=json, headers=headers)
return response.json(), response.status_code
def delete(self, endpoint, headers=None):
url = f"{self.base_url}{endpoint}"
response = requests.delete(url, headers=headers)
return response.json(), response.status_code
```
此工具类支持 GET、POST、PUT 和 DELETE 方法,并返回响应体和状态码。
---
#### 示例代码:编写测试用例
在 `tests/test_api.py` 文件中定义具体的测试用例。以下是一个使用 `pytest` 编写的简单接口测试案例:
```python
from fixtures.api_client import APIClient
def test_get_user_info():
client = APIClient(base_url="https://example.com/api")
response_data, status_code = client.get("/users/1")
assert status_code == 200, "Status code should be 200"
assert isinstance(response_data, dict), "Response should be a dictionary"
assert "id" in response_data and response_data["id"] == 1, "User ID mismatch"
def test_create_new_user():
client = APIClient(base_url="https://example.com/api")
new_user = {"name": "John Doe", "email": "[email protected]"}
response_data, status_code = client.post("/users", json=new_user)
assert status_code == 201, "Status code should be 201 (Created)"
assert "id" in response_data, "New user should have an 'id' field"
```
以上代码展示了如何通过 `APIClient` 调用 RESTful API 并验证其行为。
---
#### 使用 Fixture 参数化测试
`conftest.py` 是 pytest 中用来配置 fixture 的地方。下面展示了一个参数化的例子,允许动态传递不同的 URL 或请求数据:
```python
# conftest.py
import pytest
from fixtures.api_client import APIClient
@pytest.fixture(scope="module")
def api_client():
"""提供一个全局可用的 API Client"""
return APIClient(base_url="https://example.com/api")
@pytest.mark.parametrize(
"user_id, expected_status",
[
(1, 200),
(-1, 404),
("abc", 400),
],
)
def test_get_users(api_client, user_id, expected_status):
_, status_code = api_client.get(f"/users/{user_id}")
assert status_code == expected_status, f"Incorrect status for user {user_id}"
```
---
#### 结合 Allure 报告生成
要生成美观的测试报告,可以集成 Allure 框架。运行命令如下:
```bash
pytest --alluredir=reports/allure-results
allure serve reports/allure-results
```
这将生成 HTML 格式的测试报告并打开浏览器预览[^2]。
---
### 总结
上述内容涵盖了从工程结构设计到具体测试用例编写的全过程,并提供了实际的代码片段作为参考。这些方法可以帮助快速构建一套功能完善的接口自动化测试框架。
阅读全文
相关推荐

















