Files
012-kaopeilian/backend/test_team_dashboard.py
111 998211c483 feat: 初始化考培练系统项目
- 从服务器拉取完整代码
- 按框架规范整理项目结构
- 配置 Drone CI 测试环境部署
- 包含后端(FastAPI)、前端(Vue3)、管理端

技术栈: Vue3 + TypeScript + FastAPI + MySQL
2026-01-24 19:33:28 +08:00

187 lines
6.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
团队看板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())