test(ci): CI扩跑tests/portfolio+钉死测试归一——issue#35方案B,440组合引擎题进门禁 [nas]
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 27s
CI/CD / nas-verify (push) Successful in 2s

前置已消失:2197fea时点的13个Mac环境性失败,已被08-14 bullet_trade 0.9.2升齐+08-15补22个lock包
两次依赖治理顺带清零(本次实测440绿/1.74s,此前无人回头验收过);CI runner=本机Mac同venv310,本地绿即CI绿。

改动三件(不只加一行,用户点破冗余):
- 钉死测试迁至独立文件tests/portfolio/test_provider_method_surface.py:单一真相+保留
  fail-not-skip牙齿。原位置挂模块级requires_bullet_trade mark,conftest会在bullet_trade
  缺失时自动skip=钉死虚标(#35重演形态),必须移出mark覆盖面
- 删tests/data_platform/test_provider_method_parity.py(4aad65a方案A的复制版,
  「两处同步改」人工契约随之消亡)
- ci-cd.yml pytest行扩为 tests/data_platform tests/portfolio

验证:组合跑(CI同款命令)=617 passed/2 skipped/6.07s(177+440,副本删除-1,迁移+1);
conftest合并无冲突;钉死测试在新位置实跑通过。
This commit is contained in:
2026-08-22 22:51:57 +08:00
parent a58d9fd385
commit 136d087b34
3 changed files with 17 additions and 37 deletions
+4 -2
View File
@@ -50,10 +50,12 @@ jobs:
exit 1
fi
echo "✅ 本次 push commit 标签齐全"
- name: pytest 冒烟 (venv310 数据层核心)
- name: pytest 冒烟 (venv310 数据层+组合引擎)
run: |
PY=/Users/chufeng/.openclaw/sanguo_projects/sanguo_vnpy_v2/venv310/bin/python
PYTHONPATH="$GITHUB_WORKSPACE" $PY -m pytest tests/data_platform -q
# 2026-08-22 起扩跑 tests/portfolio(issue#35 方案 B):原 13 个 Mac 环境失败
# 已被依赖治理顺带清零(实测 440 绿 1.74s);组合引擎 440 题进 CI 门禁
PYTHONPATH="$GITHUB_WORKSPACE" $PY -m pytest tests/data_platform tests/portfolio -q
# ---------- NAS 部署(后端代码 + 前端 dist + restart 容器) ----------
nas-deploy:
+3 -19
View File
@@ -521,23 +521,7 @@ class TestFullMethodSurfaceAlignment:
assert seen["count"] == 5
assert seen["panel"] is False
def test_method_surface_no_gap_left(self):
"""unified 全部公共方法在实盘 provider(+base)都有(同类洞清零钉死)。"""
import inspect
import re as _re
import pathlib
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__
from bullet_trade.data.providers.miniqmt import MiniQMTProvider
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}"
# 方法面钉死测试已迁至 test_provider_method_surface.py(单一真相,
# fail-not-skip 牙齿)——本模块的 requires_bullet_trade mark 会让它在
# bullet_trade 缺失时被 conftest 自动 skip(钉死虚标,issue #35),故移出。
@@ -1,31 +1,25 @@
# -*- coding: utf-8 -*-
"""provider 方法面钉死测试(CI 版,issue #35 方案 A)。
"""provider 方法面钉死测试(单一真相,issue #35 方案 B)。
背景:2026-08-21 实盘选股挂死+涨跌停过滤失效,根因都是回测 provider
(LocalUnifiedProvider)实盘 provider(SanguoMiniQmtProvider)的方法缺口
(累计 5 个洞)ff05207 tests/portfolio/test_provider.py 加了钉死测试,
CI pytest 只跑 tests/data_platform 钉死虚标(issue #35)。本文件把钉死
**原样复制** CI 执行范围,不改 CI workflow不动其他测试
(累计 5 个洞)ff05207 加钉死测试,但当时 CI 只跑 tests/data_platform 钉死
虚标(issue #35)。2026-08-22 起 CI 扩跑 tests/portfolio(原 13 个 Mac 环境失败
已被依赖治理顺带清零,实测 440 绿 1.74s),本文件成为钉死的**唯一**版本
原先两处冗余已删:tests/portfolio/test_provider.py 内旧版(挂模块级
requires_bullet_trade mark,conftest 会在 bullet_trade 缺失时自动 skip=牙齿弱)
tests/data_platform/test_provider_method_parity.py 复制版(方案 A 过渡)
牙齿自检:bullet_trade 不可用直接 FAIL(而非 skip)skip 会让钉死在环境
劣化时无声失效,重蹈 issue #35;单测失败不会中断同批其他测试(pytest 仅
collection error 才中断),不影响 CI 其他功能
劣化时无声失效,重蹈 issue #35。本文件故意**不打** requires_bullet_trade mark,
conftest 的自动 skip 对它不适用
"""
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
逐字等价(复制契约:两处必须同步改)
"""
"""unified 全部公共方法在实盘 provider(+MiniQMTProvider base)都有。"""
try:
from sanguo_portfolio import SanguoMiniQmtProvider
from bullet_trade.data.providers.miniqmt import MiniQMTProvider