160 lines
4.3 KiB
Python
160 lines
4.3 KiB
Python
import os
|
||
import random
|
||
import openpyxl
|
||
from unittest.mock import patch
|
||
from grade_assignments import (
|
||
read_excel_submissions,
|
||
find_assignment_yml,
|
||
parse_yml_file,
|
||
call_dify_api,
|
||
save_result,
|
||
parse_api_response,
|
||
main
|
||
)
|
||
|
||
TEST_OUTPUT_DIR = "results/test"
|
||
TEST_OUTPUT_FILE = os.path.join(TEST_OUTPUT_DIR, "测试结果.xlsx")
|
||
|
||
def test_parse_api_response():
|
||
"""测试解析API响应"""
|
||
# 测试正常响应
|
||
response = {
|
||
'data': {
|
||
'outputs': {
|
||
'text': '### 总分\n**总分:85分**\n### 优点\n- 工作流描述详细\n### 不足之处\n- 缺少细节\n### 改进建议\n- 补充细节'
|
||
}
|
||
}
|
||
}
|
||
|
||
score, details = parse_api_response(response)
|
||
assert score == 85
|
||
assert isinstance(details, dict)
|
||
|
||
# 测试无评分结果
|
||
response = {'data': {'outputs': {'text': ''}}}
|
||
score, details = parse_api_response(response)
|
||
assert score is None
|
||
assert details == "无评分结果"
|
||
|
||
def test_save_result():
|
||
"""测试实时保存功能"""
|
||
# 准备测试数据
|
||
test_result = {
|
||
'name': '测试学生',
|
||
'score': 90,
|
||
'details': '测试详情'
|
||
}
|
||
|
||
# 测试首次保存
|
||
wb = save_result(test_result)
|
||
assert wb is not None
|
||
|
||
# 测试追加保存
|
||
test_result2 = {
|
||
'name': '测试学生2',
|
||
'score': 80,
|
||
'details': '测试详情2'
|
||
}
|
||
wb = save_result(test_result2, wb)
|
||
assert wb is not None
|
||
|
||
# 验证文件存在
|
||
assert os.path.exists(TEST_OUTPUT_FILE)
|
||
|
||
def test_main():
|
||
"""测试主函数"""
|
||
# 模拟submissions数据
|
||
test_submissions = [
|
||
{'name': '张三', 'work_description': '测试描述1', 'solution': '测试方案1'},
|
||
{'name': '李四', 'work_description': '测试描述2', 'solution': '测试方案2'}
|
||
]
|
||
|
||
# 模拟API响应
|
||
test_response = {
|
||
'data': {
|
||
'outputs': {
|
||
'text': '### 总分\n**总分:85分**\n### 优点\n- 工作流描述详细\n### 不足之处\n- 缺少细节\n### 改进建议\n- 补充细节'
|
||
}
|
||
}
|
||
}
|
||
|
||
# 测试正常流程
|
||
with patch('grade_assignments.read_excel_submissions', return_value=test_submissions), \
|
||
patch('grade_assignments.call_dify_api', return_value=test_response), \
|
||
patch('grade_assignments.save_result') as mock_save:
|
||
|
||
main()
|
||
|
||
# 验证保存结果被调用两次
|
||
assert mock_save.call_count == 2
|
||
|
||
def run_test():
|
||
"""运行集成测试"""
|
||
# 确保测试输出目录存在
|
||
os.makedirs(TEST_OUTPUT_DIR, exist_ok=True)
|
||
|
||
# 读取所有提交记录
|
||
submissions = read_excel_submissions()
|
||
if not submissions:
|
||
print("没有找到任何提交记录")
|
||
return
|
||
|
||
# 随机选择一条记录
|
||
test_sub = random.choice(submissions)
|
||
print(f"随机选择测试记录: {test_sub['name']}")
|
||
|
||
# 查找对应的YML文件
|
||
yml_path = find_assignment_yml(test_sub['name'])
|
||
if not yml_path:
|
||
print(f"未找到 {test_sub['name']} 的作业文件")
|
||
return
|
||
|
||
# 解析YML文件
|
||
try:
|
||
yml_content = parse_yml_file(yml_path)
|
||
except Exception as e:
|
||
print(f"解析YML文件失败: {e}")
|
||
return
|
||
|
||
# 准备API调用数据
|
||
assignment_data = {
|
||
**test_sub,
|
||
**yml_content
|
||
}
|
||
|
||
# 调用API进行测试
|
||
print("调用API进行测试...")
|
||
api_response = call_dify_api(yml_path, assignment_data)
|
||
if not api_response:
|
||
print("API调用失败")
|
||
return
|
||
|
||
# 解析API响应
|
||
try:
|
||
score, details = parse_api_response(api_response)
|
||
test_result = {
|
||
'name': test_sub['name'],
|
||
'score': score,
|
||
'details': details
|
||
}
|
||
|
||
# 保存测试结果
|
||
save_result(test_result)
|
||
print(f"测试结果已保存到: {TEST_OUTPUT_FILE}")
|
||
|
||
# 打印解析结果
|
||
print("\n解析结果:")
|
||
print(f"评分: {score}")
|
||
print(f"详情: {details}")
|
||
except Exception as e:
|
||
print(f"解析API响应失败: {e}")
|
||
|
||
if __name__ == "__main__":
|
||
# 运行单元测试
|
||
# test_parse_api_response()
|
||
# test_save_result()
|
||
# test_main()
|
||
|
||
# 运行集成测试
|
||
run_test()
|