头像
淇迹时刻
-- : -- : --
切换主题色
-- : -- : --

第五阶段:接口测试实战

最后更新于:

第五阶段:接口测试实战

一、环境准备

1.1 安装requests库

1pip install requests

1.2 检查安装

1pip list | findstr requests
2# requests 2.28.2

二、接口测试基础

2.1 HTTP请求方法

方法说明常用场景
GET获取资源查询列表、查询详情
POST创建资源添加数据、提交表单
PUT更新资源更新完整资源
PATCH更新资源更新部分资源
DELETE删除资源删除数据

2.2 常用请求参数

参数说明示例
url请求地址https://api.example.com/users
paramsURL查询参数{"page": 1, "size": 10}
headers请求头{"Content-Type": "application/json"}
jsonJSON请求体{"name": "test", "email": "test@example.com"}
data表单请求体{"name": "test", "email": "test@example.com"}
timeout请求超时时间10(秒)

2.3 响应对象属性

属性说明示例
status_codeHTTP状态码200404500
headers响应头response.headers["Content-Type"]
json()JSON响应体response.json()
text文本响应体response.text
content二进制响应体response.content

三、接口测试框架设计

3.1 项目结构

1tests/
2├── api/
3│   ├── conftest.py       # API测试专用fixture
4│   ├── test_users.py     # 用户接口测试
5│   └── test_orders.py    # 订单接口测试
6└── conftest.py           # 全局fixture

3.2 全局fixture

 1# tests/conftest.py
 2import pytest
 3import requests
 4
 5@pytest.fixture(scope="session")
 6def api_client():
 7    session = requests.Session()
 8    session.base_url = "http://127.0.0.1:8000"
 9    yield session
10    session.close()

3.3 测试数据准备

 1# tests/api/conftest.py
 2import pytest
 3
 4@pytest.fixture
 5def test_user(api_client):
 6    user_data = {
 7        "name": "测试用户",
 8        "email": "test@example.com",
 9        "vip": False
10    }
11    response = api_client.post(f"{api_client.base_url}/users", json=user_data)
12    user = response.json()
13    yield user
14    api_client.delete(f"{api_client.base_url}/users/{user['id']}")

四、接口测试用例设计

4.1 正向用例

 1def test_create_user_success(api_client):
 2    user_data = {
 3        "name": "新用户",
 4        "email": "newuser@example.com",
 5        "vip": False
 6    }
 7    response = api_client.post(f"{api_client.base_url}/users", json=user_data)
 8    assert response.status_code == 201
 9    created_user = response.json()
10    assert created_user["name"] == "新用户"
11    assert created_user["email"] == "newuser@example.com"

4.2 反向用例

1def test_create_user_without_email(api_client):
2    user_data = {"name": "无邮箱用户"}
3    response = api_client.post(f"{api_client.base_url}/users", json=user_data)
4    assert response.status_code == 422

4.3 参数化测试

1@pytest.mark.parametrize("user_data", [
2    {"name": "新用户1", "email": "newuser1@example.com", "vip": False},
3    {"name": "新用户2", "email": "newuser2@example.com", "vip": True},
4])
5def test_create_user_success(api_client, user_data):
6    response = api_client.post(f"{api_client.base_url}/users", json=user_data)
7    assert response.status_code == 201
8    created_user = response.json()
9    assert created_user["name"] == user_data["name"]

五、配置管理

5.1 使用pytest-base-url

1pip install pytest-base-url

5.2 配置文件

1# pytest.ini
2[pytest]
3addopts = --base-url=http://127.0.0.1:8000

5.3 动态获取配置

1@pytest.fixture(scope="session")
2def api_client(request):
3    base_url = request.config.getoption("--base-url") or "http://127.0.0.1:8000"
4    session = requests.Session()
5    session.base_url = base_url
6    yield session
7    session.close()

六、示例代码

6.1 用户接口测试

 1# tests/api/test_users.py
 2import pytest
 3
 4class TestUserAPI:
 5    def test_get_users(self, api_client):
 6        response = api_client.get(f"{api_client.base_url}/users")
 7        assert response.status_code == 200
 8        assert isinstance(response.json(), list)
 9
10    def test_get_user_success(self, api_client):
11        response = api_client.get(f"{api_client.base_url}/users/1")
12        assert response.status_code == 200
13        user = response.json()
14        assert user["id"] == "1"
15        assert user["name"] == "张三"
16
17    def test_get_user_not_found(self, api_client):
18        response = api_client.get(f"{api_client.base_url}/users/999")
19        assert response.status_code == 404
20        assert "用户不存在" in response.json()["detail"]
21
22    def test_update_user_success(self, api_client, test_user):
23        update_data = {"name": "更新后的用户", "vip": True}
24        response = api_client.put(f"{api_client.base_url}/users/{test_user['id']}", json=update_data)
25        assert response.status_code == 200
26        updated_user = response.json()
27        assert updated_user["name"] == "更新后的用户"

6.2 订单接口测试

 1# tests/api/test_orders.py
 2import pytest
 3
 4class TestOrderAPI:
 5    def test_create_order_success(self, api_client):
 6        order_data = {
 7            "user_id": "1",
 8            "items": [{"name": "商品1", "price": 100}, {"name": "商品2", "price": 200}]
 9        }
10        response = api_client.post(f"{api_client.base_url}/orders", json=order_data)
11        assert response.status_code == 201
12        order = response.json()
13        assert order["user_id"] == "1"
14        assert order["total"] == 300
15        assert order["status"] == "pending"
16
17    def test_create_order_user_not_found(self, api_client):
18        order_data = {"user_id": "999", "items": [{"name": "商品1", "price": 100}]}
19        response = api_client.post(f"{api_client.base_url}/orders", json=order_data)
20        assert response.status_code == 404
21        assert "用户不存在" in response.json()["detail"]

七、易错点与注意事项

7.1 常见错误

  1. URL拼接错误:忘记在base_url后加斜杠
  2. 请求方法错误:用GET代替POST
  3. 请求体格式错误:应该用json=参数而不是data=
  4. 响应解析错误:响应不是JSON格式时调用response.json()会报错
  5. 测试数据污染:没有正确清理测试数据

7.2 最佳实践

  1. 使用requests.Session()复用连接
  2. 统一管理base_url
  3. 使用fixture准备和清理测试数据
  4. 断言状态码和响应体
  5. 添加详细的断言消息

八、小结

本阶段学习了接口测试实战,包括:

  • requests库的使用
  • HTTP请求方法和参数
  • 接口测试框架设计
  • 正向和反向用例设计
  • 参数化测试
  • 配置管理
最新文章