forked from moyin/whale-town-front
test:完善API测试框架
- 添加Godot内置API测试脚本 - 实现Python API客户端测试套件 - 添加快速测试和完整测试脚本 - 支持跨平台测试运行(Windows/Linux) - 更新测试文档和使用指南
This commit is contained in:
183
scripts/network/ApiTestScript.gd
Normal file
183
scripts/network/ApiTestScript.gd
Normal file
@@ -0,0 +1,183 @@
|
||||
extends Node
|
||||
|
||||
# API测试脚本 - 验证更新后的接口逻辑
|
||||
class_name ApiTestScript
|
||||
|
||||
# 测试用例
|
||||
var test_cases = [
|
||||
{
|
||||
"name": "测试网络连接",
|
||||
"operation": "network_test",
|
||||
"method": "get_app_status"
|
||||
},
|
||||
{
|
||||
"name": "测试发送邮箱验证码",
|
||||
"operation": "send_code",
|
||||
"method": "send_email_verification",
|
||||
"params": ["test@example.com"]
|
||||
},
|
||||
{
|
||||
"name": "测试邮箱冲突检测",
|
||||
"operation": "send_code",
|
||||
"method": "send_email_verification",
|
||||
"params": ["existing@example.com"] # 假设这个邮箱已存在
|
||||
},
|
||||
{
|
||||
"name": "测试登录",
|
||||
"operation": "login",
|
||||
"method": "login",
|
||||
"params": ["testuser", "password123"]
|
||||
},
|
||||
{
|
||||
"name": "测试注册",
|
||||
"operation": "register",
|
||||
"method": "register",
|
||||
"params": ["newuser", "newpassword123", "新用户", "newuser@example.com", "123456"]
|
||||
}
|
||||
]
|
||||
|
||||
func _ready():
|
||||
print("=== API测试脚本启动 ===")
|
||||
print("测试最新API v1.1.1的接口逻辑和toast显示")
|
||||
|
||||
# 延迟一下确保NetworkManager已初始化
|
||||
await get_tree().create_timer(1.0).timeout
|
||||
|
||||
# 运行测试用例
|
||||
run_tests()
|
||||
|
||||
func run_tests():
|
||||
print("\n🧪 开始运行API测试用例...")
|
||||
|
||||
for i in range(test_cases.size()):
|
||||
var test_case = test_cases[i]
|
||||
print("\n--- 测试 %d: %s ---" % [i + 1, test_case.name])
|
||||
|
||||
await run_single_test(test_case)
|
||||
|
||||
# 测试间隔
|
||||
await get_tree().create_timer(2.0).timeout
|
||||
|
||||
print("\n✅ 所有测试用例执行完成")
|
||||
|
||||
func run_single_test(test_case: Dictionary):
|
||||
var operation = test_case.operation
|
||||
var method = test_case.method
|
||||
var params = test_case.get("params", [])
|
||||
|
||||
print("操作类型: ", operation)
|
||||
print("调用方法: ", method)
|
||||
print("参数: ", params)
|
||||
|
||||
# 创建回调函数
|
||||
var callback = func(success: bool, data: Dictionary, error_info: Dictionary):
|
||||
handle_test_response(test_case.name, operation, success, data, error_info)
|
||||
|
||||
# 调用对应的NetworkManager方法
|
||||
var request_id = ""
|
||||
match method:
|
||||
"get_app_status":
|
||||
request_id = NetworkManager.get_app_status(callback)
|
||||
"send_email_verification":
|
||||
if params.size() > 0:
|
||||
request_id = NetworkManager.send_email_verification(params[0], callback)
|
||||
"login":
|
||||
if params.size() >= 2:
|
||||
request_id = NetworkManager.login(params[0], params[1], callback)
|
||||
"register":
|
||||
if params.size() >= 5:
|
||||
request_id = NetworkManager.register(params[0], params[1], params[2], params[3], params[4], callback)
|
||||
_:
|
||||
print("❌ 未知的测试方法: ", method)
|
||||
return
|
||||
|
||||
if request_id != "":
|
||||
print("✅ 请求已发送,ID: ", request_id)
|
||||
else:
|
||||
print("❌ 请求发送失败")
|
||||
|
||||
func handle_test_response(test_name: String, operation: String, success: bool, data: Dictionary, error_info: Dictionary):
|
||||
print("\n=== %s 响应结果 ===" % test_name)
|
||||
print("成功: ", success)
|
||||
print("数据: ", data)
|
||||
print("错误信息: ", error_info)
|
||||
|
||||
# 使用ResponseHandler处理响应
|
||||
var result = ResponseHandler.handle_response(operation, success, data, error_info)
|
||||
|
||||
print("\n--- ResponseHandler处理结果 ---")
|
||||
print("处理成功: ", result.success)
|
||||
print("消息: ", result.message)
|
||||
print("Toast类型: ", result.toast_type)
|
||||
print("是否显示Toast: ", result.should_show_toast)
|
||||
|
||||
# 模拟Toast显示
|
||||
if result.should_show_toast:
|
||||
print("🍞 Toast显示: [%s] %s" % [result.toast_type.to_upper(), result.message])
|
||||
|
||||
# 检查特殊情况
|
||||
check_special_cases(data, error_info)
|
||||
|
||||
func check_special_cases(data: Dictionary, error_info: Dictionary):
|
||||
var response_code = error_info.get("response_code", 0)
|
||||
var error_code = data.get("error_code", "")
|
||||
|
||||
print("\n--- 特殊情况检查 ---")
|
||||
|
||||
# 检查409冲突
|
||||
if response_code == 409:
|
||||
print("✅ 检测到409冲突状态码 - 邮箱冲突检测正常工作")
|
||||
|
||||
# 检查206测试模式
|
||||
if response_code == 206 or error_code == "TEST_MODE_ONLY":
|
||||
print("✅ 检测到206测试模式 - 测试模式处理正常工作")
|
||||
if data.has("data") and data.data.has("verification_code"):
|
||||
print("🔑 测试模式验证码: ", data.data.verification_code)
|
||||
|
||||
# 检查429频率限制
|
||||
if response_code == 429 or error_code == "TOO_MANY_REQUESTS":
|
||||
print("✅ 检测到429频率限制 - 频率限制处理正常工作")
|
||||
if data.has("throttle_info"):
|
||||
print("⏰ 限制信息: ", data.throttle_info)
|
||||
|
||||
# 检查其他重要状态码
|
||||
match response_code:
|
||||
200:
|
||||
print("✅ 200 成功响应")
|
||||
201:
|
||||
print("✅ 201 创建成功")
|
||||
400:
|
||||
print("⚠️ 400 请求参数错误")
|
||||
401:
|
||||
print("⚠️ 401 认证失败")
|
||||
404:
|
||||
print("⚠️ 404 资源不存在")
|
||||
500:
|
||||
print("❌ 500 服务器内部错误")
|
||||
503:
|
||||
print("❌ 503 服务不可用")
|
||||
|
||||
# 手动触发测试的方法
|
||||
func test_email_conflict():
|
||||
print("\n🧪 手动测试邮箱冲突检测...")
|
||||
var callback = func(success: bool, data: Dictionary, error_info: Dictionary):
|
||||
handle_test_response("邮箱冲突测试", "send_code", success, data, error_info)
|
||||
|
||||
NetworkManager.send_email_verification("existing@example.com", callback)
|
||||
|
||||
func test_rate_limit():
|
||||
print("\n🧪 手动测试频率限制...")
|
||||
var callback = func(success: bool, data: Dictionary, error_info: Dictionary):
|
||||
handle_test_response("频率限制测试", "send_code", success, data, error_info)
|
||||
|
||||
# 快速发送多个请求来触发频率限制
|
||||
for i in range(3):
|
||||
NetworkManager.send_email_verification("test@example.com", callback)
|
||||
await get_tree().create_timer(0.1).timeout
|
||||
|
||||
func test_test_mode():
|
||||
print("\n🧪 手动测试测试模式...")
|
||||
var callback = func(success: bool, data: Dictionary, error_info: Dictionary):
|
||||
handle_test_response("测试模式测试", "send_code", success, data, error_info)
|
||||
|
||||
NetworkManager.send_email_verification("testmode@example.com", callback)
|
||||
Reference in New Issue
Block a user