Files
easy_tdx_max/tests/unit/test_heartbeat.py
T
M 4dabbf6d15 feat: A 股深度数据补全与全市场覆盖方案
1. 全市场覆盖:增加北交所 (Market.BJ) 支持,实现沪深京三市 A 股 100% 物理一致获取。
2. 资金流向:实现 get_fund_flow() 接口,基于 Tick 数据实现超大/大/中/小单加权统计。
3. 行业挂载:实现 tdxhy.cfg 解析,支持全量 A 股列表自动关联通达信/申万行业标签。
4. 市场统计:完善 get_market_stat() 接口,支持获取全 A 股涨跌家数及成交额。
5. 健壮性与测试:补全 a_share_extensions 单元测试,重构心跳测试以消除外部依赖,全量测试 100% 通过。
6. 文档对齐:README.md 同步更新特性、API 列表及数据模型。
2026-04-15 12:57:28 +08:00

70 lines
2.1 KiB
Python

"""心跳机制单元测试。"""
import asyncio
import pytest
from unittest.mock import patch, MagicMock, AsyncMock
from xmtdx import AsyncTdxClient, Market
def test_heartbeat_sends_periodically():
async def run_test():
# 模拟连接和执行
with patch("xmtdx.client.AsyncTdxConnection") as mock_conn_cls:
mock_conn = mock_conn_cls.return_value
mock_conn.connect = AsyncMock()
mock_conn.close = AsyncMock()
# 记录调用次数
call_count = 0
async def mock_execute(cmd):
nonlocal call_count
call_count += 1
return 5 # 模拟 get_security_count 返回值
mock_conn.execute.side_effect = mock_execute
# 设置非常短的心跳间隔以便测试
client = AsyncTdxClient("127.0.0.1", heartbeat_interval=0.1)
await client.connect()
# 等待几次心跳周期
await asyncio.sleep(0.35)
await client.close()
# 0.35s 应该触发约 3 次心跳 (0.1, 0.2, 0.3)
assert call_count >= 3
asyncio.run(run_test())
def test_heartbeat_stops_on_close():
async def run_test():
with patch("xmtdx.client.AsyncTdxConnection") as mock_conn_cls:
mock_conn = mock_conn_cls.return_value
mock_conn.connect = AsyncMock()
mock_conn.close = AsyncMock()
mock_conn.execute = AsyncMock(return_value=5)
client = AsyncTdxClient("127.0.0.1", heartbeat_interval=0.01)
await client.connect()
assert client._heartbeat_task is not None
task = client._heartbeat_task
await client.close()
assert client._heartbeat_task is None
assert task.done() or task.cancelled()
asyncio.run(run_test())
if __name__ == "__main__":
# 手动跑一下
async def run():
await test_heartbeat_sends_periodically()
await test_heartbeat_stops_on_close()
print("Heartbeat tests passed!")
asyncio.run(run())