Files
full-stack-doc/backend/test_api_8080.py
2025-10-14 20:05:29 +08:00

231 lines
8.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
API测试脚本 - 测试端口8080上的所有端点
"""
import requests
import json
import time
from typing import Dict, List
class CloudDriveAPITester:
def __init__(self, base_url: str = "http://localhost:8080"):
self.base_url = base_url
self.session = requests.Session()
self.session.headers.update({
'Content-Type': 'application/json',
'Accept': 'application/json'
})
def test_endpoint(self, method: str, endpoint: str, data: Dict = None, description: str = "") -> Dict:
"""测试单个端点"""
url = f"{self.base_url}{endpoint}"
try:
print(f"📍 {description or f'{method.upper()} {endpoint}'}")
if method.upper() == 'GET':
response = self.session.get(url, timeout=10)
elif method.upper() == 'POST':
response = self.session.post(url, json=data, timeout=10)
elif method.upper() == 'PUT':
response = self.session.put(url, json=data, timeout=10)
elif method.upper() == 'DELETE':
response = self.session.delete(url, timeout=10)
else:
return {"status": "error", "message": f"不支持的HTTP方法: {method}"}
if response.status_code == 200:
try:
data = response.json()
print(f" ✅ 成功 (200): {json.dumps(data, ensure_ascii=False, indent=2)[:200]}...")
return {
"status": "success",
"code": response.status_code,
"data": data
}
except json.JSONDecodeError:
print(f" ✅ 成功 (200): {response.text[:200]}...")
return {
"status": "success",
"code": response.status_code,
"text": response.text
}
else:
print(f" ❌ 失败 ({response.status_code}): {response.text[:200]}...")
return {
"status": "failed",
"code": response.status_code,
"error": response.text
}
except requests.exceptions.ConnectionError:
print(f" ❌ 连接失败 - 无法连接到 {url}")
return {"status": "connection_failed", "error": "Connection failed"}
except requests.exceptions.Timeout:
print(f" ❌ 请求超时")
return {"status": "timeout", "error": "Request timeout"}
except Exception as e:
print(f" ❌ 未知错误: {e}")
return {"status": "error", "error": str(e)}
def test_basic_endpoints(self) -> Dict:
"""测试基础端点"""
print("🔍 测试基础端点")
print("=" * 50)
results = {}
# 测试根路径
results["root"] = self.test_endpoint("GET", "/", description="根路径")
# 测试健康检查端点
results["health"] = self.test_endpoint("GET", "/health", description="健康检查")
results["api_health"] = self.test_endpoint("GET", "/api/v1/health", description="API健康检查")
# 测试文档端点
results["docs"] = self.test_endpoint("GET", "/docs", description="API文档")
results["redoc"] = self.test_endpoint("GET", "/redoc", description="ReDoc文档")
results["openapi"] = self.test_endpoint("GET", "/openapi.json", description="OpenAPI规范")
return results
def test_auth_endpoints(self) -> Dict:
"""测试认证端点"""
print("\n🔐 测试认证端点")
print("=" * 50)
results = {}
# 测试注册端点
test_user = {
"username": "testuser8080",
"email": "test8080@example.com",
"password": "Test123!@#",
"confirm_password": "Test123!@#"
}
results["register"] = self.test_endpoint("POST", "/api/v1/auth/register",
data=test_user, description="用户注册")
# 测试登录端点
login_data = {
"username": "testuser8080",
"password": "Test123!@#"
}
results["login"] = self.test_endpoint("POST", "/api/v1/auth/token",
data=login_data, description="用户登录")
return results
def test_file_endpoints(self) -> Dict:
"""测试文件端点"""
print("\n📁 测试文件端点")
print("=" * 50)
results = {}
# 测试文件列表
results["list_files"] = self.test_endpoint("GET", "/api/v1/files",
description="获取文件列表")
# 测试文件上传(模拟)
results["upload_info"] = self.test_endpoint("GET", "/api/v1/files",
description="文件上传信息")
return results
def run_all_tests(self) -> Dict:
"""运行所有测试"""
print("🧪 开始API测试 - 端口8080")
print("=" * 60)
print(f"测试目标: {self.base_url}")
print("=" * 60)
all_results = {}
# 测试基础端点
basic_results = self.test_basic_endpoints()
all_results.update(basic_results)
# 测试认证端点
auth_results = self.test_auth_endpoints()
all_results.update(auth_results)
# 测试文件端点
file_results = self.test_file_endpoints()
all_results.update(file_results)
# 生成测试报告
self.generate_report(all_results)
return all_results
def generate_report(self, results: Dict):
"""生成测试报告"""
print("\n📊 测试报告")
print("=" * 60)
total_tests = len(results)
success_tests = sum(1 for r in results.values() if r.get("status") == "success")
failed_tests = total_tests - success_tests
print(f"总测试数: {total_tests}")
print(f"成功: {success_tests}")
print(f"失败: {failed_tests}")
print(f"成功率: {(success_tests/total_tests*100):.1f}%")
if failed_tests == 0:
print("\n🎉 所有测试通过API服务运行正常")
else:
print(f"\n⚠️ 有 {failed_tests} 个测试失败,请检查服务状态")
print("\n📋 详细结果:")
for endpoint, result in results.items():
status = result.get("status", "unknown")
if status == "success":
print(f"{endpoint}")
elif status == "connection_failed":
print(f" 🔌 {endpoint} - 连接失败")
elif status == "timeout":
print(f"{endpoint} - 超时")
else:
print(f"{endpoint} - {status}")
def main():
"""主函数"""
import argparse
parser = argparse.ArgumentParser(description="云盘API测试工具")
parser.add_argument("--url", default="http://localhost:8080",
help="API基础URL (默认: http://localhost:8080)")
parser.add_argument("--wait", type=int, default=0,
help="启动前等待时间(秒)")
parser.add_argument("--basic", action="store_true", help="只测试基础端点")
parser.add_argument("--auth", action="store_true", help="只测试认证端点")
parser.add_argument("--files", action="store_true", help="只测试文件端点")
args = parser.parse_args()
if args.wait > 0:
print(f"⏳ 等待 {args.wait} 秒后开始测试...")
time.sleep(args.wait)
tester = CloudDriveAPITester(args.url)
try:
if args.basic:
tester.test_basic_endpoints()
elif args.auth:
tester.test_auth_endpoints()
elif args.files:
tester.test_file_endpoints()
else:
tester.run_all_tests()
except KeyboardInterrupt:
print("\n🛑 测试已中断")
except Exception as e:
print(f"\n❌ 测试过程中出现错误: {e}")
if __name__ == "__main__":
main()