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

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.
@@ -1 +1 @@
1
- {"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/record.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA4JzE"}
1
+ {"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/record.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA6JzE"}
package/dist/cli/index.js CHANGED
@@ -321,11 +321,11 @@ async function initCommand() {
321
321
  name: 'naming',
322
322
  message: '文件命名风格:',
323
323
  choices: [
324
- { name: 'kebab-case (推荐)', value: 'kebab-case' },
324
+ { name: 'PascalCase (推荐)', value: 'PascalCase' },
325
325
  { name: 'camelCase', value: 'camelCase' },
326
- { name: 'snake_case', value: 'snake_case' },
326
+ { name: 'kebab-case', value: 'kebab-case' },
327
327
  ],
328
- default: 'kebab-case',
328
+ default: 'PascalCase',
329
329
  },
330
330
  ]);
331
331
  // 构建配置对象
@@ -384,7 +384,7 @@ const DEFAULT_CONFIG = {
384
384
  output: {
385
385
  testsDir: './tests/e2e',
386
386
  helpersDir: './tests/helpers',
387
- naming: 'kebab-case',
387
+ naming: 'PascalCase',
388
388
  },
389
389
  templates: {
390
390
  mock: 'default',
@@ -828,16 +828,26 @@ class HARConverter {
828
828
  }
829
829
  }
830
830
  /**
831
- * 生成 Mock 数据的 key
831
+ * 生成 Mock 数据的 key(使用 camelCase)
832
832
  */
833
833
  generateMockKey(apiPath, method) {
834
- // 将路径转换为驼峰命名
835
- // /api/user/info -> apiUserInfo
834
+ // 将路径转换为驼峰命名,并移除所有特殊字符
835
+ // /api/user-info -> apiUserInfo
836
+ // /product-detail -> productDetail
836
837
  const parts = apiPath
837
838
  .split('/')
838
839
  .filter((p) => p)
839
- .map((p, index) => (index === 0 ? p : p.charAt(0).toUpperCase() + p.slice(1)));
840
- return `${method.toLowerCase()}${parts.map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join('')}`;
840
+ .map((part) => {
841
+ // 移除特殊字符并转换为 PascalCase
842
+ return part
843
+ .split(/[-_\s]+/) // 按短横线、下划线、空格分割
844
+ .filter((word) => word) // 过滤空字符串
845
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
846
+ .join('');
847
+ });
848
+ // 拼接方法名和路径:getProductDetail
849
+ const pathPart = parts.join('');
850
+ return method.toLowerCase() + pathPart;
841
851
  }
842
852
  /**
843
853
  * 生成 Playwright Mock 代码
@@ -898,12 +908,22 @@ class HARConverter {
898
908
  capitalize(str) {
899
909
  return str.charAt(0).toUpperCase() + str.slice(1);
900
910
  }
911
+ /**
912
+ * 转换为 PascalCase
913
+ */
914
+ toPascalCase(str) {
915
+ return str
916
+ .split(/[-_\s]+/)
917
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
918
+ .join('');
919
+ }
901
920
  /**
902
921
  * 保存 Mock 代码
903
922
  */
904
923
  async saveMockCode(requests, outputPath, pageName) {
905
924
  const mockCode = this.generateMockCode(requests, pageName);
906
- const mockPath = path.join(outputPath, `mock-${pageName}.ts`);
925
+ const fileName = `Mock${this.toPascalCase(pageName)}.ts`;
926
+ const mockPath = path.join(outputPath, fileName);
907
927
  await fs.mkdir(outputPath, { recursive: true });
908
928
  await fs.writeFile(mockPath, mockCode, 'utf-8');
909
929
  logger.success(`Mock 代码已保存: ${mockPath}`);
@@ -987,13 +1007,36 @@ ${requestSummary}
987
1007
 
988
1008
  ## 要求
989
1009
  1. 使用 TypeScript 语法
990
- 2. 导入 Mock 函数: import { mock${this.capitalize(pageName)}Apis } from './${mockFileName}'
1010
+ 2. 导入必要的函数:
1011
+ - import { test, expect } from '@playwright/test'
1012
+ - import { aiReviewScreenshot } from '@be-link/smart-test'
1013
+ - import { mock${this.capitalize(pageName)}Apis } from './${mockFileName}'
991
1014
  3. 在测试开始前调用 Mock 函数
992
1015
  4. 包含基础的页面加载测试
993
- 5. 根据请求类型,生成合适的测试场景(如表单提交、数据加载等)
994
- 6. 使用 Playwright 的最佳实践
995
- 7. 包含有意义的断言
996
- 8. 代码简洁清晰,有适当的注释
1016
+ 5. 必须包含一个 AI 视觉识别测试用例,使用 aiReviewScreenshot 检查页面内容
1017
+ 6. 根据请求类型,生成合适的测试场景(如表单提交、数据加载等)
1018
+ 7. 使用 Playwright 的最佳实践
1019
+ 8. 包含有意义的断言
1020
+ 9. **所有注释必须使用中文**,代码简洁清晰
1021
+ 10. test.describe 和 test 的描述文本也使用中文
1022
+
1023
+ ## 示例格式
1024
+ \`\`\`typescript
1025
+ test.describe('产品详情页面测试', () => {
1026
+ test.beforeEach(async ({ page }) => {
1027
+ // 设置 Mock 数据
1028
+ await mockProductDetailApis(page);
1029
+ });
1030
+
1031
+ test('应该成功加载页面', async ({ page }) => {
1032
+ // 访问页面
1033
+ await page.goto('${url}');
1034
+
1035
+ // 验证页面加载
1036
+ await expect(page).toHaveURL('${url}');
1037
+ });
1038
+ });
1039
+ \`\`\`
997
1040
 
998
1041
  请直接返回测试代码,不需要额外的说明。
999
1042
  `;
@@ -1029,6 +1072,7 @@ ${requestSummary}
1029
1072
  generateBasicTest(url, pageName, mockFileName) {
1030
1073
  const capitalizedName = this.capitalize(pageName);
1031
1074
  return `import { test, expect } from '@playwright/test';
1075
+ import { aiReviewScreenshot } from '@be-link/smart-test';
1032
1076
  import { mock${capitalizedName}Apis } from './${mockFileName}';
1033
1077
 
1034
1078
  test.describe('${capitalizedName} 页面测试', () => {
@@ -1048,15 +1092,47 @@ test.describe('${capitalizedName} 页面测试', () => {
1048
1092
  await expect(page).toHaveURL('${url}');
1049
1093
  });
1050
1094
 
1095
+ test('AI 视觉识别 - 页面内容检查', async ({ page }) => {
1096
+ // 访问页面
1097
+ await page.goto('${url}');
1098
+
1099
+ // 等待页面加载
1100
+ await page.waitForLoadState('networkidle');
1101
+
1102
+ // 使用 AI 视觉识别检查页面内容
1103
+ const result = await aiReviewScreenshot(page, {
1104
+ expected: '页面应该正常显示,没有明显的布局错误或内容缺失',
1105
+ fullPage: true,
1106
+ });
1107
+
1108
+ // 如果没有配置 AI,跳过测试
1109
+ if (result.skipped) {
1110
+ test.skip();
1111
+ }
1112
+
1113
+ // 验证 AI 检查结果
1114
+ expect(result.ok, result.issues?.join(', ')).toBeTruthy();
1115
+ });
1116
+
1051
1117
  // TODO: 添加更多测试用例
1052
1118
  });
1053
1119
  `;
1054
1120
  }
1121
+ /**
1122
+ * 转换为 PascalCase
1123
+ */
1124
+ toPascalCase(str) {
1125
+ return str
1126
+ .split(/[-_\s]+/)
1127
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
1128
+ .join('');
1129
+ }
1055
1130
  /**
1056
1131
  * 保存测试文件
1057
1132
  */
1058
1133
  async saveTest(testCode, outputPath, pageName) {
1059
- const testPath = path.join(outputPath, `${pageName}.spec.ts`);
1134
+ const fileName = `${this.toPascalCase(pageName)}.spec.ts`;
1135
+ const testPath = path.join(outputPath, fileName);
1060
1136
  await fs.mkdir(outputPath, { recursive: true });
1061
1137
  await fs.writeFile(testPath, testCode, 'utf-8');
1062
1138
  logger.success(`测试文件已保存: ${testPath}`);
@@ -1375,11 +1451,21 @@ export class ${className} {
1375
1451
  })
1376
1452
  .join('');
1377
1453
  }
1454
+ /**
1455
+ * 转换为 PascalCase
1456
+ */
1457
+ toPascalCase(str) {
1458
+ return str
1459
+ .split(/[-_\s]+/)
1460
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
1461
+ .join('');
1462
+ }
1378
1463
  /**
1379
1464
  * 保存 POM 文件
1380
1465
  */
1381
1466
  async savePOM(pomCode, outputPath, pageName) {
1382
- const pomPath = path.join(outputPath, `${pageName}-page.po.ts`);
1467
+ const fileName = `${this.toPascalCase(pageName)}Page.ts`;
1468
+ const pomPath = path.join(outputPath, fileName);
1383
1469
  await fs.mkdir(outputPath, { recursive: true });
1384
1470
  await fs.writeFile(pomPath, pomCode, 'utf-8');
1385
1471
  logger.success(`POM 文件已保存: ${pomPath}`);
@@ -1829,12 +1915,13 @@ async function recordCommand(options) {
1829
1915
  const converter = new HARConverter();
1830
1916
  // 提取页面名称
1831
1917
  const pageName = extractPageName(recordOptions.url);
1832
- logger.debug(`页面名称: ${pageName}`);
1918
+ const pascalCaseName = toPascalCase(pageName);
1919
+ logger.debug(`页面名称: ${pageName} (PascalCase: ${pascalCaseName})`);
1833
1920
  // 保存 HAR 文件
1834
1921
  const outputDir = path.resolve(process.cwd(), recordOptions.output);
1835
1922
  await converter.saveHAR(validRequests, outputDir);
1836
1923
  // 生成并保存 Mock 代码
1837
- const mockFileName = `mock-${pageName}`;
1924
+ const mockFileName = `Mock${pascalCaseName}`;
1838
1925
  await converter.saveMockCode(validRequests, outputDir, pageName);
1839
1926
  logger.succeedSpinner('Mock 代码生成完成');
1840
1927
  // 生成测试用例
@@ -1857,14 +1944,14 @@ async function recordCommand(options) {
1857
1944
  logger.info('生成的文件:');
1858
1945
  logger.info(` 📄 ${path.join(outputDir, 'recorded.har')}`);
1859
1946
  logger.info(` 📄 ${path.join(outputDir, `${mockFileName}.ts`)}`);
1860
- logger.info(` 📄 ${path.join(outputDir, `${pageName}.spec.ts`)}`);
1861
- logger.info(` 📄 ${path.join(outputDir, `${pageName}-page.po.ts`)}`);
1947
+ logger.info(` 📄 ${path.join(outputDir, `${pascalCaseName}.spec.ts`)}`);
1948
+ logger.info(` 📄 ${path.join(outputDir, `${pascalCaseName}Page.ts`)}`);
1862
1949
  logger.newLine();
1863
1950
  logger.info('下一步:');
1864
1951
  logger.info(` 1. 查看生成的 Mock 代码: ${path.join(outputDir, `${mockFileName}.ts`)}`);
1865
- logger.info(` 2. 查看生成的测试用例: ${path.join(outputDir, `${pageName}.spec.ts`)}`);
1866
- logger.info(` 3. 查看生成的 POM 代码: ${path.join(outputDir, `${pageName}-page.po.ts`)}`);
1867
- logger.info(` 4. 运行测试: npx playwright test ${path.join(outputDir, `${pageName}.spec.ts`)}`);
1952
+ logger.info(` 2. 查看生成的测试用例: ${path.join(outputDir, `${pascalCaseName}.spec.ts`)}`);
1953
+ logger.info(` 3. 查看生成的 POM 代码: ${path.join(outputDir, `${pascalCaseName}Page.ts`)}`);
1954
+ logger.info(` 4. 运行测试: npx playwright test ${path.join(outputDir, `${pascalCaseName}.spec.ts`)}`);
1868
1955
  logger.newLine();
1869
1956
  }
1870
1957
  catch (error) {
@@ -1893,6 +1980,19 @@ function extractPageName(url) {
1893
1980
  return 'page';
1894
1981
  }
1895
1982
  }
1983
+ /**
1984
+ * 将字符串转换为 PascalCase 格式
1985
+ * @example
1986
+ * toPascalCase('user-profile') // 'UserProfile'
1987
+ * toPascalCase('my_page') // 'MyPage'
1988
+ * toPascalCase('login') // 'Login'
1989
+ */
1990
+ function toPascalCase(str) {
1991
+ return str
1992
+ .split(/[-_\s]+/) // 按短横线、下划线、空格分割
1993
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
1994
+ .join('');
1995
+ }
1896
1996
 
1897
1997
  /**
1898
1998
  * 生成命令
@@ -42,7 +42,7 @@ export interface SmartTestConfig {
42
42
  /**
43
43
  * 文件命名风格
44
44
  */
45
- naming?: 'camelCase' | 'kebab-case' | 'snake_case';
45
+ naming?: 'PascalCase' | 'camelCase' | 'kebab-case' | 'snake_case';
46
46
  };
47
47
  /**
48
48
  * 模板配置
@@ -1 +1 @@
1
- {"version":3,"file":"config-schema.d.ts","sourceRoot":"","sources":["../../src/config/config-schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,EAAE,CAAC,EAAE;QACH;;WAEG;QACH,KAAK,CAAC,EAAE,MAAM,CAAC;QAEf;;WAEG;QACH,MAAM,CAAC,EAAE,MAAM,CAAC;QAEhB;;WAEG;QACH,OAAO,CAAC,EAAE,MAAM,CAAC;QAEjB;;WAEG;QACH,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IAEF;;OAEG;IACH,MAAM,CAAC,EAAE;QACP;;WAEG;QACH,QAAQ,CAAC,EAAE,MAAM,CAAC;QAElB;;WAEG;QACH,UAAU,CAAC,EAAE,MAAM,CAAC;QAEpB;;WAEG;QACH,MAAM,CAAC,EAAE,WAAW,GAAG,YAAY,GAAG,YAAY,CAAC;KACpD,CAAC;IAEF;;OAEG;IACH,SAAS,CAAC,EAAE;QACV;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,CAAC;QAEd;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IAEF;;OAEG;IACH,UAAU,CAAC,EAAE;QACX;;WAEG;QACH,OAAO,CAAC,EAAE,MAAM,CAAC;QAEjB;;WAEG;QACH,QAAQ,CAAC,EAAE;YACT,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;QAEF;;WAEG;QACH,OAAO,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;KAC7C,CAAC;CACH;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,eAwB5B,CAAC"}
1
+ {"version":3,"file":"config-schema.d.ts","sourceRoot":"","sources":["../../src/config/config-schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,EAAE,CAAC,EAAE;QACH;;WAEG;QACH,KAAK,CAAC,EAAE,MAAM,CAAC;QAEf;;WAEG;QACH,MAAM,CAAC,EAAE,MAAM,CAAC;QAEhB;;WAEG;QACH,OAAO,CAAC,EAAE,MAAM,CAAC;QAEjB;;WAEG;QACH,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IAEF;;OAEG;IACH,MAAM,CAAC,EAAE;QACP;;WAEG;QACH,QAAQ,CAAC,EAAE,MAAM,CAAC;QAElB;;WAEG;QACH,UAAU,CAAC,EAAE,MAAM,CAAC;QAEpB;;WAEG;QACH,MAAM,CAAC,EAAE,YAAY,GAAG,WAAW,GAAG,YAAY,GAAG,YAAY,CAAC;KACnE,CAAC;IAEF;;OAEG;IACH,SAAS,CAAC,EAAE;QACV;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,CAAC;QAEd;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IAEF;;OAEG;IACH,UAAU,CAAC,EAAE;QACX;;WAEG;QACH,OAAO,CAAC,EAAE,MAAM,CAAC;QAEjB;;WAEG;QACH,QAAQ,CAAC,EAAE;YACT,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;QAEF;;WAEG;QACH,OAAO,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;KAC7C,CAAC;CACH;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,eAwB5B,CAAC"}
@@ -24,7 +24,7 @@ export declare class HARConverter {
24
24
  */
25
25
  private extractApiPath;
26
26
  /**
27
- * 生成 Mock 数据的 key
27
+ * 生成 Mock 数据的 key(使用 camelCase)
28
28
  */
29
29
  private generateMockKey;
30
30
  /**
@@ -39,6 +39,10 @@ export declare class HARConverter {
39
39
  * 首字母大写
40
40
  */
41
41
  private capitalize;
42
+ /**
43
+ * 转换为 PascalCase
44
+ */
45
+ private toPascalCase;
42
46
  /**
43
47
  * 保存 Mock 代码
44
48
  */
@@ -1 +1 @@
1
- {"version":3,"file":"har-converter.d.ts","sourceRoot":"","sources":["../../src/recorder/har-converter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAY,MAAM,SAAS,CAAC;AAGjE;;GAEG;AACH,qBAAa,YAAY;IACvB;;OAEG;IACH,KAAK,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,OAAO;IAiB1C;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA8BzB;;OAEG;IACG,OAAO,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAW9E;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAyCjE;;OAEG;IACH,OAAO,CAAC,cAAc;IAStB;;OAEG;IACH,OAAO,CAAC,eAAe;IAWvB;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IA2CtE;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAe1B;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAUtG"}
1
+ {"version":3,"file":"har-converter.d.ts","sourceRoot":"","sources":["../../src/recorder/har-converter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAY,MAAM,SAAS,CAAC;AAGjE;;GAEG;AACH,qBAAa,YAAY;IACvB;;OAEG;IACH,KAAK,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,OAAO;IAiB1C;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA8BzB;;OAEG;IACG,OAAO,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAW9E;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAyCjE;;OAEG;IACH,OAAO,CAAC,cAAc;IAStB;;OAEG;IACH,OAAO,CAAC,eAAe;IAqBvB;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IA2CtE;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAe1B;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACH,OAAO,CAAC,YAAY;IAOpB;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAWtG"}
@@ -52,6 +52,10 @@ export declare class POMGenerator {
52
52
  * 将描述转换为属性名
53
53
  */
54
54
  private toPropertyName;
55
+ /**
56
+ * 转换为 PascalCase
57
+ */
58
+ private toPascalCase;
55
59
  /**
56
60
  * 保存 POM 文件
57
61
  */
@@ -1 +1 @@
1
- {"version":3,"file":"pom-generator.d.ts","sourceRoot":"","sources":["../../src/recorder/pom-generator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAG7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/D;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;IAEpE;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEnC;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,qBAAa,YAAY;IAGX,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,MAAM,CAAuB;gBAEjB,MAAM,EAAE,eAAe;IAW3C;;OAEG;IACG,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA0IzD;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAiE9F;;OAEG;YACW,oBAAoB;IAqElC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA4BxB;;OAEG;IACH,OAAO,CAAC,cAAc;IAgBtB;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAUrF;;OAEG;IACH,OAAO,CAAC,UAAU;CAGnB"}
1
+ {"version":3,"file":"pom-generator.d.ts","sourceRoot":"","sources":["../../src/recorder/pom-generator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAG7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/D;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;IAEpE;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEnC;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,qBAAa,YAAY;IAGX,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,MAAM,CAAuB;gBAEjB,MAAM,EAAE,eAAe;IAW3C;;OAEG;IACG,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA0IzD;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAiE9F;;OAEG;YACW,oBAAoB;IAqElC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA4BxB;;OAEG;IACH,OAAO,CAAC,cAAc;IAgBtB;;OAEG;IACH,OAAO,CAAC,YAAY;IAOpB;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWrF;;OAEG;IACH,OAAO,CAAC,UAAU;CAGnB"}
@@ -23,6 +23,10 @@ export declare class TestGenerator {
23
23
  * 生成基础测试模板(不使用 AI)
24
24
  */
25
25
  private generateBasicTest;
26
+ /**
27
+ * 转换为 PascalCase
28
+ */
29
+ private toPascalCase;
26
30
  /**
27
31
  * 保存测试文件
28
32
  */
@@ -1 +1 @@
1
- {"version":3,"file":"test-generator.d.ts","sourceRoot":"","sources":["../../src/recorder/test-generator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/D;;GAEG;AACH,qBAAa,aAAa;IAGZ,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,MAAM,CAAuB;gBAEjB,MAAM,EAAE,eAAe;IAW3C;;OAEG;IACG,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA+CpH;;OAEG;IACH,OAAO,CAAC,WAAW;IA4BnB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA2BzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA4BzB;;OAEG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAUvF;;OAEG;IACH,OAAO,CAAC,UAAU;CAGnB"}
1
+ {"version":3,"file":"test-generator.d.ts","sourceRoot":"","sources":["../../src/recorder/test-generator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/D;;GAEG;AACH,qBAAa,aAAa;IAGZ,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,MAAM,CAAuB;gBAEjB,MAAM,EAAE,eAAe;IAW3C;;OAEG;IACG,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA+CpH;;OAEG;IACH,OAAO,CAAC,WAAW;IAmDnB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA2BzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmDzB;;OAEG;IACH,OAAO,CAAC,YAAY;IAOpB;;OAEG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWvF;;OAEG;IACH,OAAO,CAAC,UAAU;CAGnB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@be-link/smart-test",
3
- "version": "1.0.1-beta.3",
3
+ "version": "1.0.1-beta.5",
4
4
  "type": "module",
5
5
  "description": "AI-powered visual testing for Playwright - 基于 AI 视觉模型的 Playwright 测试工具",
6
6
  "homepage": "https://github.com/snowmountain-top/be-link",