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