test(ci): 方法面钉死测试复制进CI执行范围——issue#35方案A,ff05207「缺任一CI红」从虚标变成立 [nas]
钉死测试(test_method_surface_no_gap_left)原在tests/portfolio/test_provider.py, 而ci-cd.yml pytest只跑tests/data_platform→CI从不执行=钉死虚标(issue#35)。 本commit把该测试逐字复制到tests/data_platform/test_provider_method_parity.py (复制契约:两处同步改),CI 零改动零新依赖,其他测试零影响: - 牙齿自检:bullet_trade不可用直接FAIL非skip(skip=环境劣化时钉死无声失效, 重蹈#35;单测失败不中断同批其他测试) - RED实证:给unified源码临时加假公共方法zz_fake_parity_gap→ AssertionError「回测有实盘无:['zz_fake_parity_gap']」→还原复绿 - venv310按CI原样跑全套tests/data_platform:178绿(原177+新增1) 方案B(CI扩跑整个tests/portfolio,需先清13个Mac环境性失败)仍为可选增强,不阻塞
This commit is contained in:
@@ -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}"
|
||||
Reference in New Issue
Block a user