@be-link/smart-test 1.0.1-beta.3 → 1.0.1-beta.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/README.md +191 -414
  2. package/dist/bin/smart-test.d.ts +2 -0
  3. package/dist/bin/smart-test.d.ts.map +1 -0
  4. package/dist/bin/smart-test.js +23373 -0
  5. package/dist/cli/commands/generate.d.ts +5 -13
  6. package/dist/cli/commands/generate.d.ts.map +1 -1
  7. package/dist/cli/commands/index.d.ts +5 -0
  8. package/dist/cli/commands/index.d.ts.map +1 -0
  9. package/dist/cli/commands/init.d.ts +4 -2
  10. package/dist/cli/commands/init.d.ts.map +1 -1
  11. package/dist/cli/commands/preset.d.ts +5 -0
  12. package/dist/cli/commands/preset.d.ts.map +1 -0
  13. package/dist/cli/commands/record-only.d.ts +7 -0
  14. package/dist/cli/commands/record-only.d.ts.map +1 -0
  15. package/dist/cli/commands/record.d.ts +2 -3
  16. package/dist/cli/commands/record.d.ts.map +1 -1
  17. package/dist/cli/commands/run.d.ts +7 -0
  18. package/dist/cli/commands/run.d.ts.map +1 -0
  19. package/dist/cli/loaders/config-loader.d.ts +7 -0
  20. package/dist/cli/loaders/config-loader.d.ts.map +1 -0
  21. package/dist/cli/loaders/env-loader.d.ts +6 -0
  22. package/dist/cli/loaders/env-loader.d.ts.map +1 -0
  23. package/dist/cli/loaders/preset-loader.d.ts +33 -0
  24. package/dist/cli/loaders/preset-loader.d.ts.map +1 -0
  25. package/dist/cli/templates/playwright.config.template.ts +59 -0
  26. package/dist/cli/templates/recording-preset.template.ts +53 -0
  27. package/dist/cli/templates/smart-test.config.template.ts +42 -0
  28. package/dist/core/config.d.ts +18 -26
  29. package/dist/core/config.d.ts.map +1 -1
  30. package/dist/core/types/ai.types.d.ts +41 -0
  31. package/dist/core/types/ai.types.d.ts.map +1 -0
  32. package/dist/core/types/api.types.d.ts +34 -0
  33. package/dist/core/types/api.types.d.ts.map +1 -0
  34. package/dist/core/types/config.types.d.ts +41 -0
  35. package/dist/core/types/config.types.d.ts.map +1 -0
  36. package/dist/core/types/index.d.ts +8 -0
  37. package/dist/core/types/index.d.ts.map +1 -0
  38. package/dist/core/types/recorder.types.d.ts +204 -0
  39. package/dist/core/types/recorder.types.d.ts.map +1 -0
  40. package/dist/generators/base-generator.d.ts +37 -0
  41. package/dist/generators/base-generator.d.ts.map +1 -0
  42. package/dist/generators/index.d.ts +7 -0
  43. package/dist/generators/index.d.ts.map +1 -0
  44. package/dist/generators/mock-generator.d.ts +30 -0
  45. package/dist/generators/mock-generator.d.ts.map +1 -0
  46. package/dist/generators/test-generator.d.ts +53 -0
  47. package/dist/generators/test-generator.d.ts.map +1 -0
  48. package/dist/index.d.ts +6 -3
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.esm.mjs +22201 -0
  51. package/dist/index.js +22167 -159
  52. package/dist/prompts/fragment-loader.d.ts +28 -0
  53. package/dist/prompts/fragment-loader.d.ts.map +1 -0
  54. package/dist/prompts/fragments/system/mock-generation-base.md +38 -0
  55. package/dist/prompts/fragments/system/mock-generation-example.md +199 -0
  56. package/dist/prompts/fragments/system/mock-generation-specs.md +148 -0
  57. package/dist/prompts/fragments/system/test-generation-api-reference.md +137 -0
  58. package/dist/prompts/fragments/system/test-generation-base.md +62 -0
  59. package/dist/prompts/fragments/system/test-generation-requirements.md +85 -0
  60. package/dist/prompts/fragments/user/test-generation-header.md +19 -0
  61. package/dist/prompts/fragments/user/test-generation-mock-hint.md +9 -0
  62. package/dist/prompts/fragments/user/test-generation-template.md +47 -0
  63. package/dist/prompts/index.d.ts +3 -0
  64. package/dist/prompts/index.d.ts.map +1 -0
  65. package/dist/prompts/mock-generation.prompt.d.ts +23 -0
  66. package/dist/prompts/mock-generation.prompt.d.ts.map +1 -0
  67. package/dist/prompts/test-generation.prompt.d.ts +47 -0
  68. package/dist/prompts/test-generation.prompt.d.ts.map +1 -0
  69. package/dist/recorders/action-tracker.d.ts +42 -0
  70. package/dist/recorders/action-tracker.d.ts.map +1 -0
  71. package/dist/recorders/index.d.ts +8 -0
  72. package/dist/recorders/index.d.ts.map +1 -0
  73. package/dist/recorders/interactive-recorder.d.ts +61 -0
  74. package/dist/recorders/interactive-recorder.d.ts.map +1 -0
  75. package/dist/recorders/screenshot-manager.d.ts +23 -0
  76. package/dist/recorders/screenshot-manager.d.ts.map +1 -0
  77. package/dist/services/ai/ai-service.d.ts +36 -0
  78. package/dist/services/ai/ai-service.d.ts.map +1 -0
  79. package/dist/services/ai/index.d.ts +2 -0
  80. package/dist/services/ai/index.d.ts.map +1 -0
  81. package/dist/services/browser/api-interceptor.d.ts +44 -0
  82. package/dist/services/browser/api-interceptor.d.ts.map +1 -0
  83. package/dist/services/browser/index.d.ts +2 -0
  84. package/dist/services/browser/index.d.ts.map +1 -0
  85. package/dist/utils/data-compressor.d.ts +62 -0
  86. package/dist/utils/data-compressor.d.ts.map +1 -0
  87. package/dist/utils/file-writer.d.ts +13 -0
  88. package/dist/utils/file-writer.d.ts.map +1 -0
  89. package/dist/utils/fs-utils.d.ts +25 -0
  90. package/dist/utils/fs-utils.d.ts.map +1 -0
  91. package/dist/utils/index.d.ts +9 -0
  92. package/dist/utils/index.d.ts.map +1 -0
  93. package/dist/utils/path-utils.d.ts +8 -0
  94. package/dist/utils/path-utils.d.ts.map +1 -0
  95. package/dist/utils/string-utils.d.ts +16 -0
  96. package/dist/utils/string-utils.d.ts.map +1 -0
  97. package/dist/workflows/record-and-generate.d.ts +158 -0
  98. package/dist/workflows/record-and-generate.d.ts.map +1 -0
  99. package/package.json +14 -22
  100. package/bin/smart-test.js +0 -15
  101. package/dist/cli/index.d.ts +0 -10
  102. package/dist/cli/index.d.ts.map +0 -1
  103. package/dist/cli/index.js +0 -2016
  104. package/dist/config/config-loader.d.ts +0 -35
  105. package/dist/config/config-loader.d.ts.map +0 -1
  106. package/dist/config/config-schema.d.ts +0 -85
  107. package/dist/config/config-schema.d.ts.map +0 -1
  108. package/dist/core/ai-assistant.d.ts +0 -29
  109. package/dist/core/ai-assistant.d.ts.map +0 -1
  110. package/dist/core/types.d.ts +0 -81
  111. package/dist/core/types.d.ts.map +0 -1
  112. package/dist/index.esm.js +0 -212
  113. package/dist/recorder/har-converter.d.ts +0 -47
  114. package/dist/recorder/har-converter.d.ts.map +0 -1
  115. package/dist/recorder/interactive-guide.d.ts +0 -67
  116. package/dist/recorder/interactive-guide.d.ts.map +0 -1
  117. package/dist/recorder/network-recorder.d.ts +0 -44
  118. package/dist/recorder/network-recorder.d.ts.map +0 -1
  119. package/dist/recorder/pom-generator.d.ts +0 -64
  120. package/dist/recorder/pom-generator.d.ts.map +0 -1
  121. package/dist/recorder/test-generator.d.ts +0 -35
  122. package/dist/recorder/test-generator.d.ts.map +0 -1
  123. package/dist/recorder/types.d.ts +0 -130
  124. package/dist/recorder/types.d.ts.map +0 -1
  125. package/dist/utils/error-handler.d.ts +0 -41
  126. package/dist/utils/error-handler.d.ts.map +0 -1
  127. package/dist/utils/logger.d.ts +0 -88
  128. package/dist/utils/logger.d.ts.map +0 -1
  129. package/dist/utils/screenshot.d.ts +0 -8
  130. package/dist/utils/screenshot.d.ts.map +0 -1
package/README.md CHANGED
@@ -1,524 +1,301 @@
1
1
  # @be-link/smart-test
2
2
 
3
- > AI-powered visual testing for Playwright - 基于 AI 视觉模型的 Playwright 测试工具
3
+ AI-powered test recorder for Playwright | 基于 AI Playwright 测试录制工具
4
4
 
5
- 使用 AI 视觉识别能力,让你的 E2E 测试更智能、更可靠。
5
+ ## 特性
6
6
 
7
- ## 特性
7
+ - **交互式录制**:打开浏览器,手动操作页面,自动记录用户行为和 API 请求
8
+ - **预设模式录制**:通过配置文件定义测试场景,批量执行录制
9
+ - **AI 生成 Mock**:基于录制的 API 请求,AI 自动生成类型安全的 Mock 函数
10
+ - **AI 生成测试**:基于录制的操作步骤,AI 自动生成 Midscene 测试用例
11
+ - **TypeScript 支持**:完整的类型定义,生成的代码开箱即用
8
12
 
9
- ### 🤖 AI 视觉检查
10
-
11
- - 基于通义千问等视觉模型,智能检查页面是否符合预期
12
- - 支持自然语言描述测试预期
13
- - 自动识别页面问题并给出详细反馈
14
-
15
- ### 🎯 零代码测试生成(开发中)
16
-
17
- - **CLI 工具**:一条命令自动生成测试代码
18
- - **录制模式**:访问页面自动录制接口和交互
19
- - **代码分析**:扫描项目代码自动生成 Mock 数据
20
- - **AI 生成**:基于自然语言描述生成完整测试
21
-
22
- ### 🔧 灵活易用
23
-
24
- - 与 Playwright 无缝集成,零侵入设计
25
- - 支持全局配置和单次调用配置
26
- - 优雅降级:无 API Key 时自动跳过
27
- - 完整的 TypeScript 类型支持
28
-
29
- ### 📸 自动化
30
-
31
- - 自动截图并保存
32
- - 自动生成 Mock 数据
33
- - 自动生成测试用例
34
-
35
- ## 📦 安装
13
+ ## 安装
36
14
 
37
15
  ```bash
38
- # 使用 pnpm(推荐)
16
+ # 安装 smart-test
39
17
  pnpm add -D @be-link/smart-test
40
18
 
41
- # 使用 npm
42
- npm install -D @be-link/smart-test
43
-
44
- # 使用 yarn
45
- yarn add -D @be-link/smart-test
19
+ # 安装必需的依赖
20
+ pnpm add -D @midscene/web playwright @playwright/test dotenv tsx
46
21
  ```
47
22
 
48
- ## 🚀 快速开始
49
-
50
- ### 方式一:使用 CLI 工具(推荐)⭐
23
+ ## 快速开始
51
24
 
52
- #### 1. 初始化配置
25
+ ### 1. 初始化配置
53
26
 
54
27
  ```bash
55
28
  npx smart-test init
56
29
  ```
57
30
 
58
- 交互式配置向导会引导你完成设置:
59
-
60
- ```
61
- ━━━ 初始化 Smart Test 配置 ━━━
31
+ 这会在项目中生成:
62
32
 
63
- ? 请输入 AI API Key: sk-xxxxx
64
- ? 选择 AI 模型: 通义千问 (qwen3-vl-plus)
65
- ? 测试文件目录: ./tests/e2e
66
- ? Helpers 目录: ./tests/helpers
67
- ? Playwright Base URL: http://localhost:8080
68
- ? 文件命名风格: kebab-case
33
+ - `tests/smart-test.config.ts` - Smart Test 配置
34
+ - `playwright.config.ts` - Playwright 配置
35
+ - `tests/e2e/` - 测试文件目录
36
+ - `tests/mock/` - Mock 文件目录
69
37
 
70
- 配置文件已创建: .smarttestrc.json
71
- ```
38
+ ### 2. 配置环境变量
72
39
 
73
- #### 2. 生成测试代码(开发中)
40
+ 在项目根目录创建 `.env` 文件,配置 Midscene AI 相关的环境变量:
74
41
 
75
42
  ```bash
76
- # 录制模式 - 访问页面自动录制
77
- npx smart-test record --url http://localhost:8080/coupon
78
-
79
- # 代码分析模式 - 扫描页面代码
80
- npx smart-test generate --page src/pages/coupon/index.tsx
43
+ # AI 模型 API 地址
44
+ MIDSCENE_MODEL_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
81
45
 
82
- # 描述生成模式 - 基于自然语言
83
- npx smart-test generate --desc "优惠券列表页,有可用券和已用券两个 tab"
84
-
85
- # 交互式模式 - 引导式生成
86
- npx smart-test generate --interactive
87
- ```
46
+ # AI 模型 API 密钥
47
+ MIDSCENE_MODEL_API_KEY=your_api_key
88
48
 
89
- #### 3. 运行测试
49
+ # AI 模型名称
50
+ MIDSCENE_MODEL_NAME=qwen-vl-max-latest
90
51
 
91
- ```bash
92
- npx playwright test
52
+ # AI 模型家族(可选,根据模型提供商设置)
53
+ MIDSCENE_MODEL_FAMILY=qwen-vl
93
54
  ```
94
55
 
95
- ---
56
+ > 💡 Smart Test 和 Midscene 共用相同的环境变量,无需重复配置
96
57
 
97
- ### 方式二:手动编程
58
+ ### 3. 开始录制
98
59
 
99
- #### 1. 配置 API Key
60
+ #### 方式一:预设模式录制(推荐)
100
61
 
101
- 在项目根目录创建 `.env` 文件:
62
+ 先创建预设配置:
102
63
 
103
64
  ```bash
104
- AI_API_KEY=sk-your-api-key-here
105
- ```
106
-
107
- #### 2. 初始化配置
108
-
109
- 在 `playwright.config.ts` 中配置:
110
-
111
- ```typescript
112
- import { defineConfig } from '@playwright/test';
113
- import { configure } from '@be-link/smart-test';
114
-
115
- // 初始化 AI 配置
116
- configure({
117
- apiKey: process.env.AI_API_KEY,
118
- screenshotDir: './test-results/ai-screenshots',
119
- });
120
-
121
- export default defineConfig({
122
- // ... 其他 Playwright 配置
123
- });
65
+ npx smart-test preset
124
66
  ```
125
67
 
126
- #### 3. 在测试中使用
68
+ 编辑生成的 `*.preset.ts` 文件:
127
69
 
128
70
  ```typescript
129
- import { test, expect } from '@playwright/test';
130
- import { aiReviewScreenshot } from '@be-link/smart-test';
131
-
132
- test.describe('优惠券页面', () => {
133
- test('AI 检查页面布局', async ({ page }) => {
134
- await page.goto('/coupon');
135
-
136
- // 使用 AI 检查页面
137
- const result = await aiReviewScreenshot(page, '页面应该显示优惠券列表,包含标题、优惠券卡片和底部按钮');
138
-
139
- // 处理结果
140
- if (result.skipped) {
141
- test.skip(); // 无 API Key 时跳过
142
- }
71
+ import type { RecordingPreset } from '@be-link/smart-test';
72
+
73
+ const preset: RecordingPreset = {
74
+ pageUrl: 'http://localhost:8080/login',
75
+ caseName: 'user-login',
76
+ testCases: [
77
+ {
78
+ name: '用户登录成功',
79
+ steps: ['输入用户名 testuser', '输入密码 123456', '点击登录按钮'],
80
+ expected: '跳转到首页,显示欢迎信息',
81
+ },
82
+ ],
83
+ viewport: 'mobile-ios',
84
+ headless: false,
85
+ };
143
86
 
144
- expect(result.ok, result.issues?.join(', ')).toBeTruthy();
145
- });
146
- });
87
+ export default preset;
147
88
  ```
148
89
 
149
- ## 📖 CLI 命令参考
150
-
151
- ### `smart-test init`
152
-
153
- 初始化配置文件,交互式设置 AI API Key、模型、输出目录等。
90
+ 然后执行录制:
154
91
 
155
92
  ```bash
156
- smart-test init
93
+ npx smart-test run login.preset.ts
157
94
  ```
158
95
 
159
- ### `smart-test generate` (开发中)
160
-
161
- 生成测试代码。
96
+ #### 方式二:交互式录制
162
97
 
163
98
  ```bash
164
- # 基础用法
165
- smart-test generate
166
-
167
- # 指定页面(代码分析模式)
168
- smart-test generate --page <path>
169
-
170
- # 指定 URL(录制模式)
171
- smart-test generate --url <url>
172
-
173
- # 基于描述(自然语言模式)
174
- smart-test generate --desc <description>
175
-
176
- # 交互式模式
177
- smart-test generate --interactive
178
-
179
- # 指定输出目录
180
- smart-test generate --page <path> --output tests/custom
181
-
182
- # 预览模式(不写入文件)
183
- smart-test generate --page <path> --dry-run
99
+ npx smart-test record
184
100
  ```
185
101
 
186
- **选项:**
102
+ 按照提示输入:
187
103
 
188
- | 选项 | 简写 | 说明 |
189
- | ---------------------- | ---- | ---------------------------- |
190
- | `--page <path>` | `-p` | 页面文件路径(代码分析模式) |
191
- | `--url <url>` | `-u` | 页面 URL(录制模式) |
192
- | `--desc <description>` | `-d` | 页面描述(自然语言模式) |
193
- | `--output <dir>` | `-o` | 输出目录 |
194
- | `--interactive` | `-i` | 交互式模式 |
195
- | `--dry-run` | | 预览模式,不写入文件 |
104
+ 1. 页面 URL
105
+ 2. 测试用例名称
106
+ 3. 测试场景描述
107
+ 4. 视口尺寸
196
108
 
197
- ### `smart-test record` (开发中)
198
-
199
- 录制模式的快捷命令(`generate --url` 的别名)。
109
+ ### 4. 运行测试
200
110
 
201
111
  ```bash
202
- # 基础录制
203
- smart-test record --url http://localhost:8080/coupon
204
-
205
- # 手动操作模式
206
- smart-test record --url http://localhost:8080/coupon --manual
207
-
208
- # 交互式引导
209
- smart-test record --url http://localhost:8080/coupon --interactive
112
+ npx playwright test
210
113
  ```
211
114
 
212
- **选项:**
213
-
214
- | 选项 | 简写 | 说明 |
215
- | ---------------- | ---- | ------------------------ |
216
- | `--url <url>` | `-u` | 要录制的页面 URL(必需) |
217
- | `--output <dir>` | `-o` | 输出目录 |
218
- | `--manual` | | 手动操作模式 |
219
- | `--interactive` | | 交互式引导 |
220
-
221
- ### `smart-test config`
115
+ ## 生成的文件
222
116
 
223
- 查看当前配置。
117
+ 录制完成后,会在 `tests/` 目录生成:
224
118
 
225
- ```bash
226
- smart-test config
227
119
  ```
228
-
229
- ### 全局选项
230
-
231
- | 选项 | 简写 | 说明 |
232
- | ----------- | ---- | -------------------- |
233
- | `--version` | `-V` | 显示版本号 |
234
- | `--verbose` | `-v` | 详细输出(调试模式) |
235
- | `--help` | `-h` | 显示帮助信息 |
236
-
237
- ## 📖 编程 API 文档
238
-
239
- ### `configure(config)`
240
-
241
- 配置全局设置。
242
-
243
- ```typescript
244
- import { configure } from '@be-link/smart-test';
245
-
246
- configure({
247
- apiKey: 'sk-xxx', // AI API 密钥
248
- baseURL: 'https://...', // AI 服务地址(可选)
249
- model: 'qwen3-vl-plus', // AI 模型(可选)
250
- timeout: 30000, // 超时时间(可选)
251
- });
120
+ tests/
121
+ ├── e2e/
122
+ │ └── {caseName}.spec.ts # Midscene 测试用例
123
+ ├── mock/
124
+ │ └── {caseName}.mock.ts # Mock 函数
125
+ └── smart-test.config.ts # 配置文件
252
126
  ```
253
127
 
254
- ### `aiReviewScreenshot(page, options)`
255
-
256
- 使用 AI 检查页面截图。
257
-
258
- **参数:**
259
-
260
- - `page: Page` - Playwright Page 对象
261
- - `options: string | AiCheckOptions` - 检查选项
262
-
263
- **返回值:** `Promise<AiCheckResult>`
128
+ ### Mock 文件示例
264
129
 
265
130
  ```typescript
266
- interface AiCheckResult {
267
- ok: boolean; // 检查是否通过
268
- issues?: string[]; // 问题列表
269
- skipped?: boolean; // 是否跳过
270
- reason?: string; // 跳过原因
271
- screenshotPath?: string; // 截图路径
272
- rawResponse?: string; // AI 原始响应
131
+ /**
132
+ * 自动生成的 Mock 文件
133
+ * @generated by @be-link/smart-test
134
+ */
135
+ import type { Page } from '@playwright/test';
136
+
137
+ export async function mockUserLoginApis(page: Page): Promise<void> {
138
+ await page.route('**/api/user/login', async (route) => {
139
+ await route.fulfill({
140
+ status: 200,
141
+ contentType: 'application/json',
142
+ body: JSON.stringify({
143
+ code: 0,
144
+ data: { token: 'xxx', userId: '123' },
145
+ }),
146
+ });
147
+ });
273
148
  }
274
149
  ```
275
150
 
276
- ## 🎨 使用示例
277
-
278
- ### 基础用法
279
-
280
- ```typescript
281
- // 简单字符串描述
282
- const result = await aiReviewScreenshot(page, '页面应该显示登录表单');
283
- ```
284
-
285
- ### 带配置的用法
151
+ ### 测试文件示例
286
152
 
287
153
  ```typescript
288
- // 带配置对象
289
- const result = await aiReviewScreenshot(page, {
290
- expected: '页面应该显示商品列表',
291
- model: 'gpt-4-vision-preview', // 使用其他模型
292
- });
293
- ```
154
+ /**
155
+ * 自动生成的测试文件
156
+ * @generated by @be-link/smart-test
157
+ */
158
+ import { expect, test } from '@playwright/test';
159
+ import { PlaywrightAgent } from '@midscene/web/playwright';
294
160
 
295
- ### 完整测试示例
161
+ import { mockUserLoginApis } from '../mock/user-login.mock';
296
162
 
297
- ```typescript
298
- import { test, expect } from '@playwright/test';
299
- import { aiReviewScreenshot } from '@be-link/smart-test';
163
+ test.describe('user-login', () => {
164
+ let agent: PlaywrightAgent;
300
165
 
301
- test.describe('商品页面测试', () => {
302
166
  test.beforeEach(async ({ page }) => {
303
- await page.goto('/products');
167
+ await mockUserLoginApis(page);
168
+ await page.goto('/login');
304
169
  await page.waitForLoadState('networkidle');
170
+ agent = new PlaywrightAgent(page);
305
171
  });
306
172
 
307
- test('检查页面布局', async ({ page }) => {
308
- const result = await aiReviewScreenshot(page, {
309
- expected: '页面顶部应有搜索框,中间显示商品网格布局,底部有分页器',
310
- fullPage: true,
311
- });
312
-
313
- if (result.skipped) {
314
- console.log('跳过原因:', result.reason);
315
- test.skip();
316
- }
317
-
318
- if (!result.ok && result.issues) {
319
- console.warn('发现的问题:', result.issues);
320
- }
321
-
322
- expect(result.ok, `AI 检查失败: ${result.issues?.join(', ')}`).toBeTruthy();
323
- });
324
-
325
- test('检查响应式布局', async ({ page }) => {
326
- // 切换到移动端视图
327
- await page.setViewportSize({ width: 375, height: 667 });
328
-
329
- const result = await aiReviewScreenshot(page, '移动端布局:商品应该以单列显示,每个卡片占满宽度');
330
-
331
- if (!result.skipped) {
332
- expect(result.ok).toBeTruthy();
333
- }
173
+ test('用户登录成功', async () => {
174
+ await agent.aiAction('输入用户名 testuser');
175
+ await agent.aiAction('输入密码 123456');
176
+ await agent.aiAction('点击登录按钮');
177
+ await agent.aiAssert('跳转到首页,显示欢迎信息');
334
178
  });
335
179
  });
336
180
  ```
337
181
 
338
- ## 🔧 配置文件
182
+ ## CLI 命令
339
183
 
340
- ### `.smarttestrc.json`
184
+ ### smart-test init
341
185
 
342
- 使用 `smart-test init` 命令生成的配置文件:
186
+ 初始化配置文件和目录结构。
343
187
 
344
- ```json
345
- {
346
- "version": "1.0.0",
347
- "ai": {
348
- "model": "qwen3-vl-plus",
349
- "apiKey": "${AI_API_KEY}",
350
- "baseURL": "https://dashscope.aliyuncs.com/compatible-mode/v1",
351
- "timeout": 30000
352
- },
353
- "output": {
354
- "testsDir": "./tests/e2e",
355
- "helpersDir": "./tests/helpers",
356
- "naming": "kebab-case"
357
- },
358
- "templates": {
359
- "mock": "default",
360
- "test": "default"
361
- },
362
- "playwright": {
363
- "baseURL": "http://localhost:8080",
364
- "viewport": {
365
- "width": 375,
366
- "height": 667
367
- },
368
- "browser": "chromium"
369
- }
370
- }
188
+ ```bash
189
+ npx smart-test init
371
190
  ```
372
191
 
373
- ### 支持的配置格式
374
-
375
- - `.smarttestrc.json`
376
- - `.smarttestrc.js`
377
- - `smarttest.config.js`
378
- - `package.json` 中的 `smarttest` 字段
192
+ ### smart-test preset
379
193
 
380
- ## 🔧 高级配置
194
+ 创建录制预设配置文件。
381
195
 
382
- ### 支持多种 AI 模型
383
-
384
- ```typescript
385
- // 使用通义千问(默认)
386
- configure({
387
- apiKey: process.env.QWEN_API_KEY,
388
- baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1',
389
- model: 'qwen3-vl-plus',
390
- });
391
-
392
- // 使用 OpenAI GPT-4 Vision
393
- configure({
394
- apiKey: process.env.OPENAI_API_KEY,
395
- baseURL: 'https://api.openai.com/v1',
396
- model: 'gpt-4-vision-preview',
397
- });
196
+ ```bash
197
+ npx smart-test preset [filename]
398
198
  ```
399
199
 
400
- ### 自定义截图存储
401
-
402
- ```typescript
403
- configure({
404
- screenshotDir: './custom-screenshots',
405
- saveScreenshots: true,
406
- });
407
-
408
- // 单次调用自定义
409
- const result = await aiReviewScreenshot(page, {
410
- expected: '...',
411
- screenshotPrefix: 'my-feature',
412
- screenshotDir: './feature-screenshots',
413
- });
414
- ```
200
+ ### smart-test run
415
201
 
416
- ### 在 CI 环境中使用
202
+ 使用预设配置执行录制。
417
203
 
418
- ```typescript
419
- // CI 中可能不需要保存截图,减少存储开销
420
- configure({
421
- apiKey: process.env.AI_API_KEY,
422
- saveScreenshots: process.env.CI !== 'true',
423
- });
204
+ ```bash
205
+ npx smart-test run <preset-file>
424
206
  ```
425
207
 
426
- ## 🤔 常见问题
427
-
428
- ### Q: 没有配置 API Key 会怎样?
208
+ ### smart-test record
429
209
 
430
- A: 测试会自动跳过 AI 检查,返回 `skipped: true`,不会影响其他测试的执行。
210
+ 启动交互式录制模式。
431
211
 
432
- ### Q: 支持哪些 AI 模型?
433
-
434
- A: 理论上支持所有兼容 OpenAI Chat Completions API 的视觉模型,包括:
435
-
436
- - 通义千问 (qwen3-vl-plus) - 默认
437
- - OpenAI GPT-4 Vision
438
- - 其他兼容的模型服务
439
-
440
- ### Q: CLI 生成的测试代码需要手动修改吗?
212
+ ```bash
213
+ npx smart-test record
214
+ ```
441
215
 
442
- A: 生成的代码是可以直接运行的,但建议根据实际需求进行调整。AI 会尽量生成合理的测试用例,但可能无法覆盖所有业务场景。
216
+ ## 配置文件
443
217
 
444
- ### Q: 录制模式如何处理需要点击才能触发的接口?
218
+ ### smart-test.config.ts
445
219
 
446
- A: 录制模式支持三种方式:
220
+ ```typescript
221
+ import type { SmartTestConfig } from '@be-link/smart-test';
447
222
 
448
- 1. **手动操作**:`--manual` 参数,用户手动操作浏览器
449
- 2. **交互式引导**:`--interactive` 参数,AI 引导用户操作
450
- 3. **脚本引导**:`--actions` 参数,提供操作脚本自动执行
223
+ const config: SmartTestConfig = {
224
+ ai: {
225
+ // AI 模型配置(API Key 和 Base URL 从环境变量读取)
226
+ codeModel: 'qwen3-coder-plus',
227
+ },
228
+ recording: {
229
+ // 测试文件输出目录
230
+ testDir: 'tests/e2e',
231
+ // Mock 文件输出目录
232
+ mockDir: 'tests/mock',
233
+ // API 路径匹配模式
234
+ apiPathPattern: '**/c-bff/**',
235
+ // 排除的 API 路径
236
+ excludeApiPatterns: [],
237
+ },
238
+ };
451
239
 
452
- ### Q: 如何查看 AI 的原始响应?
240
+ export default config;
241
+ ```
453
242
 
454
- A: 检查结果中的 `rawResponse` 字段包含了 AI 的原始响应内容。
243
+ ### 预设配置 (\*.preset.ts)
455
244
 
456
245
  ```typescript
457
- const result = await aiReviewScreenshot(page, '...');
458
- console.log('AI 原始响应:', result.rawResponse);
246
+ import type { RecordingPreset } from '@be-link/smart-test';
247
+
248
+ const preset: RecordingPreset = {
249
+ // 要测试的页面 URL
250
+ pageUrl: 'http://localhost:8080/page',
251
+ // 测试用例名称(用于文件命名)
252
+ caseName: 'test-case',
253
+ // 测试场景列表
254
+ testCases: [
255
+ {
256
+ name: '场景名称',
257
+ steps: ['步骤1', '步骤2'],
258
+ expected: '预期结果',
259
+ },
260
+ ],
261
+ // 子目录(可选)
262
+ subDir: '',
263
+ // 视口尺寸:'mobile-ios' | 'mobile-android' | 'tablet' | 'desktop' | 'desktop-wide'
264
+ viewport: 'mobile-ios',
265
+ // 是否使用无头模式
266
+ headless: false,
267
+ };
268
+
269
+ export default preset;
459
270
  ```
460
271
 
461
- ### Q: 生成的代码文件如何组织?
462
-
463
- A: 默认按页面分组:
464
-
465
- - `tests/helpers/mock-{页面名}.ts` - Mock 数据
466
- - `tests/e2e/{页面名}.spec.ts` - 测试用例
467
-
468
- 可以通过 `--output` 参数自定义输出目录。
469
-
470
- ## 🗺️ 开发路线图
471
-
472
- ### ✅ 已完成
473
-
474
- - [x] AI 视觉检查核心功能
475
- - [x] CLI 基础架构
476
- - [x] 配置系统
477
- - [x] 交互式初始化
272
+ ## 环境变量
478
273
 
479
- ### 🚧 开发中
274
+ | 变量名 | 说明 | 必填 |
275
+ | ------------------------- | ---------------- | ---- |
276
+ | `MIDSCENE_MODEL_BASE_URL` | AI 模型 API 地址 | 是 |
277
+ | `MIDSCENE_MODEL_API_KEY` | AI 模型 API 密钥 | 是 |
278
+ | `MIDSCENE_MODEL_NAME` | AI 模型名称 | 是 |
279
+ | `MIDSCENE_MODEL_FAMILY` | AI 模型家族 | 否 |
480
280
 
481
- - [ ] 录制模式(Phase 2)
482
- - [ ] 网络请求录制
483
- - [ ] HAR 文件解析
484
- - [ ] AI 生成 Mock 代码
485
- - [ ] 交互操作录制
281
+ ## 依赖说明
486
282
 
487
- ### 📅 计划中
283
+ | 依赖 | 说明 |
284
+ | ------------------ | ----------------------------- |
285
+ | `@midscene/web` | Midscene AI 驱动的 Web 测试库 |
286
+ | `playwright` | 浏览器自动化核心库 |
287
+ | `@playwright/test` | Playwright 测试框架 |
288
+ | `dotenv` | 环境变量加载 |
289
+ | `tsx` | TypeScript 执行器 |
488
290
 
489
- - [ ] 代码分析模式(Phase 3)
490
- - [ ] TypeScript AST 解析
491
- - [ ] API 调用提取
492
- - [ ] 类型定义分析
291
+ ## Midscene 配合
493
292
 
494
- - [ ] 描述生成模式(Phase 4)
495
- - [ ] 自然语言理解
496
- - [ ] 交互式问答
497
- - [ ] 代码生成
293
+ 生成的测试用例基于 [Midscene](https://midscenejs.com/) AI 驱动 API:
498
294
 
499
- - [ ] 增强功能(Phase 5+)
500
- - [ ] 增量更新
501
- - [ ] 自定义模板
502
- - [ ] 测试覆盖率分析
503
- - [ ] VS Code 插件
295
+ - `agent.aiAction()` - AI 驱动的页面操作
296
+ - `agent.aiQuery()` - AI 驱动的数据查询
297
+ - `agent.aiAssert()` - AI 驱动的断言
504
298
 
505
- ## 📄 文档
506
-
507
- - [CLI 设计文档](./docs/CLI_DESIGN.md) - 完整的 CLI 工具设计方案
508
- - [使用示例](./examples/) - 更多使用示例
509
-
510
- ## 📝 License
299
+ ## License
511
300
 
512
301
  MIT
513
-
514
- ## 🤝 贡献
515
-
516
- 欢迎提交 Issue 和 Pull Request!
517
-
518
- ## 📮 联系方式
519
-
520
- 如有问题,请在 [GitHub Issues](https://github.com/snowmountain-top/be-link/issues) 中提出。
521
-
522
- ---
523
-
524
- **版本**:v1.0.0 | **最后更新**:2025-12-30