From b4ff9096c321e456d37fd5b6ede4d32831687f1f Mon Sep 17 00:00:00 2001 From: QiuSW <105186638@qq.com> Date: Wed, 5 Aug 2026 12:47:34 +0800 Subject: [PATCH] test(client): tighten polling test synchronization --- client/tests/polling/test_coordinator.py | 10 ++++++---- docs/tasks/T-304.md | 6 +++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/client/tests/polling/test_coordinator.py b/client/tests/polling/test_coordinator.py index aaa59b2..d4e4f1e 100644 --- a/client/tests/polling/test_coordinator.py +++ b/client/tests/polling/test_coordinator.py @@ -134,8 +134,10 @@ class FakeConsumer: def wait_until(predicate, timeout_ms: int = 2000) -> None: elapsed = 0 while not predicate() and elapsed < timeout_ms: - QTest.qWait(10) - elapsed += 10 + # worker 仍通过真实 Qt 队列信号推进,因此测试必须持续处理事件; + # 1 ms 量子既会让出 QThread,又不会把每次状态转换放大成 10 ms 等待。 + QTest.qWait(1) + elapsed += 1 if not predicate(): raise AssertionError("condition_not_reached") @@ -199,7 +201,6 @@ class PollingCoordinatorTests(unittest.TestCase): gateway = FakeGateway() coordinator, frozen = self.make_coordinator(store, gateway, None) coordinator.start() - QTest.qWait(20) self.assertEqual(coordinator.state, PollingState.BLOCKED) self.assertIn("尚未接入", coordinator.reason) self.assertEqual(store.start_calls, 0) @@ -316,8 +317,9 @@ class PollingCoordinatorTests(unittest.TestCase): coordinator.configuration_freeze_changed.connect(freeze_events.append) coordinator.start() wait_until(lambda: coordinator.state == PollingState.BLOCKED and not coordinator.operation_in_flight) - QTest.qWait(30) self.assertEqual(gateway.calls, 1) + self.assertFalse(coordinator._timer.isActive()) + self.assertIsNone(coordinator._scheduled_epoch) self.assertFalse(store.current.session.accept_new) self.assertEqual(freeze_events[-1], expected_frozen) diff --git a/docs/tasks/T-304.md b/docs/tasks/T-304.md index 72e5888..39b9a82 100644 --- a/docs/tasks/T-304.md +++ b/docs/tasks/T-304.md @@ -23,7 +23,7 @@ write_paths: - client/tests/localstate/test_store.py --- - + ## 问题 / 背景 T-006 已确认采购工具双 Tab 原型,T-303 将提供唯一的 HTTP、本地恢复、DPAPI 与单实例底座。T-304 把原型转换为可测试的原生 PySide6 主界面和定时轮询协调器,但在真实单趟执行器接入前不得领取真实任务,避免形成无人消费的 active claim。 @@ -98,6 +98,10 @@ T-006 已确认采购工具双 Tab 原型,T-303 将提供唯一的 HTTP、本 - 提交 `c9b39a4` 仅在测试替身增加 worker `entered` event,并把 gate 改为 5 秒有界、超时显式失败;未修改生产代码。测试继续验证重复 dispatch、Stop epoch/latch、旧 epoch 拒绝、consumer 零投递与 durable recovery。 - 独立审计 PASS;polling module 13 tests PASS,client 全量 233 tests PASS,仓库根 `init.ps1` PASS。 - 原生 Windows 人工 UI 验收仍未完成;T-304 保持 done=false / Doing 与 needs_human_review。 + +### 2026-08-05T04:45:40Z · ila + +2026-08-05 T-011 方案 B 由 T-304 所有者就地完成 polling 测试提速:仅修改 `client/tests/polling/test_coordinator.py`。13 个测试名完全不变,无删除/合并/skip;Qt 事件泵量子 10ms→1ms,删除同步 BLOCKED 路径无意义的固定 20ms 等待,并用“timer 未激活 + scheduled epoch 为空”的更强终态断言替代固定 30ms 等待。root 复跑 13/13 PASS,4.160s→3.574s;client 全量仍 255/255,12.892s(≤15s),compileall/diff-check/agent-context 通过。未改生产代码、轮询状态机或安全语义。T-304 仍因原生 Windows DPI/主题/高对比/Narrator/纯键盘人工验收保持 Doing。 ## 边界