diff --git a/docs/testing-execution-step-5.md b/docs/testing-execution-step-5.md new file mode 100644 index 0000000..b045492 --- /dev/null +++ b/docs/testing-execution-step-5.md @@ -0,0 +1,101 @@ +# 测试实施第五步执行记录 + +## 执行时间 + +- 日期:2026-07-01 +- 总步骤数:8 +- 当前步骤:第 5 步,执行发送链路闭环测试 + +## 第五步目标 + +验证客户立即发送任务从创建到发送记录、队列入队、Send Worker 消费、Submit Result、回执、上行、任务查看和 72 小时未知回执转超时的闭环。 + +定时短信发送也在本步探测,当前系统尚未形成计划发送字段和到点触发闭环。 + +## 执行环境 + +| 项目 | 结果 | +| --- | --- | +| PostgreSQL | 可连接,使用真实数据库。 | +| Redis | 可连接,Send Worker 使用真实 BullMQ/Redis。 | +| MinIO | 可连接,本步未执行文件导入。 | +| API | 使用 `API_PORT=3101 API_ENABLE_SEND_WORKER=true npm --prefix api run start:dev` 启动,执行完成后已停止。 | +| Gateway | 未连接真实运营商 CMPP;使用 `/api/gateway/events/*` 模拟 Gateway 回传事件。 | + +## 已执行命令 + +```bash +Test-NetConnection 127.0.0.1 -Port 5432 +Test-NetConnection 127.0.0.1 -Port 6379 +Test-NetConnection 127.0.0.1 -Port 9000 +$env:API_PORT='3101'; $env:API_ENABLE_SEND_WORKER='true'; npm --prefix api run start:dev +node +node +``` + +## 本步执行过的测试用例 + +| 用例编号 | 用例名称 | 执行范围 | 结果 | +| --- | --- | --- | --- | +| TC-SEND-001 / TC-SEND-002 | 批量任务创建与手机号拆分 | 创建租户、应用、签名、模板、通道、通道组、路由规则;提交 3 个号码,其中 1 个重复,验证生成批量任务、API 请求记录和 2 条短信记录。 | 通过 | +| TC-SEND-003 / TC-SEND-004 | 发送入队与 Worker 消费 | 启用真实 Send Worker,验证任务创建后自动入队,Worker 消费后生成 2 条 submit records,短信记录进入 `submit_queued`。 | 通过 | +| TC-SEND-005 | submit result 更新 | 模拟 Gateway `accepted` submit result,验证短信记录变为 `submitted`,submit record 写入 `sequenceId` 和 `gatewayMessageId`。 | 通过 | +| TC-SEND-006 | delivered 回执更新 | 模拟 Gateway delivered 回执,验证短信记录变为 `delivered`,生成 receipt record。 | 通过 | +| TC-SEND-007 | 72 小时 unknown 转 timeout | 模拟 73 小时前 unknown 回执,调用 `POST /api/admin/send/timeouts/mark-unknown`,验证短信记录变为 `timeout`。 | 通过 | +| TC-SEND-008 | 上行记录 | 模拟 Gateway 上行,验证 `SmsUplinkMessage` 写入,并可按租户和通道查询。 | 通过 | +| TC-SEND-009 / TC-SEND-010 | 任务查看与进度 | 客户端和运营端分别查询任务列表、任务详情和消息明细,验证任务最终 `finished`,`successTotal=1`,`timeoutTotal=1`。 | 通过 | +| TC-SCHEDULE-001 / TC-SCHEDULE-002 | 定时短信创建与到点发送 | 探测 `scheduledAt/sendMode=scheduled` 入参。接口接受请求但忽略定时字段,任务直接变为 `queued`。 | 未通过,记录缺口 | + +## 本步创建的数据 + +| 数据类型 | ID | +| --- | --- | +| 测试运行编号 | `step5-1782900420934` | +| Tenant | `cmr1wvlbf0008m8yu6so4fd6a` | +| SmsApplication | `cmr1wvlds0009m8yukei4omfw` | +| SmsChannel | `cmr1wvlg6000hm8yuo4wjsdos` | +| SmsBatchTask | `cmr1wvlmw000mm8yu3p8ytfvs` | +| UplinkMessage | `cmr1wvm6x000wm8yuxzu7uzpm` | +| 定时探测任务 | `cmr1wvyfu0010m8yuvkul1hkv` | + +## 通过项 + +- 客户端创建发送任务后会生成批量任务、API 请求记录和短信消息记录。 +- 手机号会在发送任务创建阶段去重,3 个入参号码最终生成 2 条消息记录。 +- 任务 approved 后会自动调用 `enqueueBatchTask`,真实 BullMQ/Redis 入队可用。 +- Send Worker 可消费 `sms.send.queue`,选择通道路由,创建 `SmsSubmitRecord`,并将消息状态更新为 `submit_queued`。 +- Gateway submit result 可按平台 `messageId` / `gatewayMessageId` 回写消息和 submit record。 +- delivered 回执可生成 `SmsReceiptRecord` 并更新消息状态。 +- unknown 回执超过 72 小时后可由运营接口批量转为 timeout。 +- 上行事件可写入并通过运营端接口查询。 +- 客户端和运营端均可查询任务列表、任务详情和消息明细。 +- 任务进度在成功和超时后刷新为 `finished`。 + +## 本步发现的问题 + +| 问题 | 影响 | 证据 | +| --- | --- | --- | +| 定时发送字段未实现 | 客户端传入 `scheduledAt`、`sendMode=scheduled` 后,接口未保存计划发送时间,也未进入 `scheduled` 状态,而是直接创建 `queued` 任务。 | 定时探测任务 `cmr1wvyfu0010m8yuvkul1hkv` 返回 `status=queued`。 | +| 创建发送任务未做账户余额冻结/扣费 | 当前发送链路只做费用预估并写入消息计费字段,不会在任务创建或 submit 成功后冻结、扣费或生成短信计费记录。 | `createBatchTask` 仅调用 `estimateSmsCost`,计费闭环需在第 6 步继续验证。 | +| 模板/签名/报备状态未在发送链路强制校验 | 发送链路主要依赖风控结果,当前未发现对签名审核状态、模板审核状态、签名报备状态的发送阻断。 | 本步使用 approved 数据通过,删除/失效/报备失败影响需在后续专项步骤验证。 | + +## 未执行或阻塞项 + +| 用例编号 | 用例名称 | 原因 | +| --- | --- | --- | +| TC-SCHEDULE-001 | 创建定时短信任务 | `CreateBatchTaskDto` 和 Prisma 返回数据中没有计划发送时间字段,`scheduledAt` 被忽略。 | +| TC-SCHEDULE-002 | 定时任务到点发送并生成记录 | 缺少 scheduled 状态、延迟队列或调度器入口。 | +| TC-SCHEDULE-003 | 定时任务到点前取消 | 缺少定时任务取消接口。 | +| TC-SCHEDULE-004 | 定时任务到点余额不足 | 缺少定时任务到点前重新计费/余额检查逻辑。 | +| TC-SCHEDULE-005 | 定时任务到点模板或签名失效 | 缺少定时任务到点前重新校验模板/签名/报备状态逻辑。 | +| TC-SCHEDULE-006 | 定时任务查看和筛选 | 缺少 scheduled 状态和计划发送时间字段。 | + +## 本步结论 + +第五步立即发送链路主干已通过。当前系统可以完成客户创建任务、消息拆分、真实 BullMQ 入队、Send Worker 消费、通道路由、submit result 回写、receipt 回写、上行记录、72 小时 unknown 转 timeout,以及客户端/运营端查询闭环。 + +主要缺口是定时发送未实现,且发送链路尚未把余额冻结扣费、模板/签名/报备状态阻断等业务规则接入完整闭环。 + +## 下一步 + +进入第 6 步:执行计费和对账闭环测试。重点覆盖人工充值、费用预估、余额检查、冻结、扣费、释放、退款、短信计费记录、对账 reconciliation,以及 dashboard/statistics 中计费相关数据准确性。 diff --git a/docs/testing-progress.md b/docs/testing-progress.md index b4e0456..668ca27 100644 --- a/docs/testing-progress.md +++ b/docs/testing-progress.md @@ -49,6 +49,9 @@ npm run test:gateway node tools/smoke/real-env-smoke.mjs $env:API_PORT='3101'; npm --prefix api run start:dev node +$env:API_PORT='3101'; $env:API_ENABLE_SEND_WORKER='true'; npm --prefix api run start:dev +node +node ``` ### 当前结果 @@ -67,6 +70,10 @@ node - `TC-TEMPLATE-001`、`TC-TEMPLATE-002`、`TC-TEMPLATE-003 / TC-RISK-005`、`TC-RISK-001`、`TC-RISK-002`、`TC-RISK-003`、`TC-RISK-004`、`TC-BILLING-001 / TC-TEMPLATE-005`、`TC-BILLING-PRECHECK-001` 均通过。 - 记录两个接口健壮性问题:不存在的 `reviewerId`、不存在的 `createdById` 会触发数据库外键 500。 - 客户侧导入发送、非法字符展示、敏感词接入发送前风控当前缺少完整入口,已在 `docs/testing-execution-step-4.md` 记录为阻塞缺口。 +- 第 5 步发送链路 smoke 通过: + - `TC-SEND-001 / TC-SEND-002`、`TC-SEND-003 / TC-SEND-004`、`TC-SEND-005`、`TC-SEND-006`、`TC-SEND-007`、`TC-SEND-008`、`TC-SEND-009 / TC-SEND-010` 均通过。 + - 使用真实 Redis/BullMQ 和 `API_ENABLE_SEND_WORKER=true` 验证了任务创建、号码去重拆分、自动入队、Worker 消费、submit record、submit result、receipt、uplink、72 小时 unknown 转 timeout、客户端/运营端任务查看。 + - 定时发送探测发现 `scheduledAt/sendMode=scheduled` 会被接口忽略,任务直接变为 `queued`,已在 `docs/testing-execution-step-5.md` 记录为功能缺口。 ### 已知缺口 @@ -74,3 +81,4 @@ node - BullMQ 真实链路仍由 `npm run spike:bullmq` 覆盖,不在 Jest 内启动 Redis。 - Gateway 未接真实运营商 SMSC;真实 CMPP 互通需要运营商测试环境后补充联调记录。 - 客户侧导入发送、短信内容非法字符展示和敏感词发送前拦截尚未形成完整业务入口。 +- 定时短信发送缺少计划发送时间字段、scheduled 状态、到点触发和取消接口。