From 9e03920e61fab4e5423926b4a791ce3a4dc86db4 Mon Sep 17 00:00:00 2001 From: hectorzhao Date: Wed, 1 Jul 2026 18:01:16 +0800 Subject: [PATCH] test: record step4 precheck coverage --- docs/testing-execution-step-4.md | 98 ++++++++++++++++++++++++++++++++ docs/testing-progress.md | 7 +++ 2 files changed, 105 insertions(+) create mode 100644 docs/testing-execution-step-4.md diff --git a/docs/testing-execution-step-4.md b/docs/testing-execution-step-4.md new file mode 100644 index 0000000..25c3387 --- /dev/null +++ b/docs/testing-execution-step-4.md @@ -0,0 +1,98 @@ +# 测试实施第四步执行记录 + +## 执行时间 + +- 日期:2026-07-01 +- 总步骤数:8 +- 当前步骤:第 4 步,执行发送前校验测试 + +## 第四步目标 + +验证客户发送前的核心前置校验闭环,包括短信模板多变量识别、变量完整性校验、风控规则直接拒绝、风控规则进入人工审核、计费预估和账户余额检查。 + +导入数据发送、非法字符展示、敏感词/非法字符对计费的干扰当前缺少完整发送前校验入口,本步按阻塞缺口记录。 + +## 执行环境 + +| 项目 | 结果 | +| --- | --- | +| PostgreSQL | 可连接,使用真实数据库。 | +| Redis | 可连接,本步未直接消费队列。 | +| MinIO | 可连接,本步未执行文件导入。 | +| API | 使用 `API_PORT=3101 npm --prefix api run start:dev` 启动,执行完成后已停止。 | + +## 已执行命令 + +```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'; npm --prefix api run start:dev +node +``` + +## 本步执行过的测试用例 + +| 用例编号 | 用例名称 | 执行范围 | 结果 | +| --- | --- | --- | --- | +| TC-TEMPLATE-001 | 多变量模板识别 | 创建包含 `${name}`、`${orderNo}`、`${code}`、`${minutes}` 的短信模板,查询模板变量列表。 | 通过 | +| TC-TEMPLATE-002 | 多变量完整提交 | 使用完整变量集调用发送风控评估,验证任务可提交、状态 approved。 | 通过 | +| TC-TEMPLATE-003 / TC-RISK-005 | 模板变量异常 | 少传 `orderNo` 且多传 `coupon`,验证任务 rejected、命中 TEMPLATE_VARIABLE_ANOMALY,并记录 missing/extra 变量。 | 通过 | +| TC-RISK-001 | 最大号码数直接拒绝 | 应用 `maxPhonesPerTask=3`,提交 4 个号码,验证任务 rejected 并命中 MAX_PHONES_PER_TASK。 | 通过 | +| TC-RISK-002 | 重复率进入人工审核 | 3 个号码中 1 个重复,重复率 33.33%,验证任务 pending_review 并命中 DUPLICATE_PHONE_RATIO。 | 通过 | +| TC-RISK-003 | 非法号码率直接拒绝 | 2 个号码中包含 `10086X`,非法号码率 50.00%,验证任务 rejected 并命中 ILLEGAL_PHONE_RATIO。 | 通过 | +| TC-RISK-004 | 黑名单率进入人工审核 | 创建平台黑名单号码后提交,黑名单命中率 50.00%,验证任务 pending_review 并命中 BLACKLIST_HIT_RATIO。 | 通过 | +| TC-BILLING-001 / TC-TEMPLATE-005 | 费用预估与变量长度计费影响 | 分别估算短内容和长内容,验证 70/67 分段规则导致长内容计费条数和金额增加。 | 通过 | +| TC-BILLING-PRECHECK-001 | 账户余额发送前检查 | 创建账户余额 100 分、5 条,分别执行小额和超额检查,验证小额可发、超额拦截。 | 通过 | + +## 本步创建的数据 + +| 数据类型 | ID | +| --- | --- | +| 测试运行编号 | `step4-1783101678315` | +| Tenant | `cmr1wlzm3000vqgyuztjypar9` | +| SmsApplication | `cmr1wlzpi000wqgyugengdtei` | +| SmsSignature | `cmr1wlzq4000xqgyuytwb1tmn` | +| SmsTemplate | `cmr1wlzr70011qgyugx8f6gs8` | +| 风控放行任务 | `cmr1wm03w001aqgyucjy5palb` | + +## 通过项 + +- 短信模板可自动识别多个变量,并在客户侧查询中返回变量列表。 +- 完整变量、合法号码、未触发风险规则时,发送前风控评估可放行。 +- 模板变量缺失或多传时,发送前风控评估会直接拒绝,并记录变量异常详情。 +- 应用最大号码数配置会参与风控阈值计算,超过上限时直接拒绝。 +- 重复号码比例过高会进入人工审核。 +- 非法手机号比例过高会直接拒绝。 +- 命中平台黑名单会进入人工审核。 +- 计费预估按 70/67 规则计算短信分段,内容变长会增加计费条数和金额。 +- 账户检查能够同时校验金额余额和短信条数余额。 + +## 本步发现的问题 + +| 问题 | 影响 | 证据 | +| --- | --- | --- | +| 审核接口传入不存在的 `reviewerId` 会返回 500 | 签名/模板审核接口没有提前校验 reviewer 是否存在,且签名状态可能已更新后审计记录失败。 | `AuditRecord_reviewerId_fkey` 外键错误。 | +| 风控评估传入不存在的 `createdById` 会返回 500 | 客户端误传或前端传入无效用户 ID 时,发送前校验会被数据库外键错误中断。 | `SmsSendTask_createdById_fkey` 外键错误。 | + +## 未执行或阻塞项 + +| 用例编号 | 用例名称 | 原因 | +| --- | --- | --- | +| TC-IMPORT-001 到 TC-IMPORT-006 | 导入数据发送 | 当前 API 未提供客户侧导入文件解析、号码预览、导入批次确认发送的完整入口;MinIO 文件能力已在前序 smoke 验证。 | +| TC-CONTENT-001 | 非法字符展示 | 当前风控评估只校验手机号、黑名单、变量、频控等,没有短信内容非法字符检测和展示字段。 | +| TC-CONTENT-002 | 敏感词命中展示 | 当前有敏感词字典管理接口,但发送前风控未接入敏感词扫描。 | +| TC-CONTENT-003 | 非法字符不干扰计费 | 缺少内容非法字符校验结果与计费预估联动入口,本步只能验证普通长短内容计费。 | +| TC-CONTENT-004 | 非法字符修正后重新计费 | 缺少内容修正闭环入口。 | +| TC-RISK-006 | 非工作时间营销大批量人工审核 | 默认阈值为 5000,本步未构造大批量真实请求;已在 API 单元测试中覆盖。 | +| TC-RISK-007 | 短时间任务创建频控 | 本步避免污染同租户任务频控;已在 API 单元测试中覆盖。 | + +## 本步结论 + +第四步可执行的发送前校验闭环已通过。当前系统已经具备多变量模板识别、变量异常拒绝、最大号码数拒绝、重复率人工审核、非法号码率拒绝、黑名单人工审核、计费预估和余额检查能力。 + +主要缺口集中在客户侧导入发送、内容非法字符展示、敏感词接入发送前风控,以及无效外键入参的接口健壮性处理。 + +## 下一步 + +进入第 5 步:执行发送链路闭环测试。重点覆盖任务创建、号码拆分、发送入队、submit result、receipt、uplink、任务查看、定时短信到点发送和 72 小时未知转超时。 diff --git a/docs/testing-progress.md b/docs/testing-progress.md index be26ffc..b4e0456 100644 --- a/docs/testing-progress.md +++ b/docs/testing-progress.md @@ -47,6 +47,8 @@ npm run spike:gateway npm --prefix api test npm run test:gateway node tools/smoke/real-env-smoke.mjs +$env:API_PORT='3101'; npm --prefix api run start:dev +node ``` ### 当前结果 @@ -61,9 +63,14 @@ node tools/smoke/real-env-smoke.mjs - `npm --prefix api run prisma:migrate:deploy` 通过,无待应用迁移。 - API 以真实 `.env` 启动,`GET http://127.0.0.1:3101/api/health` 返回 `ok`。 - `tools/smoke/real-env-smoke.mjs` 已补充最小幂等 seed,并验证登录、企业/客户、人工充值、余额检查、发送任务、MinIO 预签名上传、运营日志、发送链路追踪和账务对账聚合。 +- 第 4 步发送前置校验 smoke 通过: + - `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` 记录为阻塞缺口。 ### 已知缺口 - 暂未新增前端测试框架,前端仍以 `npm run build` 作为 smoke。 - BullMQ 真实链路仍由 `npm run spike:bullmq` 覆盖,不在 Jest 内启动 Redis。 - Gateway 未接真实运营商 SMSC;真实 CMPP 互通需要运营商测试环境后补充联调记录。 +- 客户侧导入发送、短信内容非法字符展示和敏感词发送前拦截尚未形成完整业务入口。