AI_Homework_Correcttion/source/test_script.py

160 lines
4.3 KiB
Python
Raw 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.

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()