---
title: 行情业务最终一致验收样例库
doc_type: functional-test
domain: market-data
keywords:
  - 行情验收
  - 样例库
  - 对账
  - today watch
  - notice indicator
summary: 固定 A 股行情底座、事件、指标和研究输出的最小验收样例，供与原后端或后续改动做可重复对账。
when_to_read:
  - 要关闭行情底座、指标追踪或研究输出相关任务前
  - 需要把真实桌面数据库结果和原后端或历史基线对账时
read_next:
  - ./notice-market-pipeline-functional-test.md
  - ./notice-indicator-tracking-functional-test.md
  - ../business/data-fetch-tasks.md
---
# 行情业务最终一致验收样例库

这篇文档只做一件事：把当前桌面端已经确认过的 A 股验收样例固定成一套可重复复跑的对账样例。

它不替代专项功能测试文档；专项文档负责“怎么跑”，这份样例库负责“跑完以后拿哪几组交易日、股票池和预期结果来对”。如果你先要看完整手工触发步骤，回到 [公告与市场任务闭环测试](./notice-market-pipeline-functional-test.md)；如果你先要看指标专项 SQL，回到 [公告指标追踪功能测试文档](./notice-indicator-tracking-functional-test.md)。

## 样例基线

当前 `v1` 样例库基于下面这份真实桌面数据库快照整理：

- 数据库路径：`$HOME/Library/Application Support/com.wink.ai-stock-assistant.desktop/market.db`
- 快照整理日期：`2026-03-27`
- A / H / U 本地交易日历最大开放日：`2026-12-31`
- A 股最新全市场日线样例日：`2026-03-26`
- Today Watch 最新快照样例日：`2026-03-25`

这组样例不是“永远最新”的自然真值，而是当前仓库已经核过的一组固定验收锚点。后续如果要刷新样例库，必须整组更新“交易日 + 股票池 + 预期结果”，不能只改其中一列。

## 使用方式

1. 先按现有入口跑正式验证命令，例如 `npm run verify:logic`、`task-runner`、专项 `cargo test`。
2. 再对照下面的样例表，执行对应 SQL。
3. 如果实现细节变化，但业务输出仍满足样例里的正式预期，就视为通过；如果样例结果本身要改，必须同步更新这篇文档。

## 样例总览

| Sample ID | 覆盖点 | 固定交易日 / 股票 | 运行前提 | 预期结果摘要 |
| --- | --- | --- | --- | --- |
| `MKT-001` | A 股底座主样例日 | `2026-03-26` | 已跑完 `tushare.stock_basic_daily_basic.sync / tushare.stk_factor_pro.sync / tushare.limit_list_d.sync / tushare.suspend_d.sync` | `stock_basic + daily_basic` 与 `stk_factor_pro` 都落在 `2026-03-26`，`limit_list_d=47`，`suspend_d=13`，对应 `sync_status.last_cursor` 与行数一致 |
| `MKT-002` | Today Watch 样例股票池 | `2026-03-25` | 已存在 `today_watch_quote_snapshot` | 股票池共 `47` 只，provider 统一为 `aktools:sina`，可用固定前 5 只股票做页面对账 |
| `MKT-003` | 单股跨链路样例 | `002393 / 力生制药 / 2026-03-25` | 已跑完公告同步、指标追踪与 Today Watch 快照 | Today Watch、`biz_notice_indicator_record`、`biz_notice_analysis` 三处的 `tt_close=23.23` 对齐，公告状态为 `SKIPPED / DONE` |
| `MKT-004` | 同股同 T 日多公告样例 | `300323 / 华灿光电 / 2026-03-23` | 已跑完公告同步、过滤和分析 | 同股同 `T` 日有 `2` 条公告，最终状态保持 `PASSED / DONE`，不因多公告而把股票级样例拆散 |

## 样例详情

### MKT-001 A 股底座主样例日

用途：验证“最新已收盘交易日”的 A 股底座是否作为一组业务真值同时成立，而不是各域各看各的最新日。

固定 SQL：

```sql
SELECT trade_date, COUNT(*) AS row_count, SUM(CASE WHEN pct_chg IS NOT NULL THEN 1 ELSE 0 END) AS with_pct_chg
FROM api_tushare_stk_factor_pro
WHERE trade_date = '2026-03-26'
GROUP BY trade_date;

SELECT task_key, last_success_at, last_cursor
FROM sync_status
WHERE task_key IN (
  'tushare.stock_basic_daily_basic.snapshot:A:2026-03-26',
  'tushare.stk_factor_pro.snapshot:A:2026-03-26',
  'tushare.limit_list_d.snapshot:A:2026-03-26',
  'tushare.suspend_d.snapshot:A:2026-03-26'
)
ORDER BY task_key;

SELECT 'limit' AS domain, COUNT(*) AS row_count
FROM tushare_limit_list
WHERE trade_date = '2026-03-26'
UNION ALL
SELECT 'suspend' AS domain, COUNT(*) AS row_count
FROM tushare_suspend_d
WHERE trade_date = '2026-03-26';
```

预期结果：

- `api_tushare_stk_factor_pro` 在 `2026-03-26` 返回 `row_count=5481`、`with_pct_chg=5481`。
- `tushare.stock_basic_daily_basic.snapshot:A:2026-03-26` 与 `tushare.stk_factor_pro.snapshot:A:2026-03-26` 的 `last_cursor` 都应为 `2026-03-26:count=5481`。
- `tushare.limit_list_d.snapshot:A:2026-03-26` 的 `last_cursor` 应为 `2026-03-26:count=47`。
- `tushare.suspend_d.snapshot:A:2026-03-26` 的 `last_cursor` 应为 `2026-03-26:count=13`。
- 这组结果必须作为同一批次真值一起看，不能只凭单条 `sync_status` 成功标记就判整域 ready。

### MKT-002 Today Watch 样例股票池

用途：固定一个可回看的 Today Watch 股票池样例，避免每次都临时挑页面里“看起来像”的股票。

固定 SQL：

```sql
SELECT trade_date, COUNT(*) AS stock_pool_size, MAX(updated_at) AS latest_update_at, COUNT(DISTINCT source_provider) AS provider_count
FROM today_watch_quote_snapshot
WHERE trade_date = '2026-03-25'
GROUP BY trade_date;

SELECT stock_code, stock_name, t_pct_chg
FROM today_watch_quote_snapshot
WHERE trade_date = '2026-03-25'
  AND stock_code IN ('688525', '002393', '601117', '688498', '688799')
ORDER BY t_pct_chg DESC, stock_code ASC;
```

预期结果：

- `2026-03-25` 的 Today Watch 股票池规模为 `47`。
- `latest_update_at = 2026-03-25 11:45:57`。
- `provider_count = 1`，当前样例 provider 为 `aktools:sina`。
- 固定样例股票池前 5 只为：
  - `688525 / 佰维存储 / 9.438`
  - `002393 / 力生制药 / 7.497`
  - `601117 / 中国化学 / 7.356`
  - `688498 / 源杰科技 / 7.136`
  - `688799 / 华纳药厂 / 5.762`

### MKT-003 单股跨链路样例

用途：验证同一只股票在 Today Watch、指标追踪和公告分析三条链里，正式消费字段保持一致。

固定对象：`002393 / 力生制药 / 2026-03-25`

固定 SQL：

```sql
SELECT trade_date, stock_code, source_provider, t_close, t_pct_chg, updated_at
FROM today_watch_quote_snapshot
WHERE stock_code = '002393'
  AND trade_date = '2026-03-25';

SELECT stock_code, market, trade_date, stock_name, anomaly_score, tt_date, tt_close
FROM biz_notice_indicator_record
WHERE stock_code = '002393'
  AND market = 'A'
  AND trade_date = '2026-03-25';

SELECT nf.notice_id, nf.stock_code, nf.stock_name, na.trade_date, na.filter_status, na.analysis_status, na.anomaly_score, na.tt_date, na.tt_close
FROM biz_notice_analysis na
INNER JOIN biz_notice_fact nf
  ON nf.notice_id = na.notice_id
WHERE nf.stock_code = '002393'
  AND COALESCE(nf.market, 'A') = 'A'
  AND na.trade_date = '2026-03-25'
ORDER BY nf.notice_id;
```

预期结果：

- Today Watch 快照行返回 `source_provider=aktools:sina`、`t_close=23.23`、`t_pct_chg=7.497`、`updated_at=2026-03-25 11:45:57`。
- `biz_notice_indicator_record` 返回 `anomaly_score=2`、`tt_date=2026-03-25`、`tt_close=23.23`。
- `biz_notice_analysis` 返回 `notice_id=1225028969`，状态为 `filter_status=SKIPPED`、`analysis_status=DONE`，并且 `tt_date / tt_close` 与追踪表保持一致。
- 这条样例允许过滤状态是 `SKIPPED`，但不允许股票级追踪和页面行情字段互相漂移。

### MKT-004 同股同 T 日多公告样例

用途：验证“同股同 T 日多公告”不会把股票级样例拆成多套互相冲突的业务结论。

固定对象：`300323 / 华灿光电 / 2026-03-23`

固定 SQL：

```sql
SELECT nf.stock_code, nf.stock_name, na.trade_date, COUNT(*) AS notice_count, MAX(na.filter_status) AS filter_status, MAX(na.analysis_status) AS analysis_status
FROM biz_notice_analysis na
INNER JOIN biz_notice_fact nf
  ON nf.notice_id = na.notice_id
WHERE nf.stock_code = '300323'
  AND COALESCE(nf.market, 'A') = 'A'
  AND na.trade_date = '2026-03-23'
GROUP BY nf.stock_code, nf.stock_name, na.trade_date;
```

预期结果：

- 返回 `notice_count=2`。
- 这两条公告最终状态保持 `PASSED / DONE`。
- 后续如果改动影响“多公告同 T 日”的聚合，这个样例必须优先复跑。

## 更新规则

- 如果样例库要刷新，必须同时更新：样例交易日、样例股票池、SQL 和预期结果。
- 只允许在完成一轮真实验收后刷新，不允许为了让当前实现看起来通过而临时改样例。
- 如果只是新增验收范围，优先追加新的 `Sample ID`，不要覆盖已经稳定使用的旧样例。
