feat: 初始化考培练系统项目
- 从服务器拉取完整代码 - 按框架规范整理项目结构 - 配置 Drone CI 测试环境部署 - 包含后端(FastAPI)、前端(Vue3)、管理端 技术栈: Vue3 + TypeScript + FastAPI + MySQL
This commit is contained in:
164
tests/test_score_report_api.py
Normal file
164
tests/test_score_report_api.py
Normal file
@@ -0,0 +1,164 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
测试成绩报告和错题本API
|
||||
"""
|
||||
import requests
|
||||
import json
|
||||
|
||||
BASE_URL = "http://localhost:8000"
|
||||
|
||||
# 测试账号token(需要先登录获取)
|
||||
# 这里假设已经有token,实际使用时需要先登录
|
||||
TOKEN = ""
|
||||
|
||||
def login():
|
||||
"""登录获取token"""
|
||||
response = requests.post(
|
||||
f"{BASE_URL}/api/v1/auth/login",
|
||||
json={
|
||||
"username": "testuser",
|
||||
"password": "TestPass123!"
|
||||
}
|
||||
)
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
if data.get('code') == 200:
|
||||
return data['data']['access_token']
|
||||
return None
|
||||
|
||||
def test_exam_report(token):
|
||||
"""测试成绩报告API"""
|
||||
print("\n=== 测试成绩报告API ===")
|
||||
|
||||
headers = {"Authorization": f"Bearer {token}"}
|
||||
|
||||
response = requests.get(
|
||||
f"{BASE_URL}/api/v1/exams/statistics/report",
|
||||
headers=headers
|
||||
)
|
||||
|
||||
print(f"状态码: {response.status_code}")
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
print(f"响应code: {data.get('code')}")
|
||||
print(f"响应message: {data.get('message')}")
|
||||
|
||||
if data.get('code') == 200:
|
||||
report = data.get('data', {})
|
||||
print(f"\n概览数据:")
|
||||
print(f" - 平均成绩: {report.get('overview', {}).get('avg_score')}")
|
||||
print(f" - 考试总数: {report.get('overview', {}).get('total_exams')}")
|
||||
print(f" - 及格率: {report.get('overview', {}).get('pass_rate')}")
|
||||
|
||||
print(f"\n科目数量: {len(report.get('subjects', []))}")
|
||||
print(f"最近考试数量: {len(report.get('recent_exams', []))}")
|
||||
|
||||
# 显示第一条最近考试记录
|
||||
if report.get('recent_exams'):
|
||||
exam = report['recent_exams'][0]
|
||||
print(f"\n第一条考试记录:")
|
||||
print(f" - ID: {exam.get('id')}")
|
||||
print(f" - 课程: {exam.get('course_name')}")
|
||||
print(f" - 三轮得分: {exam.get('round_scores')}")
|
||||
else:
|
||||
print(f"业务错误: {data.get('message')}")
|
||||
else:
|
||||
print(f"HTTP错误: {response.text}")
|
||||
|
||||
def test_mistakes_statistics(token):
|
||||
"""测试错题统计API"""
|
||||
print("\n=== 测试错题统计API ===")
|
||||
|
||||
headers = {"Authorization": f"Bearer {token}"}
|
||||
|
||||
response = requests.get(
|
||||
f"{BASE_URL}/api/v1/exams/mistakes/statistics",
|
||||
headers=headers
|
||||
)
|
||||
|
||||
print(f"状态码: {response.status_code}")
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
print(f"响应code: {data.get('code')}")
|
||||
|
||||
if data.get('code') == 200:
|
||||
stats = data.get('data', {})
|
||||
print(f"\n错题总数: {stats.get('total')}")
|
||||
print(f"按课程统计: {len(stats.get('by_course', []))} 个课程")
|
||||
print(f"按题型统计: {len(stats.get('by_type', []))} 种题型")
|
||||
print(f"时间统计:")
|
||||
print(f" - 最近一周: {stats.get('by_time', {}).get('week')}")
|
||||
print(f" - 最近一月: {stats.get('by_time', {}).get('month')}")
|
||||
print(f" - 最近三月: {stats.get('by_time', {}).get('quarter')}")
|
||||
|
||||
# 显示按课程统计
|
||||
if stats.get('by_course'):
|
||||
print(f"\n按课程统计详情:")
|
||||
for course in stats['by_course'][:3]:
|
||||
print(f" - {course.get('course_name')}: {course.get('count')}道")
|
||||
else:
|
||||
print(f"业务错误: {data.get('message')}")
|
||||
else:
|
||||
print(f"HTTP错误: {response.text}")
|
||||
|
||||
def test_mistakes_list(token):
|
||||
"""测试错题列表API"""
|
||||
print("\n=== 测试错题列表API ===")
|
||||
|
||||
headers = {"Authorization": f"Bearer {token}"}
|
||||
|
||||
# 测试1:查询所有错题(第1页)
|
||||
response = requests.get(
|
||||
f"{BASE_URL}/api/v1/exams/mistakes/list",
|
||||
headers=headers,
|
||||
params={"page": 1, "size": 5}
|
||||
)
|
||||
|
||||
print(f"状态码: {response.status_code}")
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
print(f"响应code: {data.get('code')}")
|
||||
|
||||
if data.get('code') == 200:
|
||||
result = data.get('data', {})
|
||||
print(f"\n总数: {result.get('total')}")
|
||||
print(f"当前页: {result.get('page')}")
|
||||
print(f"每页数量: {result.get('size')}")
|
||||
print(f"总页数: {result.get('pages')}")
|
||||
print(f"本页错题数: {len(result.get('items', []))}")
|
||||
|
||||
# 显示前2条错题
|
||||
if result.get('items'):
|
||||
print(f"\n前2条错题:")
|
||||
for item in result['items'][:2]:
|
||||
print(f" - ID: {item.get('id')}")
|
||||
print(f" 课程: {item.get('course_name')}")
|
||||
print(f" 题型: {item.get('question_type')}")
|
||||
print(f" 题目: {item.get('question_content')[:50]}...")
|
||||
else:
|
||||
print(f"业务错误: {data.get('message')}")
|
||||
else:
|
||||
print(f"HTTP错误: {response.text}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("开始测试成绩报告和错题本API...")
|
||||
|
||||
# 1. 登录获取token
|
||||
print("\n1. 登录获取token...")
|
||||
token = login()
|
||||
if not token:
|
||||
print("❌ 登录失败")
|
||||
exit(1)
|
||||
print(f"✅ 登录成功,token: {token[:20]}...")
|
||||
|
||||
# 2. 测试成绩报告API
|
||||
test_exam_report(token)
|
||||
|
||||
# 3. 测试错题统计API
|
||||
test_mistakes_statistics(token)
|
||||
|
||||
# 4. 测试错题列表API
|
||||
test_mistakes_list(token)
|
||||
|
||||
print("\n\n测试完成!")
|
||||
|
||||
Reference in New Issue
Block a user