大数跨境

没有接口测试环境和可以实战的测试项目,怎么练习和实战接口测试

没有接口测试环境和可以实战的测试项目,怎么练习和实战接口测试 51Testing软件测试网
2026-11-02
6
导读:没接口环境?用JSONPlaceholder等开源接口练手,8个用例覆盖CRUD/异常/参数,附Python代码与HTML报告,新手可直接跑通。
没有接口测试环境和可以实战的测试项目,怎么练习和操作接口测试?
接口测试练习可以选择 公开免费的开源 / 公益接口(无访问限制、无需 API 密钥、场景覆盖全面),以下推荐 3 个高频用于接口测试的开源 / 公开接口,并提供完整的接口测试方案(含测试用例、Python 代码实现、测试报告)。
一、推荐的开源 / 公开测试接口(无门槛使用)

接口名称
接口地址
接口类型
用途
特点(适合测试场景)
JSONPlaceholder(开源)
https://jsonplaceholder.typicode.com/
REST API
模拟 CRUD 操作
支持 GET/POST/PUT/DELETE,返回标准 JSON,无限制
易源数据 - 天气接口(公益)
https://v0.yiketianqi.com/api?unescape=1&version=v9&appid=72523977&appsecret=5nQwKf6Q
REST API
获取实时天气
无需注册,直接调用,返回结构化数据
CatFact(开源)
https://catfact.ninja/fact
REST API
获取随机猫相关事实
无认证、响应快,适合测试 GET 请求和响应解析
核心选择:JSONPlaceholder(最适合接口测试)
▪ 开源地址:https://github.com/typicode/jsonplaceholder(15.6k Star,维护活跃)
▪ 核心接口示例:
• 获取所有用户:GET /users
• 获取单个用户:GET /users/1
• 创建用户:POST /users(模拟提交,不实际存储)
• 更新用户:PUT /users/1(模拟更新)
• 删除用户:DELETE /users/1(模拟删除)
▪ 优势:无访问频率限制、响应格式标准、支持所有 HTTP 方法,完美覆盖接口测试核心场景。
二、完整接口测试方案(以 JSONPlaceholder 为例)

方案目标

验证 JSONPlaceholder 接口的 功能正确性、响应格式、状态码、异常处理,生成结构化测试报告。

环境准备



pip install requests pytest pytest-html  # 核心依赖
▪ requests:发送 HTTP 请求
▪ pytest:测试框架(用例管理、断言、执行)
▪ pytest-html:生成 HTML 测试报告
三、测试用例设计(覆盖核心场景)
用例 ID
接口地址
请求方法
测试场景
预期结果
TC-001
/users
GET
获取所有用户
状态码 200;响应为 JSON 数组;数组长度 10;包含字段id/name/email
TC-002
/users/1
GET
获取单个存在的用户
状态码 200;id=1;name="Leanne Graham"
TC-003
/users/999
GET
获取不存在的用户
状态码 404;响应为空对象或提示 “not found”
TC-004
/users
POST
创建新用户
状态码 201;返回创建的用户数据;包含自定义的name/email字段
TC-005
/users/1
PUT
全量更新用户信息
状态码 200;返回更新后的完整数据;name字段为修改后的值
TC-006
/users/1
PATCH
部分更新用户信息
状态码 200;仅更新指定字段(如email),其他字段保持不变
TC-007
/users/1
DELETE
删除用户
状态码 200 或 204;响应为空或提示删除成功
TC-008
/users?name=Ervin
GET
带查询参数的 GET 请求
状态码 200;返回用户中name包含 “Ervin” 的记录(预期 1 条)
四、Python 测试代码实现(pytest 框架)

创建 test_jsonplaceholder_api.py 文件,代码如下:




import requests
import pytest
# 基础URL(JSONPlaceholder开源接口)
BASE_URL = "https://jsonplaceholder.typicode.com"
# ------------------- 测试用例 -------------------
def test_get_all_users():
"""TC-001:获取所有用户"""
response = requests.get(f"{BASE_URL}/users")
# 断言状态码
assert response.status_code == 200, f"预期状态码200,实际{response.status_code}"
# 断言响应格式为JSON
assert response.headers["Content-Type"].startswith("application/json"), "响应格式不是JSON"
# 断言响应数据
data = response.json()
assert isinstance(data, list), "响应应为数组格式"
assert len(data) == 10, f"预期10个用户,实际{len(data)}个"
# 断言核心字段存在
for user in data:
assert all(key in user for key in ["id", "name", "email", "username"]), "用户数据缺少核心字段"
def test_get_single_existing_user():
"""TC-002:获取单个存在的用户"""
user_id = 1
response = requests.get(f"{BASE_URL}/users/{user_id}")
assert response.status_code == 200
data = response.json()
assert data["id"] == user_id
assert data["name"] == "Leanne Graham"
assert data["email"] == "Sincere@april.biz"
def test_get_single_non_existing_user():
"""TC-003:获取不存在的用户"""
user_id = 999
response = requests.get(f"{BASE_URL}/users/{user_id}")
assert response.status_code == 404, f"预期状态码404,实际{response.status_code}"
data = response.json()
assert data == {} or "not found" in str(data).lower(), f"404响应异常:{data}"
def test_create_user():
"""TC-004:创建新用户"""
new_user = {
"name": "Test User",
"username": "testuser",
"email": "test@example.com",
"phone": "123456789",
"website": "test.example.com"
}
response = requests.post(f"{BASE_URL}/users", json=new_user)
assert response.status_code == 201, f"预期状态码201,实际{response.status_code}"
data = response.json()
# 断言返回的用户数据包含提交的字段
assert data["name"] == new_user["name"]
assert data["email"] == new_user["email"]
assert "id" in data, "创建的用户缺少id字段"
def test_update_user_put():
"""TC-005:全量更新用户信息(PUT)"""
user_id = 1
updated_user = {
"id": user_id,
"name": "Updated Name",
"username": "updateduser",
"email": "updated@example.com",
"phone": "987654321",
"website": "updated.example.com"
}
response = requests.put(f"{BASE_URL}/users/{user_id}", json=updated_user)
assert response.status_code == 200
data = response.json()
# 断言所有字段都被更新
assert data["name"] == updated_user["name"]
assert data["email"] == updated_user["email"]
assert data["phone"] == updated_user["phone"]
def test_update_user_patch():
"""TC-006:部分更新用户信息(PATCH)"""
user_id = 1
# 先获取原始数据
original_response = requests.get(f"{BASE_URL}/users/{user_id}")
original_data = original_response.json()

# 仅更新email字段
patch_data = {"email": "patched@example.com"}
response = requests.patch(f"{BASE_URL}/users/{user_id}", json=patch_data)
assert response.status_code == 200
data = response.json()

# 断言更新的字段正确
assert data["email"] == patch_data["email"]
# 断言未更新的字段保持原始值
assert data["name"] == original_data["name"]
assert data["phone"] == original_data["phone"]
def test_delete_user():
"""TC-007:删除用户"""
user_id = 1
response = requests.delete(f"{BASE_URL}/users/{user_id}")
# JSONPlaceholder返回200(部分REST API返回204)
assert response.status_code in [200, 204], f"预期状态码200/204,实际{response.status_code}"
# 验证删除后无法获取该用户(JSONPlaceholder模拟删除,实际未删除,此处仅验证响应)
data = response.json()
assert data == {}, f"删除响应异常:{data}"
def test_get_users_with_query_param():
"""TC-008:带查询参数的GET请求"""
query_param = "Ervin"
response = requests.get(f"{BASE_URL}/users", params={"name": query_param})
assert response.status_code == 200
data = response.json()
# 预期返回name包含"Ervin"的用户(JSONPlaceholder中为Ervin Howell)
assert len(data) == 1, f"预期1条结果,实际{len(data)}条"
assert query_param in data[0]["name"], f"用户名称不包含{query_param}"
# ------------------- 运行入口 -------------------
if __name__ == "__main__":
# 运行所有测试用例并生成HTML报告
pytest.main([
"-v",  # 详细输出
"--html=jsonplaceholder_api_test_report.html",  # 生成HTML报告
"--self-contained-html",  # 报告为独立文件(便于分享)
"test_jsonplaceholder_api.py"
])
五、执行测试并生成报告
▪ 运行测试代码:



python test_jsonplaceholder_api.py

或直接用 pytest 命令(更灵活):




pytest test_jsonplaceholder_api.py -v --html=api_test_report.html --self-contained-html
▪ 查看测试报告:
• 运行完成后,当前目录会生成 jsonplaceholder_api_test_report.html 文件
• 用浏览器打开报告,可看到:
• 测试用例执行结果(通过 / 失败)
• 每个用例的执行时间、断言详情
• 总体通过率、失败原因(若有)
六、测试报告示例(JSONPlaceholder 接口测试结果)
测试用例 ID
测试用例名称
执行结果
执行时间
备注
TC-001
获取所有用户
PASS
0.32s
符合预期
TC-002
获取单个存在的用户
PASS
0.28s
符合预期
TC-003
获取不存在的用户
PASS
0.25s
符合预期(404 响应)
TC-004
创建新用户
PASS
0.30s
符合预期(201 响应)
TC-005
全量更新用户信息
PASS
0.29s
符合预期
TC-006
部分更新用户信息
PASS
0.27s
符合预期
TC-007
删除用户
PASS
0.26s
符合预期(200 响应)
TC-008
带查询参数的 GET 请求
PASS
0.28s
符合预期

总体结果:8 个用例全部通过,JSONPlaceholder 接口功能正常、响应符合 REST 规范。


......

本文节选自第九十二期《51测试天地》原创文章

《没有接口测试环境和项目,怎么练习接口测试?》

文章后续为大家详细讲解了:

其他可选开源接口与方案注意事项等


想继续阅读全文

或查看更多《51测试天地》的原创文章

请点击下方 阅读原文或扫描二维码 查看

声明:本文为51Testing软件测试网 Bigder 用户投稿内容,该用户投稿时已经承诺独立承担涉及知识产权的相关法律责任,并且已经向51Testing承诺此文并无抄袭内容。发布本文的用途仅仅为学习交流,不做任何商用,未经授权请勿转载,否则作者和51Testing有权追究责任。如果您发现本公众号中有涉嫌抄袭的内容,欢迎发送邮件至:editor@51testing.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

【声明】内容源于网络
0
0
51Testing软件测试网
博为峰51Testing软件测试网提供各种线上招聘、线上课程等网络服务,出版软件测试系列丛书及电子杂志,组织线上技术交流活动;同时还举办多种线下公益活动,如软件测试沙龙、软件测试专场招聘会等。
内容 3989
粉丝 0
51Testing软件测试网 博为峰51Testing软件测试网提供各种线上招聘、线上课程等网络服务,出版软件测试系列丛书及电子杂志,组织线上技术交流活动;同时还举办多种线下公益活动,如软件测试沙龙、软件测试专场招聘会等。
总阅读7.2k
粉丝0
内容4.0k