Przeglądaj źródła

docs: 更新测试追踪报告 + ISSUE-003根因确认 (2026-06-30)

Sisyphus Agent 4 miesięcy temu
rodzic
commit
21497bf1dc

+ 45 - 25
docs/系统测试/issue-tracking/ISSUE-003-admin-create-user.md

@@ -1,50 +1,70 @@
-# ISSUE-003:管理员创建用户500错误
+# ISSUE-003:管理员创建用户500错误(根因已确认)
 
 **状态**: 待解决
 **严重度**: 中
 **创建日期**: 2026-06-29
 **模块**: 用户管理
 **测试用例**: `ADMIN-CREATE-PARENT`
+**根因确认日期**: 2026-06-30
 
 ## 问题描述
 
-管理员通过 `POST /api/admin/users/create` 创建新用户(phone=13800138002)时返回 Spring Boot 默认 500 错误页面(非业务 `Result.error`)。
+管理员通过 `POST /api/admin/users/create` 创建新用户时返回 Spring Boot 默认 500 错误页面(非业务 `Result.error`)。
 
 ## 错误信息
 
 ```
-[ADMIN-CREATE-PARENT] FAIL code=500 resp={'timestamp': '...', 'status': 500, 'error': 'Internal Server Error', 'path': '/api/admin/users/create'}
+code=500 status=Internal Server Error path=/api/admin/users/create
 ```
 
-## 复现步骤
-
-1. admin 登录 → `POST /api/admin-auth/login`
-2. 创建用户 → `POST /api/admin/users/create` (phone=13800138002, role=parent, nickname="E2E测试家长")
-3. **失败**:返回 Spring 默认 500 错误
+即使使用时间戳唯一手机号(如 `13930143018`)仍500,排除重复手机号问题。
 
 ## 根因分析
 
-`AdminController.createUser()` 逻辑:
-1. 检查 phone 是否已存在
-2. 新建 User 对象
-3. `userMapper.insert(user)` → **此处抛出未捕获异常**
+**文件**: `cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminController.java` line 76-104
+
+```java
+User user = new User();
+user.setPhone(phone);
+user.setNickname(nickname);
+user.setRole(role);
+user.setRealName(realName);
+user.setPassword("");      // ← 空字符串可能违反约束
+user.setCreatedAt(new Date());
+user.setUpdatedAt(new Date());
+// ❌ 缺少: user.setFamilyId(...) — family_id 是 NOT NULL 字段!
+userMapper.insert(user);
+```
+
+`users` 表结构(生产库):
+```sql
+family_id BIGINT NOT NULL,   // ← 约束存在
+```
+
+**根因**: `family_id` 是 `NOT NULL` 字段,但 `AdminController.createUser()` 没有设置 `familyId`,导致 MySQL 约束违反异常 → 500。
 
-500(Spring 默认错误页面)而非 `Result.error(code=500)` 表明是**数据库写入异常**,可能原因:
+## 现有用户 familyId 参考
 
-1. **password 字段约束**:`user.setPassword("")` 空字符串可能违反 NOT NULL 或其他约束
-2. **数据库触发器**:`users` 表有触发器导致插入失败
-3. **字段类型不匹配**:某些字段值为空但类型不兼容
-4. **唯一索引冲突**(phone 之外的索引)
+| userId | phone | familyId |
+|--------|-------|----------|
+| 1 | 13910958767 | 2 |
+| 8 | 13701366188 | 2 |
+| 9 | 13701366181 | 16 |
+| 10 | 13800138999 | 17 |
+
+## 影响范围
+
+- 管理员无法通过管理后台创建新用户
+- 所有新用户创建都失败(NOT NULL 约束)
 
 ## 修复建议
 
-1. 检查远程 `users` 表结构:
-   ```sql
-   SHOW CREATE TABLE users;
-   ```
-2. 检查 `password` 字段允许 NULL 还是 NOT NULL
-3. 在 `AdminController.createUser()` 添加 try-catch 捕获 `DataAccessException`
-4. 考虑设置 `password` 为 `null` 而非空字符串,或设置默认值
+在 `AdminController.createUser()` 中添加 `familyId`:
+```java
+user.setFamilyId(1L); // 或创建新的 family 记录
+```
+
+或者修改表结构允许 NULL(不推荐)。
 
 ## 责任人
 
@@ -56,4 +76,4 @@
 
 ## 回归测试
 
-修复后运行:`python e2e_multi_role.py` 验证 `ADMIN-CREATE-PARENT` 通过。
+修复后运行:`python e2e_issue_tracking.py` 验证 `ISSUE003-CREATE` 通过。

+ 5 - 5
docs/系统测试/issue-tracking/README.md

@@ -10,11 +10,11 @@
 
 ## 问题总览
 
-| # | 问题ID | 模块 | 严重度 | 状态 | 发现日期 | 解决日期 |
-|---|--------|------|--------|------|----------|----------|
-| 1 | ISSUE-001 | 商品上下架 | 中 | 待解决 | 2026-06-29 | — |
-| 2 | ~~ISSUE-002~~ | ~~文章发布~~ | ~~高~~ | ✅ 已解决 | 2026-06-29 | 2026-06-29 |
-| 3 | ISSUE-003 | 创建用户 | 中 | 待解决 | 2026-06-29 | — |
+| # | 问题ID | 模块 | 严重度 | 状态 | 发现日期 | 根因确认日期 | 解决日期 |
+|---|--------|------|--------|------|----------|-------------|----------|
+| 1 | ISSUE-001 | 商品上下架 | 中 | 待解决 | 2026-06-29 | — | — |
+| 2 | ~~ISSUE-002~~ | ~~文章发布~~ | ~~高~~ | ✅ 已解决 | 2026-06-29 | 2026-06-29 | 2026-06-29 |
+| 3 | ISSUE-003 | 创建用户 | 中 | ✅ 根因已确认 | 2026-06-29 | 2026-06-30 | — |
 
 ---
 

+ 26 - 0
docs/系统测试/test-records/README.md

@@ -33,6 +33,32 @@
 
 ## 历史测试记录
 
+### 2026-06-30 — 问题追踪测试(v3脚本,深度分析)
+
+**测试commit**: `093021f`
+**测试环境**: `http://cfc.iwintrue.com:80`
+**测试脚本**: `e2e_issue_tracking.py`
+
+| 测试项 | 结果 | 说明 |
+|--------|------|------|
+| STEP1-LOGIN | ✅ PASS | adminId=7 |
+| ISSUE003-CREATE | ❌ FAIL | **根因确认**: `family_id NOT NULL` 约束未被满足 |
+| ISSUE003-SEARCH | ✅ PASS | 找到已存在家长 userId=8 (phone=13701366188) |
+| ISSUE002-CREATE | ✅ PASS | articleId=5 |
+| ISSUE002-PUBLISH | ✅ PASS | 发布成功 |
+| ISSUE001-CHECK-VENDOR | ⚠️ WARN | vendorStatus=pending(无法完整测试ISSUE-001)|
+| ISSUE001-SKIP | ⚠️ WARN | 供应商未approved,跳过商品流程 |
+| ACTIVITY-CREATE | ✅ PASS | activityId=10 |
+| ACTIVITY-PUBLISH | ✅ PASS | 发布成功 |
+| PARENT-PRODUCT-LIST | ✅ PASS | total=7 |
+| PARENT-ACTIVITY-LIST | ✅ PASS | total=10 |
+
+**汇总**: 20 tests, 8 PASS, 1 FAIL, 2 WARN
+
+**重大发现**: ISSUE-003 根因是 `AdminController.createUser()` 未设置 `family_id`,而该字段为 NOT NULL。所有现有用户均有有效 `family_id`。
+
+---
+
 ### 2026-06-29 — 多角色 E2E 测试(第二轮,v2脚本)
 
 **测试commit**: `e24e1b3`

+ 133 - 0
e2e_issue_tracking_result.txt

@@ -0,0 +1,133 @@
+
+============================================================
+FINAL: 20 tests | PASS=8 | FAIL=1 | WARN=2
+============================================================
+ISSUE-001 (Vendor Shelve):  N/A
+ISSUE-002 (Article Publish): PASS
+ISSUE-003 (Admin Create User): FAIL
+============================================================
+  [--] STEP1-LOGIN: Admin login...
+  [OK] STEP1-LOGIN: OK adminId=7
+  [--] ISSUE003-TEST: === ISSUE-003: Admin create user ===
+  [--] ISSUE003-CREATE: Creating user phone=13930143018
+  [XX] ISSUE003-CREATE: FAIL code=500 msg=
+  [--] ISSUE003-SEARCH: Searching for existing parent users...
+  [OK] ISSUE003-SEARCH: Found parent userId=8 phone=13701366188
+  [--] ISSUE002-TEST: === ISSUE-002: Article create+publish (regression) ===
+  [OK] ISSUE002-CREATE: OK articleId=5
+  [OK] ISSUE002-PUBLISH: OK
+  [--] ISSUE001-TEST: === ISSUE-001: Vendor product full flow ===
+  [--] ISSUE001-CHECK-VENDOR: Checking vendor status userId=81069...
+  [!!] ISSUE001-CHECK-VENDOR: vendorStatus=pending
+  [!!] ISSUE001-SKIP: Vendor not approved (vendorStatus=pending), skip product flow
+  [--] ACTIVITY-TEST: === Activity create+publish ===
+  [OK] ACTIVITY-CREATE: OK activityId=10
+  [OK] ACTIVITY-PUBLISH: OK
+  [--] PARENT-TEST: === Parent APIs ===
+  [OK] PARENT-PRODUCT-LIST: OK total=7
+  [OK] PARENT-ACTIVITY-LIST: OK total=10
+
+
+--- RAW JSON ---
+[
+  {
+    "tag": "STEP1-LOGIN",
+    "msg": "Admin login...",
+    "status": "INFO"
+  },
+  {
+    "tag": "STEP1-LOGIN",
+    "msg": "OK adminId=7",
+    "status": "PASS"
+  },
+  {
+    "tag": "ISSUE003-TEST",
+    "msg": "=== ISSUE-003: Admin create user ===",
+    "status": "INFO"
+  },
+  {
+    "tag": "ISSUE003-CREATE",
+    "msg": "Creating user phone=13930143018",
+    "status": "INFO"
+  },
+  {
+    "tag": "ISSUE003-CREATE",
+    "msg": "FAIL code=500 msg=",
+    "status": "FAIL"
+  },
+  {
+    "tag": "ISSUE003-SEARCH",
+    "msg": "Searching for existing parent users...",
+    "status": "INFO"
+  },
+  {
+    "tag": "ISSUE003-SEARCH",
+    "msg": "Found parent userId=8 phone=13701366188",
+    "status": "PASS"
+  },
+  {
+    "tag": "ISSUE002-TEST",
+    "msg": "=== ISSUE-002: Article create+publish (regression) ===",
+    "status": "INFO"
+  },
+  {
+    "tag": "ISSUE002-CREATE",
+    "msg": "OK articleId=5",
+    "status": "PASS"
+  },
+  {
+    "tag": "ISSUE002-PUBLISH",
+    "msg": "OK",
+    "status": "PASS"
+  },
+  {
+    "tag": "ISSUE001-TEST",
+    "msg": "=== ISSUE-001: Vendor product full flow ===",
+    "status": "INFO"
+  },
+  {
+    "tag": "ISSUE001-CHECK-VENDOR",
+    "msg": "Checking vendor status userId=81069...",
+    "status": "INFO"
+  },
+  {
+    "tag": "ISSUE001-CHECK-VENDOR",
+    "msg": "vendorStatus=pending",
+    "status": "WARN"
+  },
+  {
+    "tag": "ISSUE001-SKIP",
+    "msg": "Vendor not approved (vendorStatus=pending), skip product flow",
+    "status": "WARN"
+  },
+  {
+    "tag": "ACTIVITY-TEST",
+    "msg": "=== Activity create+publish ===",
+    "status": "INFO"
+  },
+  {
+    "tag": "ACTIVITY-CREATE",
+    "msg": "OK activityId=10",
+    "status": "PASS"
+  },
+  {
+    "tag": "ACTIVITY-PUBLISH",
+    "msg": "OK",
+    "status": "PASS"
+  },
+  {
+    "tag": "PARENT-TEST",
+    "msg": "=== Parent APIs ===",
+    "status": "INFO"
+  },
+  {
+    "tag": "PARENT-PRODUCT-LIST",
+    "msg": "OK total=7",
+    "status": "PASS"
+  },
+  {
+    "tag": "PARENT-ACTIVITY-LIST",
+    "msg": "OK total=10",
+    "status": "PASS"
+  }
+]

+ 14 - 14
e2e_multi_role_result.txt

@@ -7,7 +7,7 @@ SUMMARY: 31 tests, 12 PASS, 2 FAIL, 1 WARN
   [--] ADMIN-FIND-VENDOR: Finding vendor user phone=13800138001...
   [OK] ADMIN-FIND-VENDOR: Found userId=81069 role=teacher
   [--] VENDOR-APPLY: Vendor userId=81069 applying...
-  [OK] VENDOR-APPLY: OK: 入驻申请已提交,请等待审核
+  [OK] VENDOR-APPLY: Already applied (expected)
   [--] ADMIN-APPROVE-VENDOR: Approving vendor userId=81069...
   [OK] ADMIN-APPROVE-VENDOR: OK: 审核通过
   [--] VENDOR-STATUS: Checking vendor status userId=81069...
@@ -15,20 +15,20 @@ SUMMARY: 31 tests, 12 PASS, 2 FAIL, 1 WARN
   [--] VENDOR-PRODUCT-CREATE: Creating product as vendor userId=81069...
   [XX] VENDOR-PRODUCT-CREATE: FAIL code=200 resp={'code': 500, 'message': '仅审核通过的服务商可发布商品', 'data': None}
   [--] ADMIN-ARTICLE-CREATE: Creating article...
-  [OK] ADMIN-ARTICLE-CREATE: OK articleId=3
-  [--] ADMIN-ARTICLE-PUBLISH: Publishing article articleId=3...
+  [OK] ADMIN-ARTICLE-CREATE: OK articleId=4
+  [--] ADMIN-ARTICLE-PUBLISH: Publishing article articleId=4...
   [OK] ADMIN-ARTICLE-PUBLISH: OK: 操作成功
   [--] ADMIN-ACTIVITY-CREATE: Creating activity...
-  [OK] ADMIN-ACTIVITY-CREATE: OK activityId=8
-  [--] ADMIN-ACTIVITY-PUBLISH: Publishing activity activityId=8...
+  [OK] ADMIN-ACTIVITY-CREATE: OK activityId=9
+  [--] ADMIN-ACTIVITY-PUBLISH: Publishing activity activityId=9...
   [OK] ADMIN-ACTIVITY-PUBLISH: OK: 发布成功
   [--] ADMIN-FIND-PARENT: Finding parent user phone=13800138002...
   [--] ADMIN-CREATE-PARENT: Creating new parent user phone=13800138002...
-  [XX] ADMIN-CREATE-PARENT: FAIL/WARN code=500 resp={'timestamp': '2026-06-29T19:21:07.869+00:00', 'status': 500, 'error': 'Internal Server Error', 'path': '/api/admin/users/create'}
+  [XX] ADMIN-CREATE-PARENT: FAIL/WARN code=500 resp={'timestamp': '2026-06-30T06:25:32.029+00:00', 'status': 500, 'error': 'Internal Server Error', 'path': '/api/admin/users/create'}
   [--] PARENT-PRODUCT-LIST: Parent viewing product list...
   [OK] PARENT-PRODUCT-LIST: OK total=7
   [--] PARENT-ACTIVITY-LIST: Parent viewing activity list...
-  [OK] PARENT-ACTIVITY-LIST: OK total=8
+  [OK] PARENT-ACTIVITY-LIST: OK total=9
   [--] VENDOR-MY-PRODUCTS: Vendor viewing my products...
   [OK] VENDOR-MY-PRODUCTS: OK count=0
   [--] ADMIN-VENDOR-LIST: Admin listing vendors...
@@ -67,7 +67,7 @@ SUMMARY: 31 tests, 12 PASS, 2 FAIL, 1 WARN
   },
   {
     "tag": "VENDOR-APPLY",
-    "msg": "OK: 入驻申请已提交,请等待审核",
+    "msg": "Already applied (expected)",
     "status": "PASS"
   },
   {
@@ -107,12 +107,12 @@ SUMMARY: 31 tests, 12 PASS, 2 FAIL, 1 WARN
   },
   {
     "tag": "ADMIN-ARTICLE-CREATE",
-    "msg": "OK articleId=3",
+    "msg": "OK articleId=4",
     "status": "PASS"
   },
   {
     "tag": "ADMIN-ARTICLE-PUBLISH",
-    "msg": "Publishing article articleId=3...",
+    "msg": "Publishing article articleId=4...",
     "status": "INFO"
   },
   {
@@ -127,12 +127,12 @@ SUMMARY: 31 tests, 12 PASS, 2 FAIL, 1 WARN
   },
   {
     "tag": "ADMIN-ACTIVITY-CREATE",
-    "msg": "OK activityId=8",
+    "msg": "OK activityId=9",
     "status": "PASS"
   },
   {
     "tag": "ADMIN-ACTIVITY-PUBLISH",
-    "msg": "Publishing activity activityId=8...",
+    "msg": "Publishing activity activityId=9...",
     "status": "INFO"
   },
   {
@@ -152,7 +152,7 @@ SUMMARY: 31 tests, 12 PASS, 2 FAIL, 1 WARN
   },
   {
     "tag": "ADMIN-CREATE-PARENT",
-    "msg": "FAIL/WARN code=500 resp={'timestamp': '2026-06-29T19:21:07.869+00:00', 'status': 500, 'error': 'Internal Server Error', 'path': '/api/admin/users/create'}",
+    "msg": "FAIL/WARN code=500 resp={'timestamp': '2026-06-30T06:25:32.029+00:00', 'status': 500, 'error': 'Internal Server Error', 'path': '/api/admin/users/create'}",
     "status": "FAIL"
   },
   {
@@ -172,7 +172,7 @@ SUMMARY: 31 tests, 12 PASS, 2 FAIL, 1 WARN
   },
   {
     "tag": "PARENT-ACTIVITY-LIST",
-    "msg": "OK total=8",
+    "msg": "OK total=9",
     "status": "PASS"
   },
   {