测试小白每日训练-02

44 阅读5分钟

执律度势,定鼎至臻。

题目来自Gemini

场景设定:电商 App 的“优惠券领取”功能

功能描述: 首页有一个弹窗,用户点击“立即领取”可以获得一张“满 100 减 20”的优惠券。优惠券每人限领 1 张,总量 10,000 张,有效期为领取后 7 天。

第一轮:基础功能测试(Happy Path)

问题 1: 作为一个测试人员,为了验证这个功能“最基本”是可用的,你会优先执行哪几个测试动作?(请列出 3-4 个最直观的正向或逆向用例)

第二轮:边界与约束测试

问题 2: 这个功能中有几个关键的数值约束(100元、20元、1张、10,000张、7天)。针对**“每人限领 1 张”“总量 10,000 张”**,你会设计哪些边界值的测试场景?

第三轮:异常与极端环境(Robustness)

问题 3: 现在的网络环境和手机状态很复杂。请想象一下,在用户点击“立即领取”的一瞬间,如果发生了以下情况,你觉得系统应该如何处理?

  1. 点击瞬间网络从 5G 切换到了电梯里的弱网环境。
  2. 用户在极短时间内(毫秒级)连续快速点击了 5 次领取按钮。

第四轮:后端逻辑与数据一致性

问题 4: 假设前端显示“领取成功”,但你作为测试需要去后端数据库验证。你会检查数据库里的哪些字段?如果出现“前端领到了,但数据库没记录”或者“数据库记录领了 2 张”,这可能是什么原因造成的?

回答

问题一:

  1. 首页弹窗正常显示

  2. 若已领取,是否还显示弹窗

  3. “立即领取”显示正常,可以点击后可领取且领取的优惠券效果、数量正确

  4. 总量为0时,领取失败且有提示

  5. 领取后,有效期内可以使用,有效期外不可使用

问题二:

  1. 每人领取两次

  2. 每人领取一次

  3. 9999人领取优惠券

  4. 10001人领取优惠券

  5. 10000人领取优惠券

问题三:

  1. 将领取视为一个事务,要么成功,要么失败(无论成功失败,都要加载出提示)

  2. 系统未处理完最早的领取操作前,不对后续请求做处理。若最早的领取请求成功,则后续的请求统一收到“已领取”的状态

问题四:

  1. 检查“该用户是否领取成功”、“是否领取过”这两个字段为True

  2. emm...不清楚

💡 复盘

针对问题一(基础功能):

你的点很全面,但漏掉了一个关键的**“状态同步”**:

  • 补充测试点: 用户领取成功后,不刷新页面直接去结算,购物车或收银台是否能立即识别并挂载这张券?(考察缓存一致性)

针对问题二(边界值):

你的 9999/10000/10001 思路非常正确。

  • 进阶提问: 假设现在只剩 1 张券了,但有 2 个用户同时点击了领取。如果两人都领到了,就超发了;如果两人都没领到,就少发了。这种“抢券”场景下,你的测试重点是什么?

针对问题三(弱网与连击):

你提到了“事务”和“不处理后续请求”,这说明你有后端思维。

  • 深度解析: 连续点击 5 次,在前端我们可以做“置灰”处理,但在后端必须要做幂等性(Idempotency)校验
  • 测试点设计: 如果用户在点击瞬间掐断网络,然后迅速恢复并再次点击,后端是否会因为第一次请求的“超时未知状态”而导致第二次领取失败?

针对问题四(数据库与底层):

这是你提到“不清楚”的地方,也是提升空间最大的地方。

  • 数据库必查字段:
    1. coupon_status: 券的状态(0-未使用,1-已使用,2-已过期)。
    2. received_time: 领取时间(用于计算 7 天有效期)。
    3. expire_time: 自动生成的过期时间。
    4. 关联表: 还需要检查user_idcoupon_id的唯一索引约束。
  • 原因分析: 如果“数据库领了 2 张”,通常是因为后端没有加锁(分布式锁)或者唯一索引失效,导致并发请求绕过了“限领 1 张”的检查。

📝 今天的学习复盘:测试思维进阶路径

1. 深度边界意识(Beyond Numbers)

  • 基础: 关注数值的 0、1、最大值、最小值(如:10,000张券的边界)。
  • 进阶: 关注**“时间边界” (如:跨年、跨月、秒级失效)和“并发边界”**(如:最后一张券被两人同时抢)。

2. 鲁棒性与异常处理(Resilience)

  • 前端防御: 连击、置灰、loading 状态切换。
  • 后端防御: 幂等性设计。即无论前端发了多少次重复请求,后端必须保证结果的唯一性,防止数据重复。
  • 环境异常: 弱网、断网、切换网络。要意识到“请求发出去但没收到回包”是系统最脆弱的时刻。

3. 底层数据一致性(Data Integrity)

  • 原子性(Atomicity): 这是一个核心发现。测试不仅仅是看页面反馈,还要看数据库底层是否完成了“扣除库存”与“增加用户记录”的同步动作。
  • 数据库验证: 养成检查 statusexpire_time 以及唯一索引约束的习惯,这是防范“超发/重发”的最后一道防线。

4. 安全与反作弊(Security)

  • 要有**“跳出 UI 看接口”**的意识。很多 Bug 或漏洞不在页面上,而在接口的校验逻辑里。

💡 给你的测试锦囊

“好的测试员测功能,优秀的测试员测逻辑,顶尖的测试员测‘人性’与‘极端’。”

下次当你面对一个新功能设计测试点时,可以尝试问自己三个问题:

  1. 如果用户不按套路出牌(极速连击、篡改参数)会怎样?
  2. 如果服务器在高压或断网下“喘不过气”会怎样?
  3. 如果两个动作同时发生(并发)会怎样?