231 lines
8.1 KiB
Python
231 lines
8.1 KiB
Python
#!/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() |