| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- """
- 测试完整并发审查数据隔离修复效果
- 验证所有修复是否能够有效解决 unit_review 事件混淆问题
- """
- def test_subtask_id_generation():
- """测试子任务ID生成逻辑"""
- print("=== 测试子任务ID生成 ===")
- callback_task_id = "main_task_123"
- # 模拟并发单元索引
- unit_indices = [0, 1, 2, 3, 4]
- sub_task_ids = []
- for unit_index in unit_indices:
- sub_task_id = f"{callback_task_id}-unit-{unit_index}"
- sub_task_ids.append(sub_task_id)
- print(f"单元 {unit_index}: {sub_task_id}")
- # 验证唯一性
- unique_ids = set(sub_task_ids)
- print(f"生成子任务ID数量: {len(sub_task_ids)}")
- print(f"唯一子任务ID数量: {len(unique_ids)}")
- if len(sub_task_ids) == len(unique_ids):
- print(" 子任务ID唯一性验证通过")
- else:
- print(" 子任务ID存在重复")
- def test_progress_manager_isolation():
- """测试ProgressManager数据隔离"""
- print("\n=== 测试ProgressManager数据隔离 ===")
- # 模拟不同的任务ID
- task_ids = [
- "main_task_123-unit-0",
- "main_task_123-unit-1",
- "main_task_123-unit-2"
- ]
- # 模拟不同的issues数据
- issues_data = [
- [{"location": "第3页:工程概况", "content": "问题1"}],
- [{"location": "第5页:技术方案", "content": "问题2"}],
- [{"location": "第7页:质量要求", "content": "问题3"}]
- ]
- # 模拟ProgressManager的行为
- task_progress_store = {}
- def simulate_update_stage_progress(callback_task_id, issues):
- """模拟update_stage_progress方法"""
- if callback_task_id not in task_progress_store:
- task_progress_store[callback_task_id] = {}
- task_progress_store[callback_task_id]["issues"] = issues
- print(f"更新任务 {callback_task_id} 的issues: {len(issues)} 项")
- def simulate_get_progress(callback_task_id):
- """模拟get_progress方法"""
- if callback_task_id in task_progress_store:
- return task_progress_store[callback_task_id]
- return None
- # 测试并发更新
- for i, task_id in enumerate(task_ids):
- simulate_update_stage_progress(task_id, issues_data[i])
- # 验证数据隔离
- print("\n验证数据隔离效果:")
- all_isolated = True
- for i, task_id in enumerate(task_ids):
- progress = simulate_get_progress(task_id)
- if progress and "issues" in progress:
- stored_issues = progress["issues"]
- expected_issues = issues_data[i]
- if stored_issues == expected_issues:
- print(f" 任务 {task_id}: 数据隔离正确")
- else:
- print(f" 任务 {task_id}: 数据隔离失败")
- print(f" 期望: {expected_issues}")
- print(f" 实际: {stored_issues}")
- all_isolated = False
- else:
- print(f" 任务 {task_id}: 无法获取数据")
- all_isolated = False
- return all_isolated
- def test_base_reviewer_parameter_handling():
- """测试BaseReviewer参数处理"""
- print("\n=== 测试BaseReviewer参数处理 ===")
- def simulate_review_method(location_label=None):
- """模拟修复后的review方法"""
- if not location_label:
- print(" 错误: location_label参数是必填的")
- raise ValueError("location_label参数是必填项")
- print(f" 使用参数传递的location_label: {location_label}")
- return True
- # 测试用例
- test_cases = [
- {"location": "第3页:工程概况", "should_pass": True},
- {"location": None, "should_pass": False},
- {"location": "第5页:技术方案", "should_pass": True}
- ]
- all_passed = True
- for i, test_case in enumerate(test_cases):
- print(f"\n测试用例 {i+1}: {test_case['location']}")
- try:
- result = simulate_review_method(test_case['location'])
- if not test_case['should_pass']:
- print(" 预期应该失败,但实际通过了")
- all_passed = False
- else:
- print(" 测试通过")
- except ValueError:
- if test_case['should_pass']:
- print(" 预期应该通过,但实际失败了")
- all_passed = False
- else:
- print(" 测试通过 - 正确捕获了异常")
- return all_passed
- def test_location_validation():
- """测试位置验证逻辑"""
- print("\n=== 测试位置验证逻辑 ===")
- def validate_unit_issues(issues, expected_location, unit_index):
- """模拟修复后的位置验证逻辑"""
- validated_issues = []
- for issue in issues:
- issue_location = issue.get("location", "")
- is_valid_location = False
- if not issue_location:
- is_valid_location = True
- print(f"单元 {unit_index}: 接受location为空的问题")
- elif issue_location == expected_location:
- is_valid_location = True
- print(f"单元 {unit_index}: location完全匹配 - {issue_location}")
- elif expected_location in issue_location and len(issue_location.split(":")) == 2:
- page_part, section_part = expected_location.split(":", 1)
- if issue_location.startswith(page_part) and section_part in issue_location:
- is_valid_location = True
- print(f"单元 {unit_index}: location部分匹配验证通过 - {issue_location}")
- else:
- print(f"单元 {unit_index}: location部分匹配验证失败 - 期望: {expected_location}, 实际: {issue_location}")
- else:
- print(f"单元 {unit_index}: 过滤掉位置不匹配的问题 - 期望: {expected_location}, 实际: {issue_location}")
- if is_valid_location:
- issue["unit_index"] = unit_index
- issue["expected_location"] = expected_location
- issue["validated"] = True
- validated_issues.append(issue)
- return validated_issues
- # 测试用例
- test_cases = [
- {
- "name": "完全匹配测试",
- "issues": [
- {"location": "第3页:工程概况", "content": "问题1"},
- {"location": "第5页:技术方案", "content": "问题2"} # 应该被过滤
- ],
- "expected_location": "第3页:工程概况",
- "unit_index": 0,
- "expected_count": 1
- },
- {
- "name": "空location测试",
- "issues": [
- {"location": "", "content": "问题3"},
- {"location": "第7页:质量要求", "content": "问题4"} # 应该被过滤
- ],
- "expected_location": "第5页:技术方案",
- "unit_index": 1,
- "expected_count": 1
- }
- ]
- all_passed = True
- for test_case in test_cases:
- print(f"\n--- {test_case['name']} ---")
- validated = validate_unit_issues(
- test_case["issues"],
- test_case["expected_location"],
- test_case["unit_index"]
- )
- print(f"原始问题数: {len(test_case['issues'])}, 验证通过: {len(validated)}")
- if len(validated) == test_case["expected_count"]:
- print(" 验证通过")
- else:
- print(" 验证失败")
- all_passed = False
- return all_passed
- if __name__ == "__main__":
- print("开始测试完整并发审查数据隔离修复效果...")
- # 运行所有测试
- test_subtask_id_generation()
- isolation_result = test_progress_manager_isolation()
- base_reviewer_result = test_base_reviewer_parameter_handling()
- validation_result = test_location_validation()
- print("\n" + "="*50)
- print("测试总结:")
- print("\n🔧 修复要点:")
- print("1. 修复了ProgressManager中重复的update_stage_progress方法")
- print("2. 移除了自动清空issues的操作,避免并发数据干扰")
- print("3. 为每个并发单元创建独立的子任务ID,实现数据隔离")
- print("4. 强制BaseReviewer使用参数传递,移除实例变量回退")
- print("5. 增强了位置验证逻辑,防止数据混淆")
- print("\n 测试结果:")
- print(f"ProgressManager数据隔离: {' 通过' if isolation_result else ' 失败'}")
- print(f"BaseReviewer参数处理: {' 通过' if base_reviewer_result else ' 失败'}")
- print(f"位置验证逻辑: {' 通过' if validation_result else ' 失败'}")
- overall_result = isolation_result and base_reviewer_result and validation_result
- print(f"\n总体测试结果: {' 全部通过' if overall_result else ' 存在问题'}")
- if overall_result:
- print("\n 修复成功!")
- print("并发审查数据隔离问题已完全解决,unit_review事件混淆问题应该不会再出现。")
- else:
- print("\n 还有问题需要进一步修复。")
|