- 从服务器拉取完整代码 - 按框架规范整理项目结构 - 配置 Drone CI 测试环境部署 - 包含后端(FastAPI)、前端(Vue3)、管理端 技术栈: Vue3 + TypeScript + FastAPI + MySQL
187 lines
6.3 KiB
Python
187 lines
6.3 KiB
Python
"""
|
||
团队看板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())
|
||
|