262 lines
8.4 KiB
Python
262 lines
8.4 KiB
Python
|
|
#!/usr/bin/env python3
|
|||
|
|
"""
|
|||
|
|
优化历史功能测试脚本
|
|||
|
|
测试API接口和数据库操作
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
import requests
|
|||
|
|
import json
|
|||
|
|
import time
|
|||
|
|
from datetime import datetime
|
|||
|
|
|
|||
|
|
# 测试配置
|
|||
|
|
BASE_URL = "http://localhost:5002"
|
|||
|
|
TEST_USER_ID = 1
|
|||
|
|
|
|||
|
|
def test_api_endpoint(endpoint, method="GET", data=None, headers=None):
|
|||
|
|
"""测试API接口"""
|
|||
|
|
url = f"{BASE_URL}{endpoint}"
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
if method == "GET":
|
|||
|
|
response = requests.get(url, headers=headers)
|
|||
|
|
elif method == "POST":
|
|||
|
|
response = requests.post(url, json=data, headers=headers)
|
|||
|
|
elif method == "PUT":
|
|||
|
|
response = requests.put(url, json=data, headers=headers)
|
|||
|
|
elif method == "DELETE":
|
|||
|
|
response = requests.delete(url, headers=headers)
|
|||
|
|
|
|||
|
|
print(f"🔍 {method} {endpoint}")
|
|||
|
|
print(f" 状态码: {response.status_code}")
|
|||
|
|
|
|||
|
|
if response.status_code == 200:
|
|||
|
|
result = response.json()
|
|||
|
|
if result.get('success'):
|
|||
|
|
print(f" ✅ 成功: {result.get('message', '操作成功')}")
|
|||
|
|
return result
|
|||
|
|
else:
|
|||
|
|
print(f" ❌ 失败: {result.get('message', '未知错误')}")
|
|||
|
|
return None
|
|||
|
|
else:
|
|||
|
|
print(f" ❌ HTTP错误: {response.status_code}")
|
|||
|
|
return None
|
|||
|
|
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f" ❌ 请求失败: {str(e)}")
|
|||
|
|
return None
|
|||
|
|
|
|||
|
|
def test_optimization_history_page():
|
|||
|
|
"""测试优化历史页面"""
|
|||
|
|
print("=" * 60)
|
|||
|
|
print("🧪 测试优化历史页面")
|
|||
|
|
print("=" * 60)
|
|||
|
|
|
|||
|
|
# 测试页面访问
|
|||
|
|
response = requests.get(f"{BASE_URL}/optimization-history")
|
|||
|
|
if response.status_code == 200:
|
|||
|
|
print("✅ 优化历史页面访问成功")
|
|||
|
|
return True
|
|||
|
|
else:
|
|||
|
|
print(f"❌ 优化历史页面访问失败: {response.status_code}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
def test_optimization_history_api():
|
|||
|
|
"""测试优化历史API接口"""
|
|||
|
|
print("=" * 60)
|
|||
|
|
print("🧪 测试优化历史API接口")
|
|||
|
|
print("=" * 60)
|
|||
|
|
|
|||
|
|
# 模拟用户认证头(实际应用中需要真实的token)
|
|||
|
|
headers = {
|
|||
|
|
'Content-Type': 'application/json',
|
|||
|
|
'Authorization': 'Bearer test_token' # 这里需要真实的认证token
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 1. 测试获取历史记录
|
|||
|
|
print("\n📋 测试获取历史记录...")
|
|||
|
|
result = test_api_endpoint("/api/optimization-history", "GET", headers=headers)
|
|||
|
|
|
|||
|
|
# 2. 测试添加历史记录
|
|||
|
|
print("\n➕ 测试添加历史记录...")
|
|||
|
|
test_data = {
|
|||
|
|
"original_text": "测试原始文本",
|
|||
|
|
"optimized_text": "这是测试优化后的文本内容,包含了更详细和结构化的信息。",
|
|||
|
|
"optimization_type": "测试类型",
|
|||
|
|
"industry": "测试行业",
|
|||
|
|
"profession": "测试职业",
|
|||
|
|
"tags": ["测试标签1", "测试标签2"]
|
|||
|
|
}
|
|||
|
|
result = test_api_endpoint("/api/optimization-history", "POST", data=test_data, headers=headers)
|
|||
|
|
|
|||
|
|
# 3. 测试获取统计信息
|
|||
|
|
print("\n📊 测试获取统计信息...")
|
|||
|
|
result = test_api_endpoint("/api/optimization-history/stats", "GET", headers=headers)
|
|||
|
|
|
|||
|
|
# 4. 测试获取分析数据
|
|||
|
|
print("\n📈 测试获取分析数据...")
|
|||
|
|
result = test_api_endpoint("/api/optimization-history/analytics", "GET", headers=headers)
|
|||
|
|
|
|||
|
|
# 5. 测试获取收藏记录
|
|||
|
|
print("\n⭐ 测试获取收藏记录...")
|
|||
|
|
result = test_api_endpoint("/api/optimization-history/favorites", "GET", headers=headers)
|
|||
|
|
|
|||
|
|
return True
|
|||
|
|
|
|||
|
|
def test_database_connection():
|
|||
|
|
"""测试数据库连接"""
|
|||
|
|
print("=" * 60)
|
|||
|
|
print("🧪 测试数据库连接")
|
|||
|
|
print("=" * 60)
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
import pymysql
|
|||
|
|
from config import Config
|
|||
|
|
|
|||
|
|
# 解析数据库连接信息
|
|||
|
|
db_uri = Config.TENCENT_SQLALCHEMY_DATABASE_URI
|
|||
|
|
if db_uri.startswith('mysql+pymysql://'):
|
|||
|
|
db_uri = db_uri.replace('mysql+pymysql://', '')
|
|||
|
|
|
|||
|
|
if '?' in db_uri:
|
|||
|
|
db_uri, params = db_uri.split('?', 1)
|
|||
|
|
|
|||
|
|
auth_host_db = db_uri.split('@')
|
|||
|
|
auth_part = auth_host_db[0]
|
|||
|
|
host_db_part = auth_host_db[1]
|
|||
|
|
|
|||
|
|
username, password = auth_part.split(':', 1)
|
|||
|
|
host_port, database = host_db_part.split('/', 1)
|
|||
|
|
host, port = host_port.split(':')
|
|||
|
|
port = int(port)
|
|||
|
|
|
|||
|
|
# 连接数据库
|
|||
|
|
connection = pymysql.connect(
|
|||
|
|
host=host,
|
|||
|
|
port=port,
|
|||
|
|
user=username,
|
|||
|
|
password=password,
|
|||
|
|
database=database,
|
|||
|
|
charset='utf8mb4'
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
cursor = connection.cursor()
|
|||
|
|
|
|||
|
|
# 检查表是否存在
|
|||
|
|
tables = ['optimization_history', 'optimization_tags', 'optimization_favorites', 'user_usage_stats', 'system_config']
|
|||
|
|
|
|||
|
|
for table in tables:
|
|||
|
|
cursor.execute(f"SHOW TABLES LIKE '{table}'")
|
|||
|
|
if cursor.fetchone():
|
|||
|
|
cursor.execute(f"SELECT COUNT(*) FROM {table}")
|
|||
|
|
count = cursor.fetchone()[0]
|
|||
|
|
print(f"✅ 表 {table} 存在,记录数: {count}")
|
|||
|
|
else:
|
|||
|
|
print(f"❌ 表 {table} 不存在")
|
|||
|
|
|
|||
|
|
# 检查示例数据
|
|||
|
|
cursor.execute("SELECT id, original_text, optimization_type FROM optimization_history LIMIT 3")
|
|||
|
|
records = cursor.fetchall()
|
|||
|
|
print(f"\n📋 示例历史记录:")
|
|||
|
|
for record in records:
|
|||
|
|
print(f" ID: {record[0]}, 类型: {record[2]}, 内容: {record[1][:30]}...")
|
|||
|
|
|
|||
|
|
cursor.close()
|
|||
|
|
connection.close()
|
|||
|
|
|
|||
|
|
print("✅ 数据库连接测试成功")
|
|||
|
|
return True
|
|||
|
|
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"❌ 数据库连接测试失败: {str(e)}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
def test_frontend_integration():
|
|||
|
|
"""测试前端集成"""
|
|||
|
|
print("=" * 60)
|
|||
|
|
print("🧪 测试前端集成")
|
|||
|
|
print("=" * 60)
|
|||
|
|
|
|||
|
|
# 检查优化历史页面模板是否存在
|
|||
|
|
try:
|
|||
|
|
with open('src/flask_prompt_master/templates/optimization_history.html', 'r', encoding='utf-8') as f:
|
|||
|
|
content = f.read()
|
|||
|
|
|
|||
|
|
# 检查关键元素
|
|||
|
|
checks = [
|
|||
|
|
('历史记录列表', 'historyList' in content),
|
|||
|
|
('搜索功能', 'historySearchInput' in content),
|
|||
|
|
('筛选功能', 'typeFilter' in content),
|
|||
|
|
('统计卡片', 'stats-card' in content),
|
|||
|
|
('分页功能', 'pagination' in content),
|
|||
|
|
('操作按钮', 'btn-copy' in content),
|
|||
|
|
('收藏功能', 'btn-favorite' in content),
|
|||
|
|
('评分功能', 'rating' in content)
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
print("📋 前端元素检查:")
|
|||
|
|
for name, exists in checks:
|
|||
|
|
if exists:
|
|||
|
|
print(f" ✅ {name}")
|
|||
|
|
else:
|
|||
|
|
print(f" ❌ {name}")
|
|||
|
|
|
|||
|
|
return all(exists for _, exists in checks)
|
|||
|
|
|
|||
|
|
except FileNotFoundError:
|
|||
|
|
print("❌ 优化历史页面模板文件不存在")
|
|||
|
|
return False
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"❌ 前端集成测试失败: {str(e)}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
def main():
|
|||
|
|
"""主测试函数"""
|
|||
|
|
print("🚀 优化历史功能测试开始")
|
|||
|
|
print("=" * 60)
|
|||
|
|
|
|||
|
|
tests = [
|
|||
|
|
("数据库连接", test_database_connection),
|
|||
|
|
("前端集成", test_frontend_integration),
|
|||
|
|
("页面访问", test_optimization_history_page),
|
|||
|
|
("API接口", test_optimization_history_api)
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
results = []
|
|||
|
|
|
|||
|
|
for test_name, test_func in tests:
|
|||
|
|
print(f"\n🧪 开始测试: {test_name}")
|
|||
|
|
try:
|
|||
|
|
result = test_func()
|
|||
|
|
results.append((test_name, result))
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"❌ 测试 {test_name} 异常: {str(e)}")
|
|||
|
|
results.append((test_name, False))
|
|||
|
|
|
|||
|
|
# 输出测试结果
|
|||
|
|
print("\n" + "=" * 60)
|
|||
|
|
print("📊 测试结果汇总")
|
|||
|
|
print("=" * 60)
|
|||
|
|
|
|||
|
|
passed = 0
|
|||
|
|
total = len(results)
|
|||
|
|
|
|||
|
|
for test_name, result in results:
|
|||
|
|
status = "✅ 通过" if result else "❌ 失败"
|
|||
|
|
print(f"{test_name}: {status}")
|
|||
|
|
if result:
|
|||
|
|
passed += 1
|
|||
|
|
|
|||
|
|
print(f"\n📈 总体结果: {passed}/{total} 测试通过")
|
|||
|
|
|
|||
|
|
if passed == total:
|
|||
|
|
print("🎉 所有测试通过!优化历史功能已就绪!")
|
|||
|
|
else:
|
|||
|
|
print("⚠️ 部分测试失败,请检查相关功能")
|
|||
|
|
|
|||
|
|
return passed == total
|
|||
|
|
|
|||
|
|
if __name__ == '__main__':
|
|||
|
|
success = main()
|
|||
|
|
exit(0 if success else 1)
|