@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.
- package/README.md +191 -414
- package/dist/bin/smart-test.d.ts +2 -0
- package/dist/bin/smart-test.d.ts.map +1 -0
- package/dist/bin/smart-test.js +23373 -0
- package/dist/cli/commands/generate.d.ts +5 -13
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/index.d.ts +5 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/init.d.ts +4 -2
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/preset.d.ts +5 -0
- package/dist/cli/commands/preset.d.ts.map +1 -0
- package/dist/cli/commands/record-only.d.ts +7 -0
- package/dist/cli/commands/record-only.d.ts.map +1 -0
- package/dist/cli/commands/record.d.ts +2 -3
- package/dist/cli/commands/record.d.ts.map +1 -1
- package/dist/cli/commands/run.d.ts +7 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/loaders/config-loader.d.ts +7 -0
- package/dist/cli/loaders/config-loader.d.ts.map +1 -0
- package/dist/cli/loaders/env-loader.d.ts +6 -0
- package/dist/cli/loaders/env-loader.d.ts.map +1 -0
- package/dist/cli/loaders/preset-loader.d.ts +33 -0
- package/dist/cli/loaders/preset-loader.d.ts.map +1 -0
- package/dist/cli/templates/playwright.config.template.ts +59 -0
- package/dist/cli/templates/recording-preset.template.ts +53 -0
- package/dist/cli/templates/smart-test.config.template.ts +42 -0
- package/dist/core/config.d.ts +18 -26
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/types/ai.types.d.ts +41 -0
- package/dist/core/types/ai.types.d.ts.map +1 -0
- package/dist/core/types/api.types.d.ts +34 -0
- package/dist/core/types/api.types.d.ts.map +1 -0
- package/dist/core/types/config.types.d.ts +41 -0
- package/dist/core/types/config.types.d.ts.map +1 -0
- package/dist/core/types/index.d.ts +8 -0
- package/dist/core/types/index.d.ts.map +1 -0
- package/dist/core/types/recorder.types.d.ts +204 -0
- package/dist/core/types/recorder.types.d.ts.map +1 -0
- package/dist/generators/base-generator.d.ts +37 -0
- package/dist/generators/base-generator.d.ts.map +1 -0
- package/dist/generators/index.d.ts +7 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/mock-generator.d.ts +30 -0
- package/dist/generators/mock-generator.d.ts.map +1 -0
- package/dist/generators/test-generator.d.ts +53 -0
- package/dist/generators/test-generator.d.ts.map +1 -0
- package/dist/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.esm.mjs +22201 -0
- package/dist/index.js +22167 -159
- package/dist/prompts/fragment-loader.d.ts +28 -0
- package/dist/prompts/fragment-loader.d.ts.map +1 -0
- package/dist/prompts/fragments/system/mock-generation-base.md +38 -0
- package/dist/prompts/fragments/system/mock-generation-example.md +199 -0
- package/dist/prompts/fragments/system/mock-generation-specs.md +148 -0
- package/dist/prompts/fragments/system/test-generation-api-reference.md +137 -0
- package/dist/prompts/fragments/system/test-generation-base.md +62 -0
- package/dist/prompts/fragments/system/test-generation-requirements.md +85 -0
- package/dist/prompts/fragments/user/test-generation-header.md +19 -0
- package/dist/prompts/fragments/user/test-generation-mock-hint.md +9 -0
- package/dist/prompts/fragments/user/test-generation-template.md +47 -0
- package/dist/prompts/index.d.ts +3 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/mock-generation.prompt.d.ts +23 -0
- package/dist/prompts/mock-generation.prompt.d.ts.map +1 -0
- package/dist/prompts/test-generation.prompt.d.ts +47 -0
- package/dist/prompts/test-generation.prompt.d.ts.map +1 -0
- package/dist/recorders/action-tracker.d.ts +42 -0
- package/dist/recorders/action-tracker.d.ts.map +1 -0
- package/dist/recorders/index.d.ts +8 -0
- package/dist/recorders/index.d.ts.map +1 -0
- package/dist/recorders/interactive-recorder.d.ts +61 -0
- package/dist/recorders/interactive-recorder.d.ts.map +1 -0
- package/dist/recorders/screenshot-manager.d.ts +23 -0
- package/dist/recorders/screenshot-manager.d.ts.map +1 -0
- package/dist/services/ai/ai-service.d.ts +36 -0
- package/dist/services/ai/ai-service.d.ts.map +1 -0
- package/dist/services/ai/index.d.ts +2 -0
- package/dist/services/ai/index.d.ts.map +1 -0
- package/dist/services/browser/api-interceptor.d.ts +44 -0
- package/dist/services/browser/api-interceptor.d.ts.map +1 -0
- package/dist/services/browser/index.d.ts +2 -0
- package/dist/services/browser/index.d.ts.map +1 -0
- package/dist/utils/data-compressor.d.ts +62 -0
- package/dist/utils/data-compressor.d.ts.map +1 -0
- package/dist/utils/file-writer.d.ts +13 -0
- package/dist/utils/file-writer.d.ts.map +1 -0
- package/dist/utils/fs-utils.d.ts +25 -0
- package/dist/utils/fs-utils.d.ts.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/path-utils.d.ts +8 -0
- package/dist/utils/path-utils.d.ts.map +1 -0
- package/dist/utils/string-utils.d.ts +16 -0
- package/dist/utils/string-utils.d.ts.map +1 -0
- package/dist/workflows/record-and-generate.d.ts +158 -0
- package/dist/workflows/record-and-generate.d.ts.map +1 -0
- package/package.json +14 -22
- package/bin/smart-test.js +0 -15
- package/dist/cli/index.d.ts +0 -10
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js +0 -2016
- package/dist/config/config-loader.d.ts +0 -35
- package/dist/config/config-loader.d.ts.map +0 -1
- package/dist/config/config-schema.d.ts +0 -85
- package/dist/config/config-schema.d.ts.map +0 -1
- package/dist/core/ai-assistant.d.ts +0 -29
- package/dist/core/ai-assistant.d.ts.map +0 -1
- package/dist/core/types.d.ts +0 -81
- package/dist/core/types.d.ts.map +0 -1
- package/dist/index.esm.js +0 -212
- package/dist/recorder/har-converter.d.ts +0 -47
- package/dist/recorder/har-converter.d.ts.map +0 -1
- package/dist/recorder/interactive-guide.d.ts +0 -67
- package/dist/recorder/interactive-guide.d.ts.map +0 -1
- package/dist/recorder/network-recorder.d.ts +0 -44
- package/dist/recorder/network-recorder.d.ts.map +0 -1
- package/dist/recorder/pom-generator.d.ts +0 -64
- package/dist/recorder/pom-generator.d.ts.map +0 -1
- package/dist/recorder/test-generator.d.ts +0 -35
- package/dist/recorder/test-generator.d.ts.map +0 -1
- package/dist/recorder/types.d.ts +0 -130
- package/dist/recorder/types.d.ts.map +0 -1
- package/dist/utils/error-handler.d.ts +0 -41
- package/dist/utils/error-handler.d.ts.map +0 -1
- package/dist/utils/logger.d.ts +0 -88
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/screenshot.d.ts +0 -8
- 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
|
-
|
|
3
|
+
AI-powered test recorder for Playwright | 基于 AI 的 Playwright 测试录制工具
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## 特性
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
- **交互式录制**:打开浏览器,手动操作页面,自动记录用户行为和 API 请求
|
|
8
|
+
- **预设模式录制**:通过配置文件定义测试场景,批量执行录制
|
|
9
|
+
- **AI 生成 Mock**:基于录制的 API 请求,AI 自动生成类型安全的 Mock 函数
|
|
10
|
+
- **AI 生成测试**:基于录制的操作步骤,AI 自动生成 Midscene 测试用例
|
|
11
|
+
- **TypeScript 支持**:完整的类型定义,生成的代码开箱即用
|
|
8
12
|
|
|
9
|
-
|
|
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
|
-
#
|
|
16
|
+
# 安装 smart-test
|
|
39
17
|
pnpm add -D @be-link/smart-test
|
|
40
18
|
|
|
41
|
-
#
|
|
42
|
-
|
|
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
|
-
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
|
|
71
|
-
```
|
|
38
|
+
### 2. 配置环境变量
|
|
72
39
|
|
|
73
|
-
|
|
40
|
+
在项目根目录创建 `.env` 文件,配置 Midscene AI 相关的环境变量:
|
|
74
41
|
|
|
75
42
|
```bash
|
|
76
|
-
#
|
|
77
|
-
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
# 交互式模式 - 引导式生成
|
|
86
|
-
npx smart-test generate --interactive
|
|
87
|
-
```
|
|
46
|
+
# AI 模型 API 密钥
|
|
47
|
+
MIDSCENE_MODEL_API_KEY=your_api_key
|
|
88
48
|
|
|
89
|
-
|
|
49
|
+
# AI 模型名称
|
|
50
|
+
MIDSCENE_MODEL_NAME=qwen-vl-max-latest
|
|
90
51
|
|
|
91
|
-
|
|
92
|
-
|
|
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
|
-
####
|
|
60
|
+
#### 方式一:预设模式录制(推荐)
|
|
100
61
|
|
|
101
|
-
|
|
62
|
+
先创建预设配置:
|
|
102
63
|
|
|
103
64
|
```bash
|
|
104
|
-
|
|
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
|
-
|
|
68
|
+
编辑生成的 `*.preset.ts` 文件:
|
|
127
69
|
|
|
128
70
|
```typescript
|
|
129
|
-
import {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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
|
-
|
|
145
|
-
});
|
|
146
|
-
});
|
|
87
|
+
export default preset;
|
|
147
88
|
```
|
|
148
89
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
### `smart-test init`
|
|
152
|
-
|
|
153
|
-
初始化配置文件,交互式设置 AI API Key、模型、输出目录等。
|
|
90
|
+
然后执行录制:
|
|
154
91
|
|
|
155
92
|
```bash
|
|
156
|
-
smart-test
|
|
93
|
+
npx smart-test run login.preset.ts
|
|
157
94
|
```
|
|
158
95
|
|
|
159
|
-
|
|
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
|
-
|
|
191
|
-
|
|
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
|
-
###
|
|
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
|
-
|
|
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
|
-
###
|
|
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
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
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
|
-
|
|
290
|
-
|
|
291
|
-
|
|
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
|
-
|
|
298
|
-
|
|
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
|
|
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('
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
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
|
-
###
|
|
184
|
+
### smart-test init
|
|
341
185
|
|
|
342
|
-
|
|
186
|
+
初始化配置文件和目录结构。
|
|
343
187
|
|
|
344
|
-
```
|
|
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
|
-
|
|
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
|
-
|
|
202
|
+
使用预设配置执行录制。
|
|
417
203
|
|
|
418
|
-
```
|
|
419
|
-
|
|
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
|
-
|
|
210
|
+
启动交互式录制模式。
|
|
431
211
|
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
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
|
-
|
|
216
|
+
## 配置文件
|
|
443
217
|
|
|
444
|
-
###
|
|
218
|
+
### smart-test.config.ts
|
|
445
219
|
|
|
446
|
-
|
|
220
|
+
```typescript
|
|
221
|
+
import type { SmartTestConfig } from '@be-link/smart-test';
|
|
447
222
|
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
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
|
-
|
|
240
|
+
export default config;
|
|
241
|
+
```
|
|
453
242
|
|
|
454
|
-
|
|
243
|
+
### 预设配置 (\*.preset.ts)
|
|
455
244
|
|
|
456
245
|
```typescript
|
|
457
|
-
|
|
458
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
490
|
-
- [ ] TypeScript AST 解析
|
|
491
|
-
- [ ] API 调用提取
|
|
492
|
-
- [ ] 类型定义分析
|
|
291
|
+
## 与 Midscene 配合
|
|
493
292
|
|
|
494
|
-
|
|
495
|
-
- [ ] 自然语言理解
|
|
496
|
-
- [ ] 交互式问答
|
|
497
|
-
- [ ] 代码生成
|
|
293
|
+
生成的测试用例基于 [Midscene](https://midscenejs.com/) 的 AI 驱动 API:
|
|
498
294
|
|
|
499
|
-
-
|
|
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
|