⚠️ MVP 阶段说明
本项目为全新项目,尚未上线,当前处于 MVP(最小可行产品)阶段。
本文档记录的是 MVP 版本的测试用例和覆盖率目标,后续会持续补充和完善。版本:v1.1-MVP | 更新日期:2026-07-01 | 状态:开发中
| 层次 | 说明 |
|---|---|
| 单元测试 | Service 层业务逻辑 |
| 集成测试 | Controller + Service + DB 端到端 |
| 安全测试 | 认证、授权、白名单验证 |
| 限流测试 | Redis 滑动窗口限流策略 |
| 接口测试 | API 参数校验、响应格式 |
| 工具 | 说明 |
|---|---|
| JUnit 5 | 测试框架 |
| Spring Boot Test | 集成测试 |
| MockMvc | HTTP 接口模拟 |
| H2 Database | 嵌入式测试数据库 |
| Mockito | Mock Redis 等外部依赖 |
testtest-schema.sql| 编号 | 用例 | 预期结果 |
|---|---|---|
| AUTH-01 | POST /api/auth/sms/send - 手机号格式错误 | 400, code=400 |
| AUTH-02 | POST /api/auth/sms/send - 场景参数无效 | 400 |
| AUTH-03 | POST /api/auth/sms/login - 验证码格式错误 | 400 |
| AUTH-04 | POST /api/auth/sms/login - 验证码错误 | 200, 业务错误码 |
| AUTH-05 | GET /api/auth/wechat/url - 获取微信登录URL | 200, 返回URL字符串 |
| AUTH-06 | GET /api/auth/wechat/callback - 微信回调 | 200, 返回重定向URL |
| AUTH-07 | GET /api/auth/user/info - 有效Token | 200, 返回用户信息 |
| 编号 | 用例 | 预期结果 |
|---|---|---|
| SEC-01 | GET /api/level/list - 无Token公开访问 | 200 |
| SEC-02 | POST /api/auth/sms/send - 无Token公开访问 | 非401 |
| SEC-03 | POST /api/auth/sms/login - 无Token公开访问 | 非401 |
| SEC-04 | GET /api/auth/wechat/url - 无Token公开访问 | 非401 |
| SEC-05 | GET /api/level/my - 无Token | 401 |
| SEC-06 | GET /api/crawler/status - 无Token | 401 |
| SEC-07 | GET /api/coupon/my - 无Token | 401 |
| SEC-08 | GET /api/auth/user/info - 无Token | 401 |
| SEC-09 | GET /api/level/my - 有效Token | 200 |
| SEC-10 | GET /api/crawler/status - 有效Token | 200 |
| SEC-11 | 携带无效Token | 401 |
| 编号 | 用例 | 预期结果 |
|---|---|---|
| GW-01 | 请求日志记录 | 日志包含请求路径、耗时 |
| GW-02 | 慢请求告警 | 超过1000ms打印WARN |
| GW-03 | 限流-正常请求 | 200 |
| GW-04 | 限流-超出阈值 | 429 |
| GW-05 | 限流-短信接口更严格 | 10次/60s |
| GW-06 | 排除路径不记录日志 | /actuator/health 不记录 |
| 编号 | 用例 | 预期结果 |
|---|---|---|
| LVL-01 | GET /api/level/list - 获取等级列表(公开) | 200, 包含3个等级(PLUS/PRO/ULTRA) |
| LVL-02 | GET /api/level/my - 获取当前用户等级 | 200, 含 membershipExpireAt/membershipDaysRemaining |
| LVL-03 | GET /api/level/{id} - 获取等级详情 | 200, 含 pricingPlans(PLUS无套餐) |
| LVL-04 | GET /api/level/999 - 不存在的等级 | 200, code=4001 |
| 编号 | 用例 | 预期结果 |
|---|---|---|
| MEM-01 | GET /api/membership/my - 查询我的会员信息 | 200, level/effectiveTo/source |
| MEM-02 | GET /api/membership/benefits?level=PRO | 200, 返回PRO等级权益列表 |
| MEM-03 | POST /api/admin/membership/grant - 运营发放PRO会员 | 200, 会员立即生效 |
| MEM-04 | POST /api/admin/membership/grant - 无效等级 | 200, 业务错误码 |
| MEM-05 | GET /api/admin/memberships - 分页查询会员记录 | 200, 支持按userId/level筛选 |
| 编号 | 用例 | 预期结果 |
|---|---|---|
| PAY-01 | GET /api/payment/plans - 无需认证返回方案列表 | 200, 方案数组(当前2个:月卡/年卡) |
| PAY-02 | GET /api/payment/plans - 方案含价格、会员等级等字段 | 200, price/membershipLevel/durationDays存在 |
| PAY-03 | POST /api/payment/order/create - 微信支付返回二维码 | 200, channel=WECHAT, qrCodeBase64存在 |
| PAY-04 | POST /api/payment/order/create - 支付宝返回二维码 | 200, channel=ALIPAY |
| PAY-05 | POST /api/payment/order/create - 无效渠道返回错误 | 200, code=2004 |
| PAY-06 | POST /api/payment/order/create - 无Token返回401 | 401 |
| PAY-07 | GET /api/payment/order/{orderNo} - 查询存在订单 | 200, 返回详情 |
| PAY-08 | GET /api/payment/order/{orderNo} - 不存在订单返回错误 | 200, code=2001 |
| PAY-09 | POST /api/payment/order/{orderNo}/pay - 模拟支付成功 | 200, status=PAID, paidTime存在 |
| PAY-10 | POST /api/payment/order/{orderNo}/pay - 已支付订单再次支付 | 200, code=2005 |
| PAY-11 | GET /api/payment/orders - 查询用户订单列表 | 200, data为数组 |
| PAY-12 | POST /api/payment/callback/wechat - 缺少订单号 | 200, 返回FAIL |
| PAY-13 | POST /api/payment/callback/alipay - 缺少订单号 | 200, 返回fail |
| 编号 | 用例 | 优先级 | 状态 |
|---|---|---|---|
| INV-01 | GET /api/invite/code - 获取邀请码 | P1 | ✅ |
| INV-02 | GET /api/invite/stats - 邀请统计(含crawlerTodayRemaining/crawlerQuotaFromInvites) | P1 | ✅ |
| INV-03 | GET /api/invite/page/{code} - 落地页(公开) | P1 | ✅ |
| INV-04 | POST /api/invite/click/{code} - 点击追踪 | P2 | ✅ |
| INV-05 | GET /api/invite/rewards - 邀请记录 | P1 | ✅ |
| INV-06 | 邀请注册→发放1个月PRO会员+可选额外爬虫配额 | P1 | ✅ |
| INV-07 | 多渠道落地页(channel=app/wechat/miniapp) | P2 | ✅ |
| INV-08 | GET /api/invite/my-inviter - 查询邀请人信息 | P1 | ✅ |
| INV-09 | 未被邀请返回invited=false | P1 | ✅ |
| INV-10 | POST /api/invite/bind - 补填邀请码成功 | P1 | ✅ |
| INV-11 | 补填邀请码→邀请人获1个月PRO(统一入口grantInviteReward) | P1 | ✅ |
| INV-12 | 已有邀请关系拒绝重复绑定 | P2 | ✅ |
| INV-13 | 邀请奖励上限30人,超限不再发放 | P1 | ✅ |
| INV-14 | 邀请页crawlerTodayRemaining与爬虫状态页一致 | P2 | ✅ |
| 编号 | 用例 | 优先级 |
|---|---|---|
| CRL-01 | GET /api/crawler/status - 配额状态含额外配额明细 | P1 |
| CRL-02 | POST /api/crawler/consume - 消耗等级配额 | P1 |
| CRL-03 | POST /api/crawler/consume - 消耗额外配额(快过期优先) | P1 |
| CRL-04 | POST /api/crawler/consume - 使用优惠券补充 | P2 |
| CRL-05 | POST /api/crawler/consume - 配额不足拒绝 | P1 |
| CRL-06 | 日配额耗尽 → 返回拒绝 | P1 |
| CRL-07 | 月配额耗尽 → 返回拒绝 | P1 |
| CRL-08 | 过期配额自动标记 | P2 |
| 编号 | 用例 | 优先级 |
|---|---|---|
| ADM-01 | GET /api/admin/invite/config - 获取邀请配置 | P1 |
| ADM-02 | PUT /api/admin/invite/config - 更新邀请配置 | P1 |
| ADM-03 | POST /api/admin/crawler/grant - 手动发放爬虫次数 | P1 |
| ADM-04 | GET /api/admin/crawler/grants - 查看发放记录 | P1 |
| 编号 | 用例 | 优先级 |
|---|---|---|
| CPN-01 | POST /api/coupon/issue - 发放优惠券 | P1 |
| CPN-02 | GET /api/coupon/my - 我的优惠券列表 | P1 |
| CPN-03 | GET /api/coupon/my/available - 可用优惠券 | P2 |
| CPN-04 | 爬虫消耗优先使用优惠券 | P1 |
| 编号 | 用例 | 优先级 |
|---|---|---|
| JWT-01 | 管理员Token过期时间12小时 | P0 |
| JWT-02 | 普通用户Token过期时间1小时 | P0 |
| JWT-03 | SUPER_ADMIN生成Token过期时间为12小时 | P1 |
| JWT-04 | getExpirationInSeconds("ADMIN") 返回 43200 秒 | P1 |
| JWT-05 | getExpirationInSeconds("USER") 返回 3600 秒 | P1 |
| JWT-06 | TokenVersionCache 超过10万上限时触发淘汰 | P2 |
| JWT-07 | TokenVersionCache 定时统计日志输出 | P2 |
| JWT-08 | heartbeat 缓存miss时回退查DB并回填缓存 | P1 |
| 编号 | 用例 | 优先级 |
|---|---|---|
| DUP-01 | 渠道切换 - PENDING订单切换渠道成功 | P0 |
| DUP-02 | 渠道切换 - 已支付订单切换渠道拒绝 | P1 |
| DUP-03 | 渠道切换 - 已过期订单切换渠道拒绝 | P1 |
| DUP-04 | 重复支付回调 - 订单已PAID时第二笔回调记录重复支付 | P0 |
| DUP-05 | 重复支付回调 - 同一tradeNo幂等不重复记录 | P0 |
| DUP-06 | 自动退款 - 微信渠道重复支付触发退款(mock模式) | P0 |
| DUP-07 | 自动退款 - 支付宝渠道重复支付触发退款(mock模式) | P0 |
| DUP-08 | 退款状态 - 退款成功后refund_status=SUCCESS | P0 |
| DUP-09 | 退款失败 - 记录refund_fail_reason,refund_status=FAILED | P1 |
| DUP-10 | 退款幂等 - 同一重复支付记录不重复退款 | P1 |
| 编号 | 用例 | 优先级 |
|---|---|---|
| ACT-01 | GET /api/activity/lottery/status - 查询抽奖状态(活动开启) | P0 |
| ACT-02 | GET /api/activity/lottery/status - 查询抽奖状态(活动关闭) | P0 |
| ACT-03 | GET /api/activity/lottery/status - 普通会员无资格 | P0 |
| ACT-04 | GET /api/activity/lottery/status - 入驻未审核无资格 | P0 |
| ACT-05 | GET /api/activity/lottery/prizes - 获取奖品列表(不含敏感信息) | P0 |
| ACT-06 | POST /api/activity/lottery/draw - 有资格用户抽奖成功 | P0 |
| ACT-07 | POST /api/activity/lottery/draw - 无资格用户抽奖拒绝 | P0 |
| ACT-08 | POST /api/activity/lottery/draw - 无机会用户抽奖拒绝 | P0 |
| ACT-09 | POST /api/activity/lottery/draw - 重复抽奖记录违规日志 | P0 |
| ACT-10 | POST /api/activity/lottery/draw - 库存扣减正确 | P0 |
| ACT-11 | POST /api/activity/lottery/draw - 库存为0奖品不参与抽奖 | P0 |
| ACT-12 | POST /api/activity/lottery/draw - 权重计算正确(权重=份数) | P0 |
| ACT-13 | GET /api/activity/lottery/records - 查询抽奖记录 | P1 |
| ACT-14 | GET /api/admin/activity/lottery/config - 查询活动配置 | P1 |
| ACT-15 | PUT /api/admin/activity/lottery/config - 更新活动配置 | P1 |
| ACT-16 | GET /api/admin/activity/lottery/prizes - 查询奖品池(含敏感信息) | P1 |
| ACT-17 | POST /api/admin/activity/lottery/prizes - 新增奖品 | P1 |
| ACT-18 | PUT /api/admin/activity/lottery/prizes/{id} - 更新奖品 | P1 |
| ACT-19 | DELETE /api/admin/activity/lottery/prizes/{id} - 删除奖品 | P1 |
| ACT-20 | GET /api/admin/activity/lottery/records - 分页查询抽奖记录 | P1 |
mvn test
mvn test -pl zhijiayun-gateway
mvn test -pl zhijiayun-gateway -Dtest=AuthControllerTest
mvn test -pl zhijiayun-gateway -Dtest="AuthControllerTest#sendCode_invalidPhone_shouldReturnBadRequest"
注:旧的等级版本体系(NORMAL/VIP/SVIP)已下线,统一迁移至会员体系(PLUS/PRO/ULTRA)。 爬虫配额现在由会员权益配置 + 日/月/年三周期 + 额外配额组成。
| membership_level | daily_quota | monthly_quota | yearly_quota | max_concurrent |
|---|---|---|---|---|
| PLUS | 10 | 200 | 2000 | 2 |
| PRO | 50 | 1000 | 10000 | 5 |
| ULTRA | 200 | 5000 | 50000 | 10 |
通过 generateAccessToken(userId, phone) 动态生成 JWT Token,无需预置用户。
| 模块 | 行覆盖率目标 | 分支覆盖率目标 |
|---|---|---|
| zhijiayun-user | 70% | 60% |
| zhijiayun-invite | 70% | 60% |
| zhijiayun-payment | 70% | 60% |
| zhijiayun-activity | 70% | 60% |
| zhijiayun-gateway | 80% | 70% |
| 整体 | 70% | 60% |