ソースを参照

test(interface): 补记本轮 E2E 真实结果 51/3/3(首跑被沙箱 safe-delete 中断,已重跑取证)

E2E Test Bot 1 週間 前
親
コミット
ce9c8aa828
3 ファイル変更、142 行追加、21 行削除
  1. 10 1
      INTERFACE_TEST_REPORT.md
  2. 125 16
      playwright_smoke.log
  3. 7 4
      playwright_smoke_report.md

+ 10 - 1
INTERFACE_TEST_REPORT.md

@@ -14,12 +14,21 @@
 
 
 > 说明:冒烟为空体请求,部分 500/400 属预期(缺必填参数)。NOT_FOUND 与回归劣化才需优先处理。
 > 说明:冒烟为空体请求,部分 500/400 属预期(缺必填参数)。NOT_FOUND 与回归劣化才需优先处理。
 
 
+### CONN_ERR 明细(2)
+- `POST /api/user/portrait/generate`、`POST /api/user/portrait/regenerate` —— 冒烟客户端 `--timeout` 默认 10s 先超时;该两接口为长耗时 AI 端点(历史直连实测 9.7s~60s+,其中 generate 曾多次 504/60s)。**属测量口径 + 网关超时双层问题,非本轮新发劣化。**
+
+## Playwright E2E 冒烟(api 层)
+- 结果:**51 passed / 3 failed / 3 skipped**(首跑被沙箱 safe-delete 超时中断,已手工重跑取证)
+- 红用例 3 项均为已知存量缺口、无新增:TC-P-N02/X-N01 AI 教练 46003 会员门禁(测试口径)、TC-A-N05 后台未授权返 500 应 401/403、TC-P-N11 上传非 PDF 未拒绝。
+
+> 说明:冒烟为空体请求,部分 500/400 属预期(缺必填参数)。NOT_FOUND 与回归劣化才需优先处理。
+
 
 
 ## 测试用例完成情况
 ## 测试用例完成情况
 - 自动化用例总数(可执行 `test()`):**386**(api 层 55 / 角色分包 52 / DOM 层 279)
 - 自动化用例总数(可执行 `test()`):**386**(api 层 55 / 角色分包 52 / DOM 层 279)
 - 文档化用例(设计层 TC-xxxx):**219**
 - 文档化用例(设计层 TC-xxxx):**219**
 - 已完成(自动化且未被跳过):**361/386 = 93%**
 - 已完成(自动化且未被跳过):**361/386 = 93%**
-- 已实跑通过:接口冒烟 BIZ_OK **249** 端点 + API e2e 末次 **51** 通过 / 3 skipped(来源 playwright_smoke.log)
+- 已实跑通过:接口冒烟 BIZ_OK **249** 端点 + API e2e **51 通过 / 3 失败 / 3 跳过**(来源 playwright_smoke.log)
 
 
 ### 未完成 / 未开始的原因(共 3 类)
 ### 未完成 / 未开始的原因(共 3 类)
 1. [279 项] DOM 型 E2E 无法执行(CFC-ENV-001):279 个用例已编写,但远程 cfc.iwintrue.com 为纯 Spring Boot API 后端、未部署 uni-app H5 / cfc-web 前端,浏览器型用例无法运行,未开始执行。
 1. [279 项] DOM 型 E2E 无法执行(CFC-ENV-001):279 个用例已编写,但远程 cfc.iwintrue.com 为纯 Spring Boot API 后端、未部署 uni-app H5 / cfc-web 前端,浏览器型用例无法运行,未开始执行。

+ 125 - 16
playwright_smoke.log

@@ -1,17 +1,126 @@
-Error: [safe-delete] 操作失败: spawnSync D:\workbuddy\resources\vendor\genie-trash\win32-x64.exe ETIMEDOUT
-
-   at ..\..\..\workbuddy\resources\app.asar.unpacked\cli\vendor\shim\node-safe-delete-shim.cjs:300
-
-  298 |         // binary 已启动但对该路径操作失败(exit code 1)或超时——向上抛,不真删
-  299 |         const detail = e.stderr ? e.stderr.toString().trim() : '';
-> 300 |         throw new Error(`[safe-delete] 操作失败: ${detail || e.message}`);
-      |               ^
-  301 |     }
-  302 | }
-  303 |
-    at trashViaBinary (D:\workbuddy\resources\app.asar.unpacked\cli\vendor\shim\node-safe-delete-shim.cjs:300:15)
-    at trashItem (D:\workbuddy\resources\app.asar.unpacked\cli\vendor\shim\node-safe-delete-shim.cjs:313:9)
-    at tryTrash (D:\workbuddy\resources\app.asar.unpacked\cli\vendor\shim\node-safe-delete-shim.cjs:622:5)
-    at tryRm (D:\workbuddy\resources\app.asar.unpacked\cli\vendor\shim\node-safe-delete-shim.cjs:806:5)
-    at Object.wrappedPromisesRm (D:\workbuddy\resources\app.asar.unpacked\cli\vendor\shim\node-safe-delete-shim.cjs:850:15)
 
 
+Running 57 tests using 1 worker
+
+  ok  1 [desktop] › e2e\api\api-smoke.spec.js:18:3 › API级冒烟(远程后端) › 自注册链路可用(拿到有效 token) (22ms)
+  ok  2 [desktop] › e2e\api\api-smoke.spec.js:24:3 › API级冒烟(远程后端) › 家庭成员列表接口可调用 (code=200) (128ms)
+  ok  3 [desktop] › e2e\api\api-smoke.spec.js:30:3 › API级冒烟(远程后端) › 能量概览接口可调用 (code=200) (139ms)
+  ok  4 [desktop] › e2e\api\api-smoke.spec.js:36:3 › API级冒烟(远程后端) › 成员列表参数校验生效(越权家庭 → 403) (119ms)
+  ok  5 [desktop] › e2e\api\article-api.spec.js:26:3 › 【API级】文章管理全流程 › [场景1] 查看文章列表 - 期望返回文章列表 (55ms)
+  ok  6 [desktop] › e2e\api\article-api.spec.js:35:3 › 【API级】文章管理全流程 › [场景2] 文章分类 - 期望分类列表可用 (44ms)
+  ok  7 [desktop] › e2e\api\article-api.spec.js:43:3 › 【API级】文章管理全流程 › [场景3] 查看文章详情 - 期望返回文章内容 (170ms)
+  ok  8 [desktop] › e2e\api\article-api.spec.js:59:3 › 【API级】文章管理全流程 › [场景4] 我的文章 - 期望返回登录用户发布记录 (115ms)
+  ok  9 [desktop] › e2e\api\article-api.spec.js:67:3 › 【API级】文章管理全流程 › [场景5] 发布文章缺少标题 - 期望返回错误提示 (74ms)
+  ok 10 [desktop] › e2e\api\article-api.spec.js:73:3 › 【API级】文章管理全流程 › [场景5b] 精选文章 - 期望可获取 (37ms)
+  ok 11 [desktop] › e2e\api\article-api.spec.js:81:3 › 【API级】文章管理全流程 › [场景6] 家长角色发布文章 - 期望受权限/审核流程约束 (124ms)
+  ok 12 [desktop] › e2e\api\contact-api.spec.js:41:3 › 【API级】联系人管理全流程 › [场景1] 创建联系人 - 期望创建成功 (158ms)
+  ok 13 [desktop] › e2e\api\contact-api.spec.js:51:3 › 【API级】联系人管理全流程 › [场景2] 通讯录导入 - 期望导入成功 (182ms)
+  ok 14 [desktop] › e2e\api\contact-api.spec.js:64:3 › 【API级】联系人管理全流程 › [场景3] 记录互动 - 期望记录成功 (244ms)
+  ok 15 [desktop] › e2e\api\contact-api.spec.js:77:3 › 【API级】联系人管理全流程 › [场景4] 编辑联系人 - 期望更新成功 (266ms)
+  ok 16 [desktop] › e2e\api\contact-api.spec.js:88:3 › 【API级】联系人管理全流程 › [场景4b] 删除联系人 - 期望从列表中移除 (322ms)
+  ok 17 [desktop] › e2e\api\contact-api.spec.js:103:3 › 【API级】联系人管理全流程 › [场景5b] 越权操作他人联系人 - 期望被拒绝 (277ms)
+  ok 18 [desktop] › e2e\api\energy-api.spec.js:34:3 › 【API级】能量系统收支全流程 › [场景1] 获取家庭能量沙盘 - 期望返回五维能量数据 (78ms)
+  ok 19 [desktop] › e2e\api\energy-api.spec.js:41:3 › 【API级】能量系统收支全流程 › [场景1b] 未加入家庭/越权访问 - 期望返回错误提示 (61ms)
+  ok 20 [desktop] › e2e\api\energy-api.spec.js:53:3 › 【API级】能量系统收支全流程 › [场景2] 任务完成能量发放 - 期望能量增加且流水记录 (177ms)
+  ok 21 [desktop] › e2e\api\energy-api.spec.js:74:3 › 【API级】能量系统收支全流程 › [场景2b] 能量发放缺参 - 期望返回错误提示 (70ms)
+  ok 22 [desktop] › e2e\api\energy-api.spec.js:82:3 › 【API级】能量系统收支全流程 › [场景3] 能量兑换心愿 - 期望参数校验生效且未扣减能量 (175ms)
+  ok 23 [desktop] › e2e\api\energy-api.spec.js:106:3 › 【API级】能量系统收支全流程 › [场景4] 查询能量流水 - 期望返回分页记录 (97ms)
+  ok 24 [desktop] › e2e\api\energy-api.spec.js:116:3 › 【API级】能量系统收支全流程 › [场景5] 获取五维能量概览 - 期望返回五维汇总数据 (95ms)
+  ok 25 [desktop] › e2e\api\energy-api.spec.js:131:3 › 【API级】能量系统收支全流程 › [场景6] 完整能量收支流程 - 期望全流程成功 (221ms)
+  ok 26 [desktop] › e2e\api\family-member-api.spec.js:39:3 › 【API级】家庭成员管理全流程 › [场景1] 获取成员列表 - 期望返回成员数据 (82ms)
+  ok 27 [desktop] › e2e\api\family-member-api.spec.js:46:3 › 【API级】家庭成员管理全流程 › [场景1b] 越权访问他人家庭 - 期望 403 拒绝 (76ms)
+  ok 28 [desktop] › e2e\api\family-member-api.spec.js:54:3 › 【API级】家庭成员管理全流程 › [场景2] 添加新家庭成员 - 期望添加成功并返回完整信息 (16.9s)
+  ok 29 [desktop] › e2e\api\family-member-api.spec.js:63:3 › 【API级】家庭成员管理全流程 › [场景2b] 添加成员时昵称为空 - 期望返回错误提示 (113ms)
+  ok 30 [desktop] › e2e\api\family-member-api.spec.js:74:3 › 【API级】家庭成员管理全流程 › [场景2c] 添加成员时辈分等级为空 - 期望返回错误提示 (75ms)
+  ok 31 [desktop] › e2e\api\family-member-api.spec.js:85:3 › 【API级】家庭成员管理全流程 › [场景2d] 添加成员时辈分等级非法 - 期望返回错误提示 (82ms)
+  ok 32 [desktop] › e2e\api\family-member-api.spec.js:98:3 › 【API级】家庭成员管理全流程 › [场景3] 查看家庭成员列表 - 期望返回所有成员及关系信息 (1.7s)
+  -  33 [desktop] › e2e\api\family-member-api.spec.js:120:3 › 【API级】家庭成员管理全流程 › [场景4] 更新成员关系/昵称 - 期望更新成功并返回新信息
+  ok 34 [desktop] › e2e\api\family-member-api.spec.js:138:3 › 【API级】家庭成员管理全流程 › [场景4c] 已知缺陷复现 - nickname 未生效但 gender/birthday 生效 (1.7s)
+  ok 35 [desktop] › e2e\api\family-member-api.spec.js:158:3 › 【API级】家庭成员管理全流程 › [场景5] 切换到成员视角 - 期望返回切换凭证 (1.6s)
+  ok 36 [desktop] › e2e\api\family-member-api.spec.js:167:3 › 【API级】家庭成员管理全流程 › [场景5b] 切换到本人视角 - 期望返回错误提示 (1.2s)
+  ok 37 [desktop] › e2e\api\family-member-api.spec.js:179:3 › 【API级】家庭成员管理全流程 › [场景6] 移除家庭成员 - 期望成员从家庭中移除 (2.4s)
+  ok 38 [desktop] › e2e\api\family-member-api.spec.js:192:3 › 【API级】家庭成员管理全流程 › [场景6b] 非管理员尝试踢人 - 期望权限不足拒绝 (2.8s)
+  ok 39 [desktop] › e2e\api\family-member-api.spec.js:202:3 › 【API级】家庭成员管理全流程 › [场景7] 完整家庭成员管理流程 - 期望全流程成功 (2.3s)
+  ok 40 [desktop] › e2e\api\nonfunc-perf-compat.spec.js:56:1 › [TC-G-N03] 非微信H5兜底登录:手机号注册登录路径 UA 无关 (363ms)
+  ok 41 [desktop] › e2e\api\nonfunc-perf-compat.spec.js:63:1 › [TC-G-N02/P-N06/C-N03/T-N04/S-N03/X-N07] 多端 UA 兼容:同请求不同客户端返回一致 (510ms)
+[限流] 状态分布=[200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200] 其中429=0
+  ok 42 [desktop] › e2e\api\nonfunc-perf-compat.spec.js:79:1 › [TC-A-N04/X-N02] 限流熔断稳定性:爆发请求下系统不死(不出现 5xx 雪崩) (889ms)
+  x  43 [desktop] › e2e\api\nonfunc-perf-compat.spec.js:92:1 › [TC-P-N02/X-N01] 并发不串数据:并行 AI 请求各自独立响应 (386ms)
+[耗时] 家庭列表 83ms
+  ok 44 [desktop] › e2e\api\nonfunc-perf-compat.spec.js:106:1 › [响应时间基线] 已登录家庭列表单请求耗时冒烟 ≤ 8s (531ms)
+  -  45 [desktop] › e2e\api\nonfunc-perf-compat.spec.js:117:6 › [TC-C-N01/X-N04] 任务打卡幂等:重复提交不重复计分(需任务流夹具)
+  -  46 [desktop] › e2e\api\nonfunc-perf-compat.spec.js:122:6 › [TC-X-N03] 活动名额并发不超卖:100 名额 / 瞬时 500 请求(需活动夹具 + 压测授权)
+  ok 47 [desktop] › e2e\api\nonfunc-security.spec.js:50:3 › 非功能/安全接口冒烟 › [TC-G-N04] 未授权访问能量概览被拒(401/403) (71ms)
+  ok 48 [desktop] › e2e\api\nonfunc-security.spec.js:55:3 › 非功能/安全接口冒烟 › [TC-G-N04] 未授权访问家庭成员列表被拒(401/403) (53ms)
+  ok 49 [desktop] › e2e\api\nonfunc-security.spec.js:60:3 › 非功能/安全接口冒烟 › [TC-G-N04] 未授权调用 AI 健康教练被拒(401/403) (55ms)
+  ok 50 [desktop] › e2e\api\nonfunc-security.spec.js:66:3 › 非功能/安全接口冒烟 › [TC-P-N09] IDOR:越权访问他人家庭成员列表 → 403 (241ms)
+  x  51 [desktop] › e2e\api\nonfunc-security.spec.js:75:3 › 非功能/安全接口冒烟 › [TC-A-N05] 非管理员访问后台接口被拒(401/403) (47ms)
+  ok 52 [desktop] › e2e\api\nonfunc-security.spec.js:81:3 › 非功能/安全接口冒烟 › [TC-C-N07] 角色切换接口未授权被拒(401/403) (240ms)
+  ok 53 [desktop] › e2e\api\nonfunc-security.spec.js:86:3 › 非功能/安全接口冒烟 › [TC-C-N07] 权限提升防护:家长不可切换为未持有角色 (360ms)
+  ok 54 [desktop] › e2e\api\nonfunc-security.spec.js:93:3 › 非功能/安全接口冒烟 › [TC-C-N07] 角色切换自身合法角色正常(基线) (158ms)
+  ok 55 [desktop] › e2e\api\nonfunc-security.spec.js:101:3 › 非功能/安全接口冒烟 › [TC-P-N10] AI 健康教练 XSS:query 注入脚本不回显原始脚本且不错 500 (163ms)
+  ok 56 [desktop] › e2e\api\nonfunc-security.spec.js:109:3 › 非功能/安全接口冒烟 › [TC-A-N06] 活动反馈存储型 XSS:提交含脚本 comment,列表不回显原始脚本 (186ms)
+  x  57 [desktop] › e2e\api\nonfunc-security.spec.js:121:3 › 非功能/安全接口冒烟 › [TC-P-N11] 报告上传非 PDF/恶意内容被拒(非 200) (300ms)
+
+
+  1) [desktop] › e2e\api\nonfunc-perf-compat.spec.js:92:1 › [TC-P-N02/X-N01] 并发不串数据:并行 AI 请求各自独立响应 ─
+
+    Error: 第0个请求返回异常: {"code":46003,"message":"该功能为会员专享,请先开通会员","data":null}
+
+    expect(received).toBeTruthy()
+
+    Received: false
+
+       97 |   res.forEach((r, i) => {
+       98 |     expect(r.status, `第${i}个并行请求失败 HTTP=${r.status}`).toBe(200);
+    >  99 |     expect(r.json && r.json.code === 200, `第${i}个请求返回异常: ${JSON.stringify(r.json).slice(0, 80)}`).toBeTruthy();
+          |                                                                                                   ^
+      100 |   });
+      101 |   // 隔离信号:各并行请求应拿到各自独立的 conversationId(不串数据的关键判据)
+      102 |   const convIds = res.map((r) => r.json.data && r.json.data.conversationId).filter(Boolean);
+        at forEach (D:\cfc\tests\e2e\api\nonfunc-perf-compat.spec.js:99:99)
+        at D:\cfc\tests\e2e\api\nonfunc-perf-compat.spec.js:97:7
+
+    Error Context: .api-artifacts\api-nonfunc-perf-compat--T-9a7ce-X-N01-并发不串数据:并行-AI-请求各自独立响应-desktop\error-context.md
+
+  2) [desktop] › e2e\api\nonfunc-security.spec.js:75:3 › 非功能/安全接口冒烟 › [TC-A-N05] 非管理员访问后台接口被拒(401/403) 
+
+    Error: 后台接口未授权应 401/403,实际 code=500 msg=手机号和验证码不能为空
+
+    expect(received).toBeTruthy()
+
+    Received: false
+
+      75 |   test('[TC-A-N05] 非管理员访问后台接口被拒(401/403)', async ({ request }) => {
+      76 |     const r = await apiPost(request, '/api/admin-auth/login', {}, null);
+    > 77 |     expect([401, 403].includes(r.code), `后台接口未授权应 401/403,实际 code=${r.code} msg=${r.message}`).toBeTruthy();
+         |                                                                                                ^
+      78 |   });
+      79 |
+      80 |   // —— 双角色铁律 / 权限提升防护(TC-C-N07)——
+        at D:\cfc\tests\e2e\api\nonfunc-security.spec.js:77:96
+
+    Error Context: .api-artifacts\api-nonfunc-security-非功能-安-1d575-A-N05-非管理员访问后台接口被拒-401-403--desktop\error-context.md
+
+  3) [desktop] › e2e\api\nonfunc-security.spec.js:121:3 › 非功能/安全接口冒烟 › [TC-P-N11] 报告上传非 PDF/恶意内容被拒(非 200) 
+
+    Error: expect(received).toBeTruthy()
+
+    Received: false
+
+      129 |     // 安全合规行为:拒绝为 4xx(400/401/403/405/413/415/422)。非 200 即视为未成功落库。
+      130 |     expect(status, `报告上传非 PDF 应被拒(4xx),实际 HTTP ${status}`).not.toBe(200);
+    > 131 |     expect([400, 401, 403, 405, 413, 415, 422].includes(status)).toBeTruthy();
+          |                                                                  ^
+      132 |   });
+      133 | });
+      134 |
+        at D:\cfc\tests\e2e\api\nonfunc-security.spec.js:131:66
+
+    Error Context: .api-artifacts\api-nonfunc-security-非功能-安-18c8a-N11-报告上传非-PDF-恶意内容被拒-非-200--desktop\error-context.md
+
+  3 failed
+    [desktop] › e2e\api\nonfunc-perf-compat.spec.js:92:1 › [TC-P-N02/X-N01] 并发不串数据:并行 AI 请求各自独立响应 ──
+    [desktop] › e2e\api\nonfunc-security.spec.js:75:3 › 非功能/安全接口冒烟 › [TC-A-N05] 非管理员访问后台接口被拒(401/403) 
+    [desktop] › e2e\api\nonfunc-security.spec.js:121:3 › 非功能/安全接口冒烟 › [TC-P-N11] 报告上传非 PDF/恶意内容被拒(非 200) 
+  3 skipped
+  51 passed (1.1m)

+ 7 - 4
playwright_smoke_report.md

@@ -1,9 +1,12 @@
 
 
 ## Playwright E2E 冒烟(api 层,独立,不阻断主闭环)
 ## Playwright E2E 冒烟(api 层,独立,不阻断主闭环)
 - 执行器: /d/cfc/tests/node_modules/.bin/playwright test -c playwright.config.api.js --project=desktop
 - 执行器: /d/cfc/tests/node_modules/.bin/playwright test -c playwright.config.api.js --project=desktop
-- 结果: **未执行(执行器异常中断,日志无用例汇总行)**
-- ⚠️ 本轮 E2E 未产出结果,**不可**解读为 0 failed / 全绿;需人工重跑确认。
-- 失败特征: Error: [safe-delete] 操作失败: spaw
+- 结果: **51 passed / 3 failed / 3 skipped(1.1m)**
+- 说明: 主闭环首跑时执行器被沙箱 `[safe-delete]` 清理临时目录超时中断(工具链问题,非用例失败),已手工重跑取得上述真实结果,日志已覆盖写入 `playwright_smoke.log`。
+- 红用例(与上一轮完全一致,**无新增**):
+  1. `nonfunc-perf-compat.spec.js:92` [TC-P-N02/X-N01] 并发 AI 请求报 46003「该功能为会员专享,请先开通会员」——测试账号无会员,属测试口径问题。
+  2. `nonfunc-security.spec.js:75` [TC-A-N05] 后台接口未授权应 401/403,实际 code=500「手机号和验证码不能为空」——缺鉴权过滤器。
+  3. `nonfunc-security.spec.js:121` [TC-P-N11] 报告上传非 PDF / 恶意内容应返非 200,实际未拒绝——上传格式校验缺失。
 - 覆盖: tests/e2e/api/*.spec.js(含 nonfunc-security 安全契约、nonfunc-perf-compat 性能兼容)
 - 覆盖: tests/e2e/api/*.spec.js(含 nonfunc-security 安全契约、nonfunc-perf-compat 性能兼容)
-- 说明: 红用例=已知后端缺口(权限提升/开放端点/上传未校验/缺鉴权过滤器),作持续告警;失败不阻断本闭环。
+- 说明: 红用例=已知后端缺口,作持续告警;失败不阻断本闭环。
 - 明细: /d/cfc/playwright_smoke.log
 - 明细: /d/cfc/playwright_smoke.log