真实场景:一个登录接口的自动化测试
假设你正在学习接口测试,课程中给出的案例是测试一个电商系统的登录接口。低质量的课程可能只提供一段固定代码,而高质量的课程会引导你思考以下问题:

- ►接口返回的数据结构是怎样的?
- ►如何处理不同状态的响应(成功、失败、参数错误)?
- ►如何将测试数据与代码逻辑分离?
下面,我们用 Python 的 requests 库(v2.31.0)和 pytest(v7.4.0)来模拟一个标准化的解决路径。
问题拆解:从接口文档到可复用测试脚本
models.py
from dataclasses import dataclass
from typing import Optional
@dataclass
class LoginResponse:
"""登录接口响应模型"""
code: int
message: str
token: Optional[str] = None
user_id: Optional[int] = None
@classmethod
def from_dict(cls, data: dict):
return cls(
code=data.get('code', -1),
message=data.get('message', ''),
token=data.get('data', {}).get('token'),
user_id=data.get('data', {}).get('user_id')
)
关键点:
- ►使用
raise_for_status()明确处理 HTTP 错误。 - ►异常捕获后返回统一结构,便于后续断言。
test_login.py
import pytest
from models import LoginResponse
from api_client import login
class TestLogin:
"""登录接口测试套件"""
def test_login_success(self):
"""测试正常登录"""
response_data = login("test_user", "correct_password")
login_resp = LoginResponse.from_dict(response_data)
assert login_resp.code == 0, f"期望code=0,实际{login_resp.code}"
assert login_resp.token is not None, "登录成功应返回token"
assert len(login_resp.token) > 0, "token不应为空"
def test_login_wrong_password(self):
"""测试密码错误"""
response_data = login("test_user", "wrong_password")
login_resp = LoginResponse.from_dict(response_data)
assert login_resp.code == 1001, "密码错误应返回code 1001"
assert login_resp.token is None, "失败场景不应有token"
def test_login_empty_username(self):
"""测试用户名为空(边界值)"""
response_data = login("", "any_password")
login_resp = LoginResponse.from_dict(response_data)
assert login_resp.code == 1002, "空用户名应返回code 1002"
assert "用户名不能为空" in login_resp.message
test_login.py::TestLogin::test_login_success PASSED
test_login.py::TestLogin::test_login_wrong_password PASSED
test_login.py::TestLogin::test_login_empty_username PASSED
京公网安备 11010802030320号