liurenchaxin/tests/test_optimized_debate_flow.py

404 lines
14 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.

#!/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()