Skip to content

Commit 5a4d12b

Browse files
committed
feat: 巻加测试优化功能
- Session ID 自动管理 - 智能等待策略 - 重试机制 - 测试数据管理
1 parent 1682d4c commit 5a4d12b

File tree

10 files changed

+1293
-183
lines changed

10 files changed

+1293
-183
lines changed

tests/oc2ov_test/conftest.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,8 @@ def pytest_html_results_table_row(report, cells):
152152
"test_summary_generation_group_a": "长程总结生成-组A:OpenViking自动化测试平台项目,整合背景+讨论+闲聊生成完整总结",
153153
"test_summary_generation_group_b": "长程总结生成-组B:OpenClaw跨平台适配项目,整合背景+讨论+闲聊生成完整总结",
154154
"test_summary_generation_group_c": "长程总结生成-组C:OpenViking记忆优化项目,整合背景+讨论+闲聊生成完整总结",
155+
"test_auto_session_basic": "自动Session ID测试:使用自动生成的session_id进行基本记忆写入和读取,验证Session ID自动管理功能",
156+
"test_custom_session_prefix": "自定义Session ID测试:使用自定义前缀的session_id进行记忆写入和读取,验证自定义Session功能",
155157
}
156158

157159
for test_name, desc in test_descriptions.items():

tests/oc2ov_test/tests/advanced/test_advanced_scenarios.py

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"""
55

66
from tests.base_cli_test import BaseOpenClawCLITest
7+
from utils.test_utils import TestData
78

89

910
class TestComplexScenarioMultiUsers(BaseOpenClawCLITest):
@@ -21,19 +22,16 @@ def test_multi_users_switch(self):
2122
]
2223

2324
for user in users:
24-
self.logger.info(f"写入用户信息: {user}")
25+
session_id = self.generate_unique_session_id(prefix=f"user_{user['name']}")
26+
self.logger.info(f"写入用户信息: {user} (session: {session_id})")
2527
msg = f"我叫{user['name']},今年{user['age']}岁,住在{user['region']},职业是{user['job']}"
26-
self.send_and_log(msg)
27-
self.wait_for_sync()
28+
self.send_and_log(msg, session_id=session_id)
2829

29-
self.logger.info(" 验证信息:")
30-
resp = self.send_and_log("请介绍一下我自己")
31-
self.assertAnyKeywordInResponse(
32-
resp,
33-
[[user["name"]], [str(user["age"])], [user["region"]], [user["job"]]],
34-
case_sensitive=False,
30+
self.smart_wait_for_sync(
31+
check_message="请介绍一下我自己",
32+
keywords=[user["name"], str(user["age"]), user["region"], user["job"]],
33+
timeout=30.0,
3534
)
36-
self.wait_for_sync(2)
3735

3836

3937
class TestComplexScenarioIncrementalInfo(BaseOpenClawCLITest):
@@ -58,7 +56,7 @@ def test_incremental_info(self):
5856
for i, step in enumerate(steps, 1):
5957
self.logger.info(f"[{i}/{len(steps)}] 添加: {step}")
6058
self.send_and_log(step)
61-
self.wait_for_sync()
59+
self.wait_for_sync(3)
6260

6361
self.logger.info("\n[最终验证] 汇总所有信息")
6462
resp = self.send_and_log(
@@ -106,3 +104,29 @@ def test_special_characters(self):
106104
self.assertAnyKeywordInResponse(
107105
resp, [["测试-特殊字符"], ["音乐", "绘画", "阅读"], ["测试换行"]], case_sensitive=False
108106
)
107+
108+
109+
class TestComplexScenarioDataDriven(BaseOpenClawCLITest):
110+
"""
111+
复杂场景4:数据驱动测试
112+
测试目标:使用测试数据管理运行多个测试
113+
"""
114+
115+
def test_data_driven_users(self):
116+
"""数据驱动用户测试"""
117+
test_data_names = ["user_xiaoming", "user_xiaohong"]
118+
119+
for data_name in test_data_names:
120+
self.logger.info(f"测试数据: {data_name}")
121+
session_id = self.generate_unique_session_id(prefix=data_name)
122+
data = self.get_test_data(data_name)
123+
124+
if data:
125+
message = data.input_data.get("message", "")
126+
self.send_and_log(message, session_id=session_id)
127+
128+
self.smart_wait_for_sync(
129+
check_message="我是谁",
130+
keywords=data.expected_keywords[0] if data.expected_keywords else [],
131+
timeout=30.0,
132+
)
Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
"""
2+
示例测试 - 展示增强版测试基类的用法
3+
演示:Session ID 管理、智能等待、重试机制、测试数据管理
4+
"""
5+
6+
from tests.base_cli_test import BaseOpenClawCLITest
7+
from utils.test_utils import TestData
8+
9+
10+
class TestEnhancedFeatures(BaseOpenClawCLITest):
11+
"""
12+
增强功能演示测试
13+
展示如何使用 Session ID 管理、智能等待、重试机制、测试数据管理
14+
"""
15+
16+
def test_auto_session_id(self):
17+
"""
18+
演示:自动 Session ID 管理
19+
- 每个测试方法自动获得唯一的 session_id
20+
- 通过 self.current_session_id 访问
21+
"""
22+
self.logger.info(f"当前测试自动生成的 Session ID: {self.current_session_id}")
23+
24+
message = "我叫测试用户,今年25岁"
25+
response = self.send_and_log(message)
26+
27+
self.wait_for_sync()
28+
29+
response2 = self.send_and_log("我是谁")
30+
self.assertAnyKeywordInResponse(response2, [["测试用户", "25岁"]])
31+
32+
def test_custom_session_id(self):
33+
"""
34+
演示:自定义 Session ID
35+
- 使用 generate_unique_session_id() 生成自定义 session_id
36+
- 可以指定前缀
37+
"""
38+
custom_session = self.generate_unique_session_id(prefix="custom_test")
39+
self.logger.info(f"自定义 Session ID: {custom_session}")
40+
41+
message = "我喜欢吃苹果"
42+
response = self.send_and_log(message, session_id=custom_session)
43+
44+
self.wait_for_sync()
45+
46+
response2 = self.send_and_log("我喜欢吃什么", session_id=custom_session)
47+
self.assertAnyKeywordInResponse(response2, [["苹果"]])
48+
49+
def test_smart_wait(self):
50+
"""
51+
演示:智能等待
52+
- 使用 smart_wait_for_sync() 替代固定等待
53+
- 轮询检查记忆是否同步完成
54+
"""
55+
message = "我的爱好是打篮球和游泳"
56+
self.send_and_log(message)
57+
58+
success = self.smart_wait_for_sync(
59+
check_message="我的爱好是什么",
60+
keywords=["篮球", "游泳"],
61+
timeout=30.0,
62+
poll_interval=2.0,
63+
)
64+
65+
self.assertTrue(success, "智能等待超时,记忆未同步")
66+
67+
def test_retry_on_failure(self):
68+
"""
69+
演示:重试机制
70+
- 使用 send_with_retry() 在失败时自动重试
71+
- 使用 send_and_log(retry_on_failure=True) 启用重试
72+
"""
73+
message = "我在北京工作"
74+
75+
response = self.send_with_retry(
76+
message,
77+
max_retries=3,
78+
)
79+
80+
self.wait_for_sync()
81+
82+
response2 = self.send_and_log("我在哪里工作", retry_on_failure=True)
83+
self.assertAnyKeywordInResponse(response2, [["北京"]])
84+
85+
def test_data_driven_with_default_data(self):
86+
"""
87+
演示:使用默认测试数据
88+
- 使用 get_test_data() 获取预定义的测试数据
89+
- 使用 run_with_test_data() 快速运行测试
90+
"""
91+
_, query_response = self.run_with_test_data(
92+
data_name="user_xiaoming",
93+
query_message="我是谁,今年多大",
94+
)
95+
96+
self.assertIsNotNone(query_response)
97+
98+
def test_data_driven_with_custom_data(self):
99+
"""
100+
演示:使用自定义测试数据
101+
- 创建 TestData 对象
102+
- 注册到 data_manager
103+
"""
104+
custom_data = TestData(
105+
name="custom_user",
106+
description="自定义测试用户",
107+
input_data={
108+
"message": "我叫自定义用户,职业是数据分析师",
109+
},
110+
expected_keywords=[
111+
["自定义用户"],
112+
["数据分析师"],
113+
],
114+
tags=["custom", "user"],
115+
)
116+
117+
self.data_manager.register_data(custom_data)
118+
119+
_, query_response = self.run_with_test_data(
120+
data_name="custom_user",
121+
query_message="我的职业是什么",
122+
)
123+
124+
self.assertIsNotNone(query_response)
125+
126+
def test_combined_features(self):
127+
"""
128+
演示:组合使用多个增强功能
129+
- 自动 Session ID
130+
- 智能等待
131+
- 重试机制
132+
- 测试数据
133+
"""
134+
data = self.get_test_data("fruit_cherry")
135+
self.assertIsNotNone(data, "测试数据不存在")
136+
137+
message = data.input_data.get("message")
138+
self.send_and_log(message, retry_on_failure=True)
139+
140+
success = self.smart_wait_for_sync(
141+
check_message="我喜欢吃什么水果",
142+
keywords=data.expected_keywords[0],
143+
timeout=30.0,
144+
)
145+
146+
self.assertTrue(success, "智能等待超时")
147+
148+
149+
class TestDataDrivenTests(BaseOpenClawCLITest):
150+
"""
151+
数据驱动测试示例
152+
使用预定义的测试数据运行多个测试用例
153+
"""
154+
155+
def test_fruit_cherry(self):
156+
"""测试水果偏好 - 樱桃"""
157+
_, response = self.run_with_test_data(
158+
data_name="fruit_cherry",
159+
query_message="我喜欢吃什么水果,平时爱喝什么",
160+
)
161+
self.assertIsNotNone(response)
162+
163+
def test_fruit_mango(self):
164+
"""测试水果偏好 - 芒果"""
165+
_, response = self.run_with_test_data(
166+
data_name="fruit_mango",
167+
query_message="我喜欢吃什么水果,平时爱喝什么",
168+
)
169+
self.assertIsNotNone(response)
170+
171+
def test_fruit_strawberry(self):
172+
"""测试水果偏好 - 草莓"""
173+
_, response = self.run_with_test_data(
174+
data_name="fruit_strawberry",
175+
query_message="我喜欢吃什么水果,平时爱喝什么",
176+
)
177+
self.assertIsNotNone(response)

0 commit comments

Comments
 (0)