404 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			404 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Python
		
	
	
	
| #!/usr/bin/env python3
 | ||
| # -*- coding: utf-8 -*-
 | ||
| """
 | ||
| 测试优化的辩论流程控制系统
 | ||
| 验证阶段转换和发言权争夺逻辑的改进
 | ||
| """
 | ||
| 
 | ||
| import sys
 | ||
| import os
 | ||
| import time
 | ||
| import threading
 | ||
| from datetime import datetime, timedelta
 | ||
| 
 | ||
| # 添加项目路径
 | ||
| sys.path.append('/home/ben/liurenchaxin/src')
 | ||
| 
 | ||
| from jixia.debates.optimized_debate_flow import (
 | ||
|     OptimizedDebateFlowController,
 | ||
|     FlowControlConfig,
 | ||
|     FlowControlMode,
 | ||
|     TransitionTrigger,
 | ||
|     SpeakerSelectionStrategy,
 | ||
|     DebateStage
 | ||
| )
 | ||
| 
 | ||
| def test_basic_flow_control():
 | ||
|     """测试基础流程控制"""
 | ||
|     print("🧪 测试基础流程控制")
 | ||
|     print("-" * 30)
 | ||
|     
 | ||
|     controller = OptimizedDebateFlowController()
 | ||
|     
 | ||
|     # 测试获取当前发言者
 | ||
|     speaker = controller.get_current_speaker()
 | ||
|     print(f"✅ 当前发言者: {speaker}")
 | ||
|     assert speaker is not None, "应该能获取到发言者"
 | ||
|     
 | ||
|     # 测试记录发言
 | ||
|     controller.record_speech(speaker, "这是一个测试发言")
 | ||
|     print(f"✅ 发言记录成功,当前进度: {controller.stage_progress}")
 | ||
|     
 | ||
|     # 测试流程状态
 | ||
|     status = controller.get_flow_status()
 | ||
|     print(f"✅ 流程状态: {status['current_stage']} 阶段")
 | ||
|     assert status['current_stage'] == '起', "应该在起阶段"
 | ||
|     
 | ||
|     return True
 | ||
| 
 | ||
| def test_stage_transition():
 | ||
|     """测试阶段转换"""
 | ||
|     print("\n🧪 测试阶段转换")
 | ||
|     print("-" * 30)
 | ||
|     
 | ||
|     config = FlowControlConfig(
 | ||
|         mode=FlowControlMode.STRICT,
 | ||
|         transition_triggers=[TransitionTrigger.PROGRESS_BASED]
 | ||
|     )
 | ||
|     controller = OptimizedDebateFlowController(config)
 | ||
|     
 | ||
|     initial_stage = controller.current_stage
 | ||
|     print(f"初始阶段: {initial_stage.value}")
 | ||
|     
 | ||
|     # 模拟完成一个阶段的所有发言
 | ||
|     stage_config = controller.stage_configs[initial_stage]
 | ||
|     max_progress = stage_config["max_progress"]
 | ||
|     
 | ||
|     for i in range(max_progress):
 | ||
|         speaker = controller.get_current_speaker()
 | ||
|         controller.record_speech(speaker, f"第{i+1}次发言")
 | ||
|         
 | ||
|         if i == max_progress - 1:
 | ||
|             # 最后一次发言后应该自动转换阶段
 | ||
|             if controller._should_advance_stage():
 | ||
|                 success = controller.advance_stage()
 | ||
|                 print(f"✅ 阶段转换成功: {success}")
 | ||
|                 print(f"新阶段: {controller.current_stage.value}")
 | ||
|                 assert controller.current_stage != initial_stage, "阶段应该已经改变"
 | ||
|                 break
 | ||
|     
 | ||
|     return True
 | ||
| 
 | ||
| def test_speaker_selection_strategies():
 | ||
|     """测试发言者选择策略"""
 | ||
|     print("\n🧪 测试发言者选择策略")
 | ||
|     print("-" * 30)
 | ||
|     
 | ||
|     strategies = [
 | ||
|         SpeakerSelectionStrategy.ROUND_ROBIN,
 | ||
|         SpeakerSelectionStrategy.CONTEXT_AWARE,
 | ||
|         SpeakerSelectionStrategy.COMPETITIVE
 | ||
|     ]
 | ||
|     
 | ||
|     for strategy in strategies:
 | ||
|         print(f"\n测试策略: {strategy.value}")
 | ||
|         
 | ||
|         config = FlowControlConfig(speaker_selection_strategy=strategy)
 | ||
|         controller = OptimizedDebateFlowController(config)
 | ||
|         
 | ||
|         # 获取几个发言者
 | ||
|         speakers = []
 | ||
|         for i in range(3):
 | ||
|             speaker = controller.get_current_speaker()
 | ||
|             speakers.append(speaker)
 | ||
|             controller.record_speech(speaker, f"策略测试发言 {i+1}")
 | ||
|         
 | ||
|         print(f"发言者序列: {speakers}")
 | ||
|         assert len(set(speakers)) > 0, f"策略 {strategy.value} 应该能选择发言者"
 | ||
|     
 | ||
|     print("✅ 所有发言者选择策略测试通过")
 | ||
|     return True
 | ||
| 
 | ||
| def test_speaker_request_system():
 | ||
|     """测试发言请求系统"""
 | ||
|     print("\n🧪 测试发言请求系统")
 | ||
|     print("-" * 30)
 | ||
|     
 | ||
|     config = FlowControlConfig(
 | ||
|         speaker_selection_strategy=SpeakerSelectionStrategy.COMPETITIVE
 | ||
|     )
 | ||
|     controller = OptimizedDebateFlowController(config)
 | ||
|     
 | ||
|     # 提交发言请求
 | ||
|     controller.request_speaking_turn("正1", "紧急反驳", urgency=5, topic_relevance=0.9)
 | ||
|     controller.request_speaking_turn("反2", "补充论据", urgency=2, topic_relevance=0.7)
 | ||
|     controller.request_speaking_turn("正3", "重要澄清", urgency=4, topic_relevance=0.8)
 | ||
|     
 | ||
|     print(f"待处理请求数量: {len(controller.pending_requests)}")
 | ||
|     assert len(controller.pending_requests) == 3, "应该有3个待处理请求"
 | ||
|     
 | ||
|     # 获取下一个发言者(应该是最高优先级的)
 | ||
|     next_speaker = controller.get_current_speaker()
 | ||
|     print(f"✅ 高优先级发言者: {next_speaker}")
 | ||
|     
 | ||
|     # 记录发言后,请求应该被移除
 | ||
|     controller.record_speech(next_speaker, "响应紧急请求的发言")
 | ||
|     print(f"发言后待处理请求数量: {len(controller.pending_requests)}")
 | ||
|     
 | ||
|     return True
 | ||
| 
 | ||
| def test_context_aware_selection():
 | ||
|     """测试上下文感知选择"""
 | ||
|     print("\n🧪 测试上下文感知选择")
 | ||
|     print("-" * 30)
 | ||
|     
 | ||
|     config = FlowControlConfig(
 | ||
|         speaker_selection_strategy=SpeakerSelectionStrategy.CONTEXT_AWARE
 | ||
|     )
 | ||
|     controller = OptimizedDebateFlowController(config)
 | ||
|     
 | ||
|     # 模拟一些发言历史
 | ||
|     test_speeches = [
 | ||
|         ("正1", "我支持AI投资"),
 | ||
|         ("正1", "理由是技术发展迅速"),  # 连续发言
 | ||
|         ("反1", "但风险很高"),
 | ||
|         ("正2", "我们有风控措施")
 | ||
|     ]
 | ||
|     
 | ||
|     for speaker, message in test_speeches:
 | ||
|         controller.record_speech(speaker, message)
 | ||
|     
 | ||
|     # 分析当前上下文
 | ||
|     context = controller._analyze_current_context()
 | ||
|     print(f"当前上下文: {context}")
 | ||
|     
 | ||
|     # 获取下一个发言者(应该避免连续发言)
 | ||
|     next_speaker = controller.get_current_speaker()
 | ||
|     print(f"✅ 上下文感知选择的发言者: {next_speaker}")
 | ||
|     
 | ||
|     # 验证不是最近的发言者
 | ||
|     recent_speakers = [speech[0] for speech in test_speeches[-2:]]
 | ||
|     print(f"最近发言者: {recent_speakers}")
 | ||
|     
 | ||
|     return True
 | ||
| 
 | ||
| def test_stage_metrics():
 | ||
|     """测试阶段指标"""
 | ||
|     print("\n🧪 测试阶段指标")
 | ||
|     print("-" * 30)
 | ||
|     
 | ||
|     controller = OptimizedDebateFlowController()
 | ||
|     
 | ||
|     # 模拟一些发言
 | ||
|     test_speeches = [
 | ||
|         ("吕洞宾", "AI投资是未来趋势,我们应该积极参与。数据显示这个领域的增长潜力巨大。"),
 | ||
|         ("何仙姑", "但是我们也要考虑风险因素。"),
 | ||
|         ("铁拐李", "我同意吕洞宾的观点,因为技术发展确实很快。"),
 | ||
|         ("汉钟离", "然而市场波动性不容忽视。")
 | ||
|     ]
 | ||
|     
 | ||
|     for speaker, message in test_speeches:
 | ||
|         controller.record_speech(speaker, message)
 | ||
|     
 | ||
|     # 检查阶段指标
 | ||
|     metrics = controller.current_stage_metrics
 | ||
|     print(f"发言数量: {metrics.speech_count}")
 | ||
|     print(f"质量分数: {metrics.quality_score:.3f}")
 | ||
|     print(f"参与平衡: {metrics.participation_balance:.3f}")
 | ||
|     print(f"转换准备度: {metrics.transition_readiness:.3f}")
 | ||
|     print(f"发言者分布: {metrics.speaker_distribution}")
 | ||
|     
 | ||
|     assert metrics.speech_count == 4, "发言数量应该是4"
 | ||
|     assert 0 <= metrics.quality_score <= 1, "质量分数应该在0-1之间"
 | ||
|     assert 0 <= metrics.participation_balance <= 1, "参与平衡应该在0-1之间"
 | ||
|     
 | ||
|     print("✅ 阶段指标计算正确")
 | ||
|     return True
 | ||
| 
 | ||
| def test_adaptive_mode():
 | ||
|     """测试自适应模式"""
 | ||
|     print("\n🧪 测试自适应模式")
 | ||
|     print("-" * 30)
 | ||
|     
 | ||
|     config = FlowControlConfig(
 | ||
|         mode=FlowControlMode.ADAPTIVE,
 | ||
|         transition_triggers=[TransitionTrigger.QUALITY_BASED, TransitionTrigger.PROGRESS_BASED],
 | ||
|         quality_threshold=0.7
 | ||
|     )
 | ||
|     controller = OptimizedDebateFlowController(config)
 | ||
|     
 | ||
|     # 模拟高质量发言
 | ||
|     high_quality_speeches = [
 | ||
|         ("吕洞宾", "根据最新的市场分析数据,AI投资领域在过去三年中显示出了显著的增长趋势。我们需要仔细分析这些数据背后的原因。"),
 | ||
|         ("何仙姑", "虽然数据显示增长,但是我们也必须考虑到技术泡沫的可能性。历史上类似的技术热潮往往伴随着高风险。"),
 | ||
|         ("铁拐李", "我认为关键在于风险管理。如果我们能够建立完善的风控体系,就能够在享受收益的同时控制风险。")
 | ||
|     ]
 | ||
|     
 | ||
|     for speaker, message in high_quality_speeches:
 | ||
|         controller.record_speech(speaker, message)
 | ||
|         
 | ||
|         # 检查是否达到质量阈值
 | ||
|         if controller.current_stage_metrics.quality_score >= config.quality_threshold:
 | ||
|             print(f"✅ 达到质量阈值: {controller.current_stage_metrics.quality_score:.3f}")
 | ||
|             
 | ||
|             # 检查是否应该转换阶段
 | ||
|             should_advance = controller._should_advance_stage()
 | ||
|             print(f"是否应该推进阶段: {should_advance}")
 | ||
|             break
 | ||
|     
 | ||
|     return True
 | ||
| 
 | ||
| def test_event_system():
 | ||
|     """测试事件系统"""
 | ||
|     print("\n🧪 测试事件系统")
 | ||
|     print("-" * 30)
 | ||
|     
 | ||
|     controller = OptimizedDebateFlowController()
 | ||
|     
 | ||
|     # 记录事件
 | ||
|     events_received = []
 | ||
|     
 | ||
|     def event_handler(event):
 | ||
|         events_received.append(event.event_type)
 | ||
|         print(f"📢 收到事件: {event.event_type}")
 | ||
|     
 | ||
|     # 注册事件处理器
 | ||
|     controller.add_event_handler("speech_recorded", event_handler)
 | ||
|     controller.add_event_handler("speaker_request", event_handler)
 | ||
|     
 | ||
|     # 触发事件
 | ||
|     controller.record_speech("测试发言者", "测试消息")
 | ||
|     controller.request_speaking_turn("正1", "测试请求")
 | ||
|     
 | ||
|     # 等待事件处理
 | ||
|     time.sleep(0.1)
 | ||
|     
 | ||
|     print(f"收到的事件: {events_received}")
 | ||
|     assert "speech_recorded" in events_received, "应该收到发言记录事件"
 | ||
|     assert "speaker_request" in events_received, "应该收到发言请求事件"
 | ||
|     
 | ||
|     print("✅ 事件系统工作正常")
 | ||
|     return True
 | ||
| 
 | ||
| def test_data_persistence():
 | ||
|     """测试数据持久化"""
 | ||
|     print("\n🧪 测试数据持久化")
 | ||
|     print("-" * 30)
 | ||
|     
 | ||
|     controller = OptimizedDebateFlowController()
 | ||
|     
 | ||
|     # 模拟一些活动
 | ||
|     controller.record_speech("吕洞宾", "测试发言1")
 | ||
|     controller.record_speech("何仙姑", "测试发言2")
 | ||
|     controller.request_speaking_turn("正1", "测试请求")
 | ||
|     
 | ||
|     # 保存数据
 | ||
|     filename = "test_flow_data.json"
 | ||
|     controller.save_flow_data(filename)
 | ||
|     
 | ||
|     # 检查文件是否存在
 | ||
|     assert os.path.exists(filename), "数据文件应该被创建"
 | ||
|     
 | ||
|     # 读取并验证数据
 | ||
|     import json
 | ||
|     with open(filename, 'r', encoding='utf-8') as f:
 | ||
|         data = json.load(f)
 | ||
|     
 | ||
|     assert "config" in data, "数据应该包含配置信息"
 | ||
|     assert "current_state" in data, "数据应该包含当前状态"
 | ||
|     assert "debate_history" in data, "数据应该包含辩论历史"
 | ||
|     assert len(data["debate_history"]) == 2, "应该有2条发言记录"
 | ||
|     
 | ||
|     print(f"✅ 数据持久化成功,文件大小: {os.path.getsize(filename)} 字节")
 | ||
|     
 | ||
|     # 清理测试文件
 | ||
|     os.remove(filename)
 | ||
|     
 | ||
|     return True
 | ||
| 
 | ||
| def test_performance():
 | ||
|     """测试性能"""
 | ||
|     print("\n🧪 测试性能")
 | ||
|     print("-" * 30)
 | ||
|     
 | ||
|     controller = OptimizedDebateFlowController()
 | ||
|     
 | ||
|     # 测试发言者选择性能
 | ||
|     start_time = time.time()
 | ||
|     for i in range(100):
 | ||
|         speaker = controller.get_current_speaker()
 | ||
|         controller.record_speech(speaker, f"性能测试发言 {i}")
 | ||
|     
 | ||
|     end_time = time.time()
 | ||
|     duration = end_time - start_time
 | ||
|     
 | ||
|     print(f"100次发言处理耗时: {duration:.3f} 秒")
 | ||
|     print(f"平均每次处理时间: {duration/100*1000:.2f} 毫秒")
 | ||
|     print(f"处理速度: {100/duration:.1f} 次/秒")
 | ||
|     
 | ||
|     assert duration < 5.0, "100次处理应该在5秒内完成"
 | ||
|     
 | ||
|     # 测试并发性能
 | ||
|     def concurrent_speech_recording():
 | ||
|         for i in range(10):
 | ||
|             speaker = controller.get_current_speaker()
 | ||
|             controller.record_speech(speaker, f"并发测试发言 {threading.current_thread().name}-{i}")
 | ||
|     
 | ||
|     start_time = time.time()
 | ||
|     threads = []
 | ||
|     for i in range(5):
 | ||
|         thread = threading.Thread(target=concurrent_speech_recording, name=f"Thread-{i}")
 | ||
|         threads.append(thread)
 | ||
|         thread.start()
 | ||
|     
 | ||
|     for thread in threads:
 | ||
|         thread.join()
 | ||
|     
 | ||
|     end_time = time.time()
 | ||
|     concurrent_duration = end_time - start_time
 | ||
|     
 | ||
|     print(f"并发处理耗时: {concurrent_duration:.3f} 秒")
 | ||
|     print(f"总发言数: {len(controller.debate_history)}")
 | ||
|     
 | ||
|     print("✅ 性能测试通过")
 | ||
|     return True
 | ||
| 
 | ||
| def run_comprehensive_test():
 | ||
|     """运行综合测试"""
 | ||
|     print("🎭 优化的辩论流程控制系统 - 综合测试")
 | ||
|     print("=" * 60)
 | ||
|     
 | ||
|     test_functions = [
 | ||
|         ("基础流程控制", test_basic_flow_control),
 | ||
|         ("阶段转换", test_stage_transition),
 | ||
|         ("发言者选择策略", test_speaker_selection_strategies),
 | ||
|         ("发言请求系统", test_speaker_request_system),
 | ||
|         ("上下文感知选择", test_context_aware_selection),
 | ||
|         ("阶段指标", test_stage_metrics),
 | ||
|         ("自适应模式", test_adaptive_mode),
 | ||
|         ("事件系统", test_event_system),
 | ||
|         ("数据持久化", test_data_persistence),
 | ||
|         ("性能测试", test_performance)
 | ||
|     ]
 | ||
|     
 | ||
|     passed = 0
 | ||
|     failed = 0
 | ||
|     
 | ||
|     for test_name, test_func in test_functions:
 | ||
|         try:
 | ||
|             print(f"\n{'='*20} {test_name} {'='*20}")
 | ||
|             result = test_func()
 | ||
|             if result:
 | ||
|                 print(f"✅ {test_name} - 通过")
 | ||
|                 passed += 1
 | ||
|             else:
 | ||
|                 print(f"❌ {test_name} - 失败")
 | ||
|                 failed += 1
 | ||
|         except Exception as e:
 | ||
|             print(f"❌ {test_name} - 错误: {str(e)}")
 | ||
|             failed += 1
 | ||
|     
 | ||
|     print("\n" + "=" * 60)
 | ||
|     print(f"📊 测试结果统计")
 | ||
|     print(f"通过: {passed}/{len(test_functions)} ({passed/len(test_functions)*100:.1f}%)")
 | ||
|     print(f"失败: {failed}/{len(test_functions)} ({failed/len(test_functions)*100:.1f}%)")
 | ||
|     
 | ||
|     if failed == 0:
 | ||
|         print("🎉 所有测试通过!优化的辩论流程控制系统运行正常。")
 | ||
|     else:
 | ||
|         print(f"⚠️ 有 {failed} 个测试失败,需要进一步优化。")
 | ||
|     
 | ||
|     return passed, failed
 | ||
| 
 | ||
| if __name__ == "__main__":
 | ||
|     run_comprehensive_test() |