diff --git a/tests/data_platform/test_provider_method_parity.py b/tests/data_platform/test_provider_method_parity.py new file mode 100644 index 0000000..44e7044 --- /dev/null +++ b/tests/data_platform/test_provider_method_parity.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +"""provider 方法面钉死测试(CI 版,issue #35 方案 A)。 + +背景:2026-08-21 实盘选股挂死+涨跌停过滤失效,根因都是「回测 provider +(LocalUnifiedProvider)有、实盘 provider(SanguoMiniQmtProvider)无」的方法缺口 +(累计 5 个洞)。ff05207 在 tests/portfolio/test_provider.py 加了钉死测试,但 +CI 的 pytest 只跑 tests/data_platform → 钉死虚标(issue #35)。本文件把钉死 +**原样复制**进 CI 执行范围,不改 CI workflow、不动其他测试。 + +牙齿自检:bullet_trade 不可用直接 FAIL(而非 skip)——skip 会让钉死在环境 +劣化时无声失效,重蹈 issue #35;单测失败不会中断同批其他测试(pytest 仅 +collection error 才中断),不影响 CI 其他功能。 +""" +import os + +# 必须早于 bullet_trade import:0.9.2 默认 provider=jqdata 会拖 jqdatasdk +os.environ.setdefault("DEFAULT_DATA_PROVIDER", "miniqmt") + +import pathlib +import re + + +def test_method_surface_no_gap_left(): + """unified 全部公共方法在实盘 provider(+MiniQMTProvider base)都有。 + + 与 tests/portfolio/test_provider.py::test_method_surface_no_gap_left + 逐字等价(复制契约:两处必须同步改)。 + """ + try: + from sanguo_portfolio import SanguoMiniQmtProvider + from bullet_trade.data.providers.miniqmt import MiniQMTProvider + except ImportError as exc: + import pytest + pytest.fail( + f"方法面钉死测试无法执行(缺依赖 {exc})——CI venv310 必须装 " + f"bullet_trade,否则钉死虚标(issue #35 重演)") + + base_dir = pathlib.Path(__file__).resolve().parents[2] + uni_src = (base_dir / "sanguo_portfolio/providers/local_unified_provider.py" + ).read_text(encoding="utf-8") + uni_methods = set(re.findall(r"^\s{4}def ([a-z]\w+)\(", uni_src, re.M)) + provider = SanguoMiniQmtProvider.__dict__ + base_methods = set( + n for n, v in vars(MiniQMTProvider).items() + if callable(v) and not n.startswith("__")) + missing = sorted( + m for m in uni_methods + if not m.startswith("_") + and m not in provider and m not in base_methods) + assert missing == [], f"回测有实盘无: {missing}"