- 从服务器拉取完整代码 - 按框架规范整理项目结构 - 配置 Drone CI 测试环境部署 - 包含后端(FastAPI)、前端(Vue3)、管理端 技术栈: Vue3 + TypeScript + FastAPI + MySQL
200 lines
6.4 KiB
Python
200 lines
6.4 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
测试考试API接口
|
||
"""
|
||
import requests
|
||
import json
|
||
import time
|
||
|
||
# API配置
|
||
BASE_URL = "http://localhost:8000/api/v1"
|
||
# 使用有效的token(需要先登录获取)
|
||
TOKEN = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOjEsImV4cCI6MTc0MTQxOTQ5Mn0.0ZoiGJaIpV0WvVdH-M2tq03RMfRd9OKUJvDIgJtJoXk"
|
||
|
||
headers = {
|
||
"Authorization": f"Bearer {TOKEN}",
|
||
"Content-Type": "application/json"
|
||
}
|
||
|
||
def test_generate_exam():
|
||
"""测试生成考试试题"""
|
||
print("\n" + "="*50)
|
||
print("测试1: 生成考试试题")
|
||
print("="*50)
|
||
|
||
url = f"{BASE_URL}/exams/generate"
|
||
data = {
|
||
"course_id": 1,
|
||
"single_choice_count": 2,
|
||
"multiple_choice_count": 1,
|
||
"true_false_count": 1,
|
||
"fill_blank_count": 1,
|
||
"essay_count": 0,
|
||
"difficulty_level": 3,
|
||
"mistake_records": "[]"
|
||
}
|
||
|
||
print(f"请求URL: {url}")
|
||
print(f"请求数据: {json.dumps(data, indent=2, ensure_ascii=False)}")
|
||
print("\n正在调用Dify工作流生成试题,请稍候...")
|
||
|
||
try:
|
||
response = requests.post(url, json=data, headers=headers, timeout=300)
|
||
print(f"\n响应状态码: {response.status_code}")
|
||
|
||
if response.status_code == 200:
|
||
result = response.json()
|
||
print(f"响应数据: {json.dumps(result, indent=2, ensure_ascii=False)[:500]}...")
|
||
|
||
# 解析result字段中的试题
|
||
if "data" in result and "result" in result["data"]:
|
||
questions_str = result["data"]["result"]
|
||
questions = json.loads(questions_str)
|
||
print(f"\n✅ 成功生成 {len(questions)} 道试题")
|
||
print(f"第一题预览: {json.dumps(questions[0], indent=2, ensure_ascii=False)[:300]}...")
|
||
return questions
|
||
else:
|
||
print("❌ 响应格式不正确")
|
||
else:
|
||
print(f"❌ 请求失败: {response.text}")
|
||
except requests.exceptions.Timeout:
|
||
print("❌ 请求超时(可能Dify工作流执行时间较长)")
|
||
except Exception as e:
|
||
print(f"❌ 请求异常: {str(e)}")
|
||
|
||
return None
|
||
|
||
def test_judge_answer():
|
||
"""测试判断主观题答案"""
|
||
print("\n" + "="*50)
|
||
print("测试2: 判断主观题答案")
|
||
print("="*50)
|
||
|
||
url = f"{BASE_URL}/exams/judge-answer"
|
||
data = {
|
||
"question": "肉毒素注射后____小时内不能平躺",
|
||
"correct_answer": "4",
|
||
"user_answer": "4"
|
||
}
|
||
|
||
print(f"请求URL: {url}")
|
||
print(f"请求数据: {json.dumps(data, indent=2, ensure_ascii=False)}")
|
||
print("\n正在调用Dify答案判断工作流...")
|
||
|
||
try:
|
||
response = requests.post(url, json=data, headers=headers, timeout=60)
|
||
print(f"\n响应状态码: {response.status_code}")
|
||
|
||
if response.status_code == 200:
|
||
result = response.json()
|
||
print(f"响应数据: {json.dumps(result, indent=2, ensure_ascii=False)}")
|
||
|
||
if "data" in result:
|
||
is_correct = result["data"].get("is_correct")
|
||
print(f"\n✅ 判断结果: {'正确' if is_correct else '错误'}")
|
||
return result
|
||
else:
|
||
print(f"❌ 请求失败: {response.text}")
|
||
except Exception as e:
|
||
print(f"❌ 请求异常: {str(e)}")
|
||
|
||
return None
|
||
|
||
def test_record_mistake():
|
||
"""测试记录错题"""
|
||
print("\n" + "="*50)
|
||
print("测试3: 记录错题")
|
||
print("="*50)
|
||
|
||
url = f"{BASE_URL}/exams/record-mistake"
|
||
data = {
|
||
"exam_id": 1,
|
||
"question_id": None,
|
||
"knowledge_point_id": 199,
|
||
"question_content": "以下哪一项最能准确描述艾维岚(Avilan)在医美注射材料中的独特作用机制?",
|
||
"correct_answer": "B:它是唯一可以做减法的注射材料,实现收紧而不增容。",
|
||
"user_answer": "A:它是一款主要用于增容塑形的支撑型材料。"
|
||
}
|
||
|
||
print(f"请求URL: {url}")
|
||
print(f"请求数据: {json.dumps(data, indent=2, ensure_ascii=False)}")
|
||
|
||
try:
|
||
response = requests.post(url, json=data, headers=headers, timeout=30)
|
||
print(f"\n响应状态码: {response.status_code}")
|
||
|
||
if response.status_code == 200:
|
||
result = response.json()
|
||
print(f"响应数据: {json.dumps(result, indent=2, ensure_ascii=False)}")
|
||
|
||
if "data" in result:
|
||
print(f"\n✅ 成功记录错题,ID: {result['data'].get('id')}")
|
||
return result
|
||
else:
|
||
print(f"❌ 请求失败: {response.text}")
|
||
except Exception as e:
|
||
print(f"❌ 请求异常: {str(e)}")
|
||
|
||
return None
|
||
|
||
def test_get_mistakes():
|
||
"""测试获取错题记录"""
|
||
print("\n" + "="*50)
|
||
print("测试4: 获取错题记录")
|
||
print("="*50)
|
||
|
||
exam_id = 1
|
||
url = f"{BASE_URL}/exams/mistakes?exam_id={exam_id}"
|
||
|
||
print(f"请求URL: {url}")
|
||
|
||
try:
|
||
response = requests.get(url, headers=headers, timeout=30)
|
||
print(f"\n响应状态码: {response.status_code}")
|
||
|
||
if response.status_code == 200:
|
||
result = response.json()
|
||
print(f"响应数据: {json.dumps(result, indent=2, ensure_ascii=False)[:500]}...")
|
||
|
||
if "data" in result and "mistakes" in result["data"]:
|
||
mistakes = result["data"]["mistakes"]
|
||
print(f"\n✅ 成功获取 {len(mistakes)} 条错题记录")
|
||
return result
|
||
else:
|
||
print(f"❌ 请求失败: {response.text}")
|
||
except Exception as e:
|
||
print(f"❌ 请求异常: {str(e)}")
|
||
|
||
return None
|
||
|
||
def main():
|
||
"""主测试流程"""
|
||
print("\n" + "="*60)
|
||
print("开始测试考试API接口")
|
||
print("="*60)
|
||
|
||
# 测试1: 生成考试试题(调用Dify工作流)
|
||
# 注意:这个测试可能需要较长时间,因为要调用Dify工作流
|
||
# questions = test_generate_exam()
|
||
|
||
# 测试2: 判断答案(调用Dify工作流)
|
||
test_judge_answer()
|
||
|
||
# 测试3: 记录错题
|
||
test_record_mistake()
|
||
|
||
# 测试4: 获取错题记录
|
||
test_get_mistakes()
|
||
|
||
print("\n" + "="*60)
|
||
print("测试完成")
|
||
print("="*60)
|
||
print("\n注意: 试题生成测试已注释,因为需要较长时间调用Dify工作流")
|
||
print("如需测试,请取消注释 test_generate_exam() 行")
|
||
|
||
if __name__ == "__main__":
|
||
main()
|
||
|
||
|
||
|