Skip to content

Commit 10998f3

Browse files
committed
test(e2e): move contract e2e to commands, add bl/rag smoke and shared harness
1 parent ad236e9 commit 10998f3

51 files changed

Lines changed: 474 additions & 493 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

AGENTS.md

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,30 @@
44

55
## 项目地图
66

7-
monorepo 双包结构:
7+
monorepo 多包结构:
88

9-
- `packages/cli``bailian-cli` 包,CLI 命令、UI、入口
10-
- `packages/core``bailian-cli-core` 包,鉴权 / HTTP / 类型,纯逻辑层
9+
- `packages/core``bailian-cli-core`,鉴权 / HTTP / 类型,纯逻辑层
10+
- `packages/runtime``bailian-cli-runtime`,`createCli` / registry / args / output
11+
- `packages/commands``bailian-cli-commands`,命令实现 + **契约 e2e** + e2e 公共基建(`tests/e2e/core`)
12+
- `packages/cli``bailian-cli`,`bl` 产品入口 + smoke e2e
13+
- `packages/rag``bailian-cli-rag`,`rag` 产品入口 + smoke e2e
14+
15+
### E2E 测试分布
16+
17+
- 契约 e2e(help / dry-run / 真实集成): `packages/commands/tests/e2e/`
18+
- e2e 基建(`createCliRunner` 等): `packages/commands/tests/e2e/core/`(export `bailian-cli-commands/e2e`)
19+
- 产品 smoke: `packages/cli/tests/e2e/smoke.e2e.test.ts``packages/rag/tests/e2e/smoke.e2e.test.ts`
20+
- 一次跑全量 e2e: 根目录 `pnpm test:e2e`
1121

1222
### `packages/cli` 目录要点
1323

1424
```
1525
packages/cli/
16-
├── src/
17-
│ ├── main.ts # 入口、鉴权分支、调用 registry
18-
│ ├── registry.ts # 命令树解析、动态 help(读 catalog)
19-
│ ├── commands/
20-
│ │ ├── catalog.ts # 命令总表(登记处,构建脚本也读它)
21-
│ │ ├── index.ts # re-export commands
22-
│ │ └── <group>/...ts # 各命令 defineCommand 实现
23-
│ ├── output/ # CLI 输出、prompt、progress
24-
│ └── urls.ts # 控制台/文档 URL(仅 cli)
25-
└── tests/e2e/
26+
├── src/main.ts # bl 入口(createCli + commands)
27+
└── tests/e2e/smoke.e2e.test.ts
2628
```
2729

28-
Skill / 命令手册随 `skills/bailian-cli/``npx skills add modelstudioai/cli` 安装。`tools/generate-reference.ts``catalog.ts` 生成命令手册到 `skills/bailian-cli/reference/`(纳入 git);`tools/sync-skill-metadata.ts` 一起在 **pre-commit**`.vite-hooks/pre-commit`)及根脚本 `pnpm run sync:skill-assets` 中执行
30+
命令实现见 `packages/commands/src/commands/`;登记在 **`groups.ts`**`bl --help` `tools/generate-reference.ts` 生成的命令手册同源,见 [command-add-remove.md](docs/agents/command-add-remove.md)
2931

3032
非代码资产:
3133

@@ -37,9 +39,11 @@ Skill / 命令手册随 `skills/bailian-cli/` 经 `npx skills add modelstudioai/
3739
约定:
3840

3941
- core 是纯库,不依赖 cli(详见下方通用约定)
40-
- 文件路径与命令路径一一对应:`commands/text/chat.ts``bl text chat`
42+
- 文件路径与命令路径一一对应:`packages/commands/src/commands/text/chat.ts``bl text chat`
4143
- 单级命令:`commands/<name>.ts`(如 `update.ts`);两级:`commands/<group>/<action>.ts`
42-
- 命令登记在 **`catalog.ts`**;`bl --help``tools/generate-reference.ts` 生成的命令手册同源,见 [command-add-remove.md](docs/agents/command-add-remove.md)
44+
- 命令登记在 **`packages/commands/src/commands/groups.ts`**
45+
46+
Skill / 命令手册随 `skills/bailian-cli/``npx skills add modelstudioai/cli` 安装。`tools/generate-reference.ts` 从 catalog 生成命令手册到 `skills/bailian-cli/reference/`(纳入 git);与 `tools/sync-skill-metadata.ts` 一起在 **pre-commit**`.vite-hooks/pre-commit`)及根脚本 `pnpm run sync:skill-assets` 中执行。
4347

4448
## 业务场景索引
4549

docs/agents/cli-e2e-tests.md

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,48 @@
11
# CLI E2E 测试规范
22

3+
## 架构(composable-cli)
4+
5+
E2E 按包分层,与命令实现 / 产品入口解耦:
6+
7+
| 层级 | 路径 | 测什么 |
8+
| ---------------- | -------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |
9+
| **公共基建** | `packages/commands/tests/e2e/core/` | `createCliRunner`、skip 判定、输出目录、global-setup |
10+
| **命令契约 e2e** | `packages/commands/tests/e2e/*.e2e.test.ts` | help、缺参、dry-run、**真实集成**;跑 canonical 入口 `tests/fixtures/test-cli.ts` |
11+
| **产品 smoke** | `packages/cli/tests/e2e/smoke.e2e.test.ts``packages/rag/tests/e2e/smoke.e2e.test.ts` | 版本、root help、命令面裁剪;跑各产品 `src/main.ts` |
12+
13+
> `commands/tests/e2e/core` 是 e2e 测试基建,与 `packages/core``bailian-cli-core`)无关。
14+
315
## 触发条件
416

5-
- 新增/修改 `packages/cli/src` 下的 command(`commands/catalog.ts` 登记、`defineCommand` 实现、options/usage)
6-
- 新建或扩展 `packages/cli/tests/e2e/*.e2e.test.ts` 用例
17+
- 新增/修改 `packages/commands/src/commands/` 下的 command(`groups.ts` 登记、`defineCommand` 实现、options/usage)
18+
- 新建或扩展 `packages/commands/tests/e2e/<topic>.e2e.test.ts` 用例
19+
- 新增/变更产品命令面(bl / rag)时同步维护对应 smoke 用例
720
- 为命令补 help / 缺参 / dry-run / 真实集成测试
821

9-
以上情况必须同步维护 `packages/cli/tests/e2e/<topic>.e2e.test.ts`。跑测与环境变量见 `.cursor/skills/bailian-cli-e2e/SKILL.md`
10-
1122
## 文件与工具
1223

13-
- 路径:`packages/cli/tests/e2e/<kebab-topic>.e2e.test.ts`
14-
- 框架:`vite-plus/test`;子进程跑 CLI:`runCli` from `./helpers.ts`
15-
- 解析 JSON stdout:`parseStdoutJson`;输出目录:`makeE2eOutputDir(e2eLabelFromMetaUrl(import.meta.url))`
16-
- 长任务:`cliTimeoutPrefix()`;视频用例加 `test(..., 3_600_000)` 等显式超时
24+
- **契约 e2e 路径**`packages/commands/tests/e2e/<kebab-topic>.e2e.test.ts`
25+
- **框架**`vite-plus/test`;契约测试 `runCli` from `./setup.ts`;cli/rag smoke from `./setup.ts`(内部 `import from "bailian-cli-commands/e2e"`
26+
- **解析 JSON stdout**`parseStdoutJson`;输出目录:`makeE2eOutputDir(e2eLabelFromMetaUrl(import.meta.url))`
27+
- **长任务**`cliTimeoutPrefix()`;视频用例加 `test(..., 3_600_000)` 等显式超时
28+
29+
## 跑测命令
30+
31+
```sh
32+
# 一次跑全部 e2e(契约 + bl/rag smoke)
33+
pnpm test:e2e
34+
35+
# 仅命令契约(含真实集成,需 BAILIAN_E2E=1 等)
36+
pnpm --filter bailian-cli-commands test
37+
38+
# 单文件(在 bailian-cli-commands 包目录下运行,路径相对于 packages/commands)
39+
pnpm --filter bailian-cli-commands test tests/e2e/text-chat.e2e.test.ts
40+
41+
# 全 monorepo(unit + e2e)
42+
vp run -r test
43+
```
44+
45+
环境变量与 skip 条件见 `.cursor/skills/bailian-cli-e2e/SKILL.md`(若存在)或下文 skip 表。
1746

1847
## 双层 describe(固定结构)
1948

@@ -32,7 +61,7 @@ describe.skipIf(<ready>)("e2e: <topic>(DashScope …)", () => {
3261
});
3362
```
3463

35-
## skip 条件(helpers.ts)
64+
## skip 条件(`tests/e2e/core/skip.ts`
3665

3766
| 场景 | 条件 |
3867
| ------------------- | ----------------------------------------------------- |
@@ -59,12 +88,13 @@ describe.skipIf(<ready>)("e2e: <topic>(DashScope …)", () => {
5988

6089
## 新增 command 检查清单
6190

62-
- [ ] `commands/catalog.ts` 登记 + `tests/e2e/<topic>.e2e.test.ts`(新建或扩展)
91+
- [ ] `packages/commands/src/commands/groups.ts` 登记 + `packages/commands/tests/e2e/<topic>.e2e.test.ts`(新建或扩展)
6392
- [ ] 若改了 `usage` / `options` / `examples`,跑 `pnpm --filter bailian-cli run generate:reference` 更新 `skills/bailian-cli/reference/` 并提交
6493
- [ ] 顶层:分组 help + 子命令 `--help`(多子命令则各一条 help)
6594
- [ ] skip 块:每个 required flag 缺参;可 dry-run 则加一条
6695
- [ ] 至少一条真实集成(或说明为何仅 smoke);不破坏已有集成用例顺序
67-
- [ ] `pnpm test packages/cli/tests/e2e/<file>` 通过
96+
- [ ] 若 bl/rag 命令面变更,更新对应 smoke 用例
97+
- [ ] `pnpm --filter bailian-cli-commands test tests/e2e/<file>` 通过
6898

6999
## 示例片段
70100

@@ -97,4 +127,4 @@ test("foo bar --dry-run 仅输出计划", async () => {
97127
- **E2E**:单条/少量调用、断言固定、可进 `vp test`(见上文 skip 条件)
98128
- **批量压测**`packages/cli/tests/stress/run.mjs` + `targets/*.mjs`,并发 + 报告,**仅手动** `pnpm run test:stress -- <target>`
99129

100-
勿把压测并入 E2E 或默认 CI。详见 [stress-batch-tests.md](stress-batch-tests.md)
130+
勿把压测并入 E2E 或默认 CI。详见 [stress-batch-tests.md](stress-batch-tests.md).

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
"bl": "pnpm -F bailian-cli dev",
2222
"rag": "pnpm -F bailian-cli-rag dev",
2323
"test": "vp test",
24+
"test:e2e": "pnpm --filter bailian-cli-commands --filter bailian-cli --filter bailian-cli-rag test",
2425
"release:check": "node tools/release/check.mjs",
2526
"wiki:crawl": "node tools/wiki-crawler/index.mjs",
2627
"test:stress": "node packages/cli/tests/stress/run.mjs"

packages/cli/tests/args.test.ts

Lines changed: 0 additions & 95 deletions
This file was deleted.

0 commit comments

Comments
 (0)