feat: 初始化考培练系统项目
- 从服务器拉取完整代码 - 按框架规范整理项目结构 - 配置 Drone CI 测试环境部署 - 包含后端(FastAPI)、前端(Vue3)、管理端 技术栈: Vue3 + TypeScript + FastAPI + MySQL
This commit is contained in:
186
backend/test_team_dashboard.py
Normal file
186
backend/test_team_dashboard.py
Normal file
@@ -0,0 +1,186 @@
|
||||
"""
|
||||
团队看板API测试脚本
|
||||
|
||||
用于验证团队看板所有接口的功能
|
||||
"""
|
||||
|
||||
import asyncio
|
||||
import httpx
|
||||
|
||||
# 配置
|
||||
BASE_URL = "http://localhost:8000"
|
||||
# 需要先登录获取token
|
||||
TOKEN = "your_token_here" # 替换为实际的token
|
||||
|
||||
headers = {
|
||||
"Authorization": f"Bearer {TOKEN}",
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
|
||||
|
||||
async def test_overview():
|
||||
"""测试团队概览接口"""
|
||||
print("\n=== 测试团队概览接口 ===")
|
||||
async with httpx.AsyncClient() as client:
|
||||
response = await client.get(
|
||||
f"{BASE_URL}/api/v1/team/dashboard/overview",
|
||||
headers=headers
|
||||
)
|
||||
print(f"状态码: {response.status_code}")
|
||||
data = response.json()
|
||||
print(f"响应数据: {data}")
|
||||
|
||||
if data.get("code") == 200:
|
||||
result = data.get("data", {})
|
||||
print(f"✅ 团队成员数: {result.get('member_count')}")
|
||||
print(f"✅ 平均学习进度: {result.get('avg_progress')}%")
|
||||
print(f"✅ 平均考试成绩: {result.get('avg_score')}")
|
||||
print(f"✅ 课程完成率: {result.get('course_completion_rate')}%")
|
||||
else:
|
||||
print(f"❌ 失败: {data.get('message')}")
|
||||
|
||||
|
||||
async def test_progress():
|
||||
"""测试学习进度接口"""
|
||||
print("\n=== 测试学习进度接口 ===")
|
||||
async with httpx.AsyncClient() as client:
|
||||
response = await client.get(
|
||||
f"{BASE_URL}/api/v1/team/dashboard/progress",
|
||||
headers=headers
|
||||
)
|
||||
print(f"状态码: {response.status_code}")
|
||||
data = response.json()
|
||||
|
||||
if data.get("code") == 200:
|
||||
result = data.get("data", {})
|
||||
print(f"✅ 成员列表: {result.get('members')}")
|
||||
print(f"✅ 周数: {len(result.get('weeks', []))}")
|
||||
print(f"✅ 数据条数: {len(result.get('data', []))}")
|
||||
else:
|
||||
print(f"❌ 失败: {data.get('message')}")
|
||||
|
||||
|
||||
async def test_course_distribution():
|
||||
"""测试课程分布接口"""
|
||||
print("\n=== 测试课程分布接口 ===")
|
||||
async with httpx.AsyncClient() as client:
|
||||
response = await client.get(
|
||||
f"{BASE_URL}/api/v1/team/dashboard/course-distribution",
|
||||
headers=headers
|
||||
)
|
||||
print(f"状态码: {response.status_code}")
|
||||
data = response.json()
|
||||
|
||||
if data.get("code") == 200:
|
||||
result = data.get("data", {})
|
||||
print(f"✅ 已完成: {result.get('completed')}")
|
||||
print(f"✅ 进行中: {result.get('in_progress')}")
|
||||
print(f"✅ 未开始: {result.get('not_started')}")
|
||||
else:
|
||||
print(f"❌ 失败: {data.get('message')}")
|
||||
|
||||
|
||||
async def test_ability_analysis():
|
||||
"""测试能力分析接口"""
|
||||
print("\n=== 测试能力分析接口 ===")
|
||||
async with httpx.AsyncClient() as client:
|
||||
response = await client.get(
|
||||
f"{BASE_URL}/api/v1/team/dashboard/ability-analysis",
|
||||
headers=headers
|
||||
)
|
||||
print(f"状态码: {response.status_code}")
|
||||
data = response.json()
|
||||
|
||||
if data.get("code") == 200:
|
||||
result = data.get("data", {})
|
||||
radar = result.get('radar_data', {})
|
||||
print(f"✅ 能力维度: {radar.get('dimensions')}")
|
||||
print(f"✅ 能力分数: {radar.get('values')}")
|
||||
print(f"✅ 短板数量: {len(result.get('weaknesses', []))}")
|
||||
else:
|
||||
print(f"❌ 失败: {data.get('message')}")
|
||||
|
||||
|
||||
async def test_rankings():
|
||||
"""测试排行榜接口"""
|
||||
print("\n=== 测试排行榜接口 ===")
|
||||
async with httpx.AsyncClient() as client:
|
||||
response = await client.get(
|
||||
f"{BASE_URL}/api/v1/team/dashboard/rankings",
|
||||
headers=headers
|
||||
)
|
||||
print(f"状态码: {response.status_code}")
|
||||
data = response.json()
|
||||
|
||||
if data.get("code") == 200:
|
||||
result = data.get("data", {})
|
||||
study_ranking = result.get('study_time_ranking', [])
|
||||
score_ranking = result.get('score_ranking', [])
|
||||
print(f"✅ 学习时长排行: {len(study_ranking)} 人")
|
||||
if study_ranking:
|
||||
print(f" 第一名: {study_ranking[0].get('name')} - {study_ranking[0].get('study_time')}小时")
|
||||
print(f"✅ 成绩排行: {len(score_ranking)} 人")
|
||||
if score_ranking:
|
||||
print(f" 第一名: {score_ranking[0].get('name')} - {score_ranking[0].get('avg_score')}分")
|
||||
else:
|
||||
print(f"❌ 失败: {data.get('message')}")
|
||||
|
||||
|
||||
async def test_activities():
|
||||
"""测试团队动态接口"""
|
||||
print("\n=== 测试团队动态接口 ===")
|
||||
async with httpx.AsyncClient() as client:
|
||||
response = await client.get(
|
||||
f"{BASE_URL}/api/v1/team/dashboard/activities",
|
||||
headers=headers
|
||||
)
|
||||
print(f"状态码: {response.status_code}")
|
||||
data = response.json()
|
||||
|
||||
if data.get("code") == 200:
|
||||
result = data.get("data", {})
|
||||
activities = result.get('activities', [])
|
||||
print(f"✅ 活动记录数: {len(activities)}")
|
||||
if activities:
|
||||
print(f" 最新活动: {activities[0].get('user_name')} {activities[0].get('action')} {activities[0].get('target')}")
|
||||
else:
|
||||
print(f"❌ 失败: {data.get('message')}")
|
||||
|
||||
|
||||
async def main():
|
||||
"""运行所有测试"""
|
||||
print("=" * 60)
|
||||
print("团队看板API测试")
|
||||
print("=" * 60)
|
||||
|
||||
# 检查token是否设置
|
||||
if TOKEN == "your_token_here":
|
||||
print("\n⚠️ 请先设置TOKEN变量(在文件顶部)")
|
||||
print(" 可以通过以下步骤获取:")
|
||||
print(" 1. 访问 http://localhost:3001")
|
||||
print(" 2. 登录系统(admin账号)")
|
||||
print(" 3. 打开浏览器开发者工具 -> Application -> Local Storage")
|
||||
print(" 4. 找到 token 或 access_token")
|
||||
return
|
||||
|
||||
try:
|
||||
await test_overview()
|
||||
await test_progress()
|
||||
await test_course_distribution()
|
||||
await test_ability_analysis()
|
||||
await test_rankings()
|
||||
await test_activities()
|
||||
|
||||
print("\n" + "=" * 60)
|
||||
print("✅ 所有测试完成!")
|
||||
print("=" * 60)
|
||||
|
||||
except Exception as e:
|
||||
print(f"\n❌ 测试失败: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(main())
|
||||
|
||||
Reference in New Issue
Block a user