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