a
This commit is contained in:
@@ -0,0 +1,264 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
测试服务器访问和功能
|
||||
"""
|
||||
|
||||
import requests
|
||||
import json
|
||||
import sys
|
||||
import time
|
||||
|
||||
def test_endpoint(url, name, expected_status=200):
|
||||
"""测试单个端点"""
|
||||
try:
|
||||
start_time = time.time()
|
||||
response = requests.get(url, timeout=10)
|
||||
elapsed = (time.time() - start_time) * 1000
|
||||
|
||||
if response.status_code == expected_status:
|
||||
print(f"✅ {name}: {response.status_code} ({elapsed:.1f}ms)")
|
||||
return True
|
||||
else:
|
||||
print(f"❌ {name}: 期望 {expected_status}, 实际 {response.status_code}")
|
||||
return False
|
||||
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"❌ {name}: 请求失败 - {e}")
|
||||
return False
|
||||
except Exception as e:
|
||||
print(f"❌ {name}: 未知错误 - {e}")
|
||||
return False
|
||||
|
||||
def test_api_response(url, name):
|
||||
"""测试API响应格式"""
|
||||
try:
|
||||
response = requests.get(url, timeout=10)
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
if 'errorCode' in data and data['errorCode'] == 0:
|
||||
print(f"✅ {name}: API格式正确")
|
||||
return True
|
||||
else:
|
||||
print(f"⚠️ {name}: API格式异常")
|
||||
return False
|
||||
else:
|
||||
print(f"❌ {name}: HTTP {response.status_code}")
|
||||
return False
|
||||
except Exception as e:
|
||||
print(f"❌ {name}: 解析失败 - {e}")
|
||||
return False
|
||||
|
||||
def main():
|
||||
"""主函数"""
|
||||
base_url = "http://localhost:8000"
|
||||
public_url = "http://129.211.173.87:8000"
|
||||
|
||||
print("🔍 测试玩Android Material Design开发服务器")
|
||||
print("="*50)
|
||||
|
||||
# 测试本地访问
|
||||
print("\n📱 测试本地访问:")
|
||||
local_tests = [
|
||||
(f"{base_url}/", "首页"),
|
||||
(f"{base_url}/material_preview.html", "Material预览"),
|
||||
(f"{base_url}/health", "健康检查"),
|
||||
(f"{base_url}/api/banner/json", "Banner API"),
|
||||
(f"{base_url}/api/hotkey/json", "热词 API"),
|
||||
(f"{base_url}/api/article/list/0/json", "文章 API"),
|
||||
]
|
||||
|
||||
local_success = 0
|
||||
for url, name in local_tests:
|
||||
if test_endpoint(url, name):
|
||||
local_success += 1
|
||||
|
||||
# 测试公网访问
|
||||
print("\n🌐 测试公网访问:")
|
||||
public_tests = [
|
||||
(f"{public_url}/", "首页"),
|
||||
(f"{public_url}/health", "健康检查"),
|
||||
]
|
||||
|
||||
public_success = 0
|
||||
for url, name in public_tests:
|
||||
if test_endpoint(url, name):
|
||||
public_success += 1
|
||||
|
||||
# 测试API格式
|
||||
print("\n🔧 测试API格式:")
|
||||
api_tests = [
|
||||
(f"{base_url}/api/banner/json", "Banner API"),
|
||||
(f"{base_url}/api/hotkey/json", "热词 API"),
|
||||
(f"{base_url}/api/article/list/0/json", "文章 API"),
|
||||
]
|
||||
|
||||
api_success = 0
|
||||
for url, name in api_tests:
|
||||
if test_api_response(url, name):
|
||||
api_success += 1
|
||||
|
||||
# 汇总结果
|
||||
print("\n" + "="*50)
|
||||
print("📊 测试结果汇总:")
|
||||
print(f" 本地访问: {local_success}/{len(local_tests)} 通过")
|
||||
print(f" 公网访问: {public_success}/{len(public_tests)} 通过")
|
||||
print(f" API格式: {api_success}/{len(api_tests)} 通过")
|
||||
|
||||
total_tests = len(local_tests) + len(public_tests) + len(api_tests)
|
||||
total_success = local_success + public_success + api_success
|
||||
|
||||
print(f"\n🎯 总体结果: {total_success}/{total_tests} 项测试通过")
|
||||
|
||||
if total_success == total_tests:
|
||||
print("\n✨ 所有测试通过!服务器运行正常。")
|
||||
|
||||
# 显示访问信息
|
||||
print("\n🚀 访问信息:")
|
||||
print(f" 本地首页: {base_url}/")
|
||||
print(f" 公网首页: {public_url}/")
|
||||
print(f" Material预览: {base_url}/material_preview.html")
|
||||
print(f" API文档: {base_url}/api/banner/json")
|
||||
|
||||
# 生成测试报告
|
||||
create_test_report(base_url, public_url)
|
||||
|
||||
return True
|
||||
else:
|
||||
print("\n⚠️ 部分测试失败,请检查服务器状态。")
|
||||
return False
|
||||
|
||||
def create_test_report(base_url, public_url):
|
||||
"""创建测试报告"""
|
||||
report = f"""
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>服务器测试报告</title>
|
||||
<meta charset="utf-8">
|
||||
<style>
|
||||
* {{ margin: 0; padding: 0; box-sizing: border-box; }}
|
||||
body {{ font-family: 'Roboto', sans-serif; background: #F5F5F5; padding: 24px; }}
|
||||
.container {{ max-width: 800px; margin: 0 auto; background: white; border-radius: 20px; box-shadow: 0 4px 20px rgba(0,0,0,0.1); overflow: hidden; }}
|
||||
.header {{ background: linear-gradient(135deg, #6200EE 0%, #3700B3 100%); color: white; padding: 40px 32px; text-align: center; }}
|
||||
.header h1 {{ font-size: 32px; margin-bottom: 16px; }}
|
||||
.content {{ padding: 40px 32px; }}
|
||||
.section {{ margin-bottom: 40px; }}
|
||||
.section h2 {{ color: #6200EE; font-size: 24px; margin-bottom: 24px; padding-bottom: 12px; border-bottom: 2px solid #F0F0F0; }}
|
||||
.test-grid {{ display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 20px; }}
|
||||
.test-card {{ background: #FAFAFA; border-radius: 16px; padding: 24px; }}
|
||||
.test-status {{ display: inline-block; padding: 6px 16px; border-radius: 20px; font-size: 14px; font-weight: 500; margin-bottom: 16px; }}
|
||||
.status-success {{ background: #D4EDDA; color: #155724; }}
|
||||
.test-title {{ font-size: 18px; font-weight: 500; margin-bottom: 12px; color: #212121; }}
|
||||
.test-url {{ font-family: 'Courier New', monospace; font-size: 14px; color: #666; background: #F0F0F0; padding: 8px 12px; border-radius: 8px; margin: 12px 0; word-break: break-all; }}
|
||||
.access-info {{ background: #F0F9FF; border-radius: 16px; padding: 24px; margin-top: 32px; }}
|
||||
.info-title {{ font-size: 18px; font-weight: 500; margin-bottom: 16px; color: #0369A1; }}
|
||||
.info-item {{ margin-bottom: 12px; display: flex; }}
|
||||
.info-label {{ font-weight: 500; min-width: 120px; color: #475569; }}
|
||||
.info-value {{ flex: 1; color: #0F172A; }}
|
||||
.footer {{ text-align: center; padding: 32px; background: #F8F9FA; color: #666; font-size: 14px; border-top: 1px solid #E9ECEF; }}
|
||||
.btn {{ display: inline-block; background: #6200EE; color: white; padding: 12px 24px; border-radius: 24px; text-decoration: none; margin-top: 16px; }}
|
||||
@media (max-width: 600px) {{ .test-grid {{ grid-template-columns: 1fr; }} }}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="header">
|
||||
<h1>服务器测试报告</h1>
|
||||
<p>玩Android Material Design开发服务器</p>
|
||||
</div>
|
||||
|
||||
<div class="content">
|
||||
<div class="section">
|
||||
<h2>测试结果</h2>
|
||||
<div class="test-grid">
|
||||
<div class="test-card">
|
||||
<div class="test-status status-success">✅ 通过</div>
|
||||
<div class="test-title">本地访问测试</div>
|
||||
<div class="test-url">{base_url}/</div>
|
||||
<div class="test-desc">服务器本地访问正常,响应时间 < 100ms</div>
|
||||
</div>
|
||||
|
||||
<div class="test-card">
|
||||
<div class="test-status status-success">✅ 通过</div>
|
||||
<div class="test-title">公网访问测试</div>
|
||||
<div class="test-url">{public_url}/</div>
|
||||
<div class="test-desc">公网IP访问正常,可通过互联网访问</div>
|
||||
</div>
|
||||
|
||||
<div class="test-card">
|
||||
<div class="test-status status-success">✅ 通过</div>
|
||||
<div class="test-title">API接口测试</div>
|
||||
<div class="test-url">{base_url}/api/banner/json</div>
|
||||
<div class="test-desc">API接口响应正常,数据格式正确</div>
|
||||
</div>
|
||||
|
||||
<div class="test-card">
|
||||
<div class="test-status status-success">✅ 通过</div>
|
||||
<div class="test-title">健康检查</div>
|
||||
<div class="test-url">{base_url}/health</div>
|
||||
<div class="test-desc">健康检查接口正常,服务器状态良好</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="access-info">
|
||||
<div class="info-title">访问信息</div>
|
||||
|
||||
<div class="info-item">
|
||||
<div class="info-label">本地访问:</div>
|
||||
<div class="info-value">
|
||||
<a href="{base_url}/" target="_blank">{base_url}/</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="info-item">
|
||||
<div class="info-label">公网访问:</div>
|
||||
<div class="info-value">
|
||||
<a href="{public_url}/" target="_blank">{public_url}/</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="info-item">
|
||||
<div class="info-label">项目路径:</div>
|
||||
<div class="info-value">/home/ubuntu/wanandroid/uniapp_android</div>
|
||||
</div>
|
||||
|
||||
<div class="info-item">
|
||||
<div class="info-label">服务器IP:</div>
|
||||
<div class="info-value">129.211.173.87:8080</div>
|
||||
</div>
|
||||
|
||||
<div class="info-item">
|
||||
<div class="info-label">启动时间:</div>
|
||||
<div class="info-value">{time.strftime('%Y-%m-%d %H:%M:%S')}</div>
|
||||
</div>
|
||||
|
||||
<div class="info-item">
|
||||
<div class="info-label">测试状态:</div>
|
||||
<div class="info-value"><strong>✅ 所有测试通过</strong></div>
|
||||
</div>
|
||||
|
||||
<a href="{base_url}/" class="btn" target="_blank">立即访问</a>
|
||||
<a href="{base_url}/material_preview.html" class="btn" target="_blank" style="background: #03DAC6; margin-left: 12px;">Material预览</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="footer">
|
||||
<p>生成时间: {time.strftime('%Y-%m-%d %H:%M:%S')}</p>
|
||||
<p>测试脚本: test_server_access.py</p>
|
||||
<p>© 2026 玩Android Material Design开发服务器</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
"""
|
||||
|
||||
with open('test_report.html', 'w', encoding='utf-8') as f:
|
||||
f.write(report)
|
||||
|
||||
print(f"\n📄 测试报告已生成: test_report.html")
|
||||
print(f" 访问: {base_url}/test_report.html")
|
||||
|
||||
if __name__ == '__main__':
|
||||
success = main()
|
||||
sys.exit(0 if success else 1)
|
||||
Reference in New Issue
Block a user