快手测试面试题
本题清单
- 购物车如何设计测试用例?
- 压测关注什么?工具与抓包?
- 消息队列怎么选型?RocketMQ vs Kafka?
- Kafka 如何保证有序、不丢、可靠?测试怎么做?
- RocketMQ 如何保证有序?
- Redis 分布式锁线程挂了怎么办?
- 针对一个杯子设计测试用例
- 大表拆成多个小表后怎么测?
- 白盒测试你怎么理解?给代码设计用例
- MySQL 索引类型?越多越好吗?查询慢原因?
- MySQL 事务隔离级别?脏读、不可重复读、幻读怎么测?
- 短视频点赞高并发怎么测?要防哪些问题?
- 线程池核心参数有哪些?怎么结合测试验证?
- Linux 上磁盘打满或 inode 耗尽怎么排查?
- 接口签名防篡改怎么设计测试用例?
- 消费消息「至少一次」语义下,业务如何保证正确?怎么测?
1. 购物车如何设计测试用例?
参考答案:
主流程:加购、改数量、删除、全选、去结算、再次返回车内状态。
商品态:下架、无库存、限购、区域不可售、价格变更后的提示。
价格:单品活动、满减、券、运费、精度(分)。
并发:两端同时改同一 SKU 数量;结算瞬间库存被抢光。
登录态:未登录本地车、登录合并、切换账号。
安全:篡改商品单价/数量请求;改别人的 cartId。
性能:上百 SKU 加载、频繁刷新。
结算链路与库存、优惠强一致是 P0。
2. 压测关注什么?工具与抓包?
参考答案:
指标同性能题:QPS/TPS、RT 分位、错误率、资源、业务成功。
工具:JMeter(脚本与生态)、Locust(Python 灵活)、内部平台。
抓包:Charles/Fiddler 看 HTTPS 业务包;Wireshark 看网络层。弱网、断点、改包测校验,都要在安全允许范围内做。
3. 消息队列怎么选型?RocketMQ vs Kafka?
参考答案:
按需求四象限选:
| 诉求 | 更倾向 |
|---|---|
| 超高吞吐日志/大数据 | Kafka |
| 业务顺序消息、延时消息、事务消息 | RocketMQ |
| Java 业务生态、运维习惯 | 看团队栈 |
| 金融级可靠性(同步刷盘等) | 仔细评估 RocketMQ 事务与刷盘配置 |
答题结构:「先问业务要不要顺序/延时/事务,再问峰值吞吐,再谈运维成本。」
4. Kafka 如何保证有序、不丢、可靠?测试怎么做?
参考答案:
- 有序:单分区内有序;同业务键哈希到同分区。跨分区不保证全局有序。
- 不丢:生产者
acks=all,ISR 同步;消费者提交位点要在业务成功之后(至少一次语义时还要业务幂等)。 - 可靠:多副本、监控 ISR、磁盘与配额。
测试:杀 leader、网络分区、消费失败重试、重复消费是否幂等、堆积告警、顺序敏感业务的乱序注入。
5. RocketMQ 如何保证有序?
参考答案:
发到同一 MessageQueue(分区顺序);全局有序则强制单队列,吞吐下降。消费者要单线程或按队列串行消费,否则仍可能乱序。
测试:同一订单状态消息(创建→支付→发货)乱序到达时状态机是否拒绝非法迁移。
6. Redis 分布式锁线程挂了怎么办?
参考答案:
风险:锁未释放导致死锁;或锁过期后业务仍在跑,另一线程加锁成功造成并发。
手段:
- 锁 value 用唯一 token,释放只删自己的锁(Lua)。
- 合理 TTL;长久任务用看门狗续期(如 Redisson)。
- 业务仍要幂等,锁只是互斥增强。
- 谨慎时钟回拨。
测试用例:持锁进程 kill -9;续期失败;锁过期后原进程仍写;误释放他人锁。
7. 针对一个杯子设计测试用例
参考答案:
展示质量模型即可:
- 功能:盛水不漏、盖子密封、刻度准确。
- 安全:食品级材质、高温不开裂、破损刮手。
- 性能:保温时长。
- 易用:单手开盖、清洗。
- 外观:印刷耐磨。
- 环境:极冷极热、跌落、洗碗机。
- 边界:超满、空杯加热(若宣称可微波则测)。
P0 是安全与不漏。
8. 大表拆成多个小表后怎么测?
参考答案:
- 路由:同一用户/订单是否总落到正确分表;边界 shard key。
- 迁移:双写/校验阶段旧新数据一致;切换后读新。
- 查询:跨分片分页、聚合、排序是否仍正确或产品降级。
- 事务:跨库事务是否改为最终一致,补偿是否测到。
- 性能:单表变小后的 RT;热点分片是否倾斜。
- 回滚:切回方案。
- 运维:扩容加分片时的再均衡。
9. 白盒测试你怎么理解?给代码设计用例
参考答案:
白盒基于内部结构设计用例,关注语句/分支/条件/路径覆盖,补充黑盒看不到的分支。
例如判断链表是否有环的快慢指针:
- 空、单节点、两节点互指、无环长链、环在开头、环在中部、大输入性能。
- 若有调试开关或计数器,也可断言「相遇次数」等。
测开岗常在手撕后立刻问这题,要准备好。
10. MySQL 索引类型?越多越好吗?查询慢原因?
参考答案:
类型:主键(聚簇)、唯一、普通、联合、前缀等;了解覆盖索引、最左前缀。
不是越多越好:写入要维护索引;空间占用;优化器可能选错。应按慢查询与基数来建。
慢查询常见原因:没走索引、索引失效(函数、隐式转换、模糊前导 %)、数据量大、锁等待、统计信息过旧、深分页、回表过多、单机资源瓶颈。
排查:EXPLAIN、慢日志、show processlist,再针对性优化。
11. MySQL 事务隔离级别?脏读、不可重复读、幻读怎么测?
参考答案:
| 级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| READ UNCOMMITTED | 有 | 有 | 有 |
| READ COMMITTED | 无 | 有 | 有 |
| REPEATABLE READ | 无 | 无 | 可能有 |
| SERIALIZABLE | 无 | 无 | 无 |
怎么测:开两个会话,按定义构造——A 更新未提交 B 是否读到(脏读);A 提交后 B 再读是否变化(不可重复读);A 插入新行 B 范围查询是否多行(幻读)。结合 InnoDB 当前默认 RR 与间隙锁说明。
12. 短视频点赞高并发怎么测?要防哪些问题?
参考答案:
功能:点赞/取消、计数展示、是否幂等(连点)。
并发:同用户连点只计一次;多用户点赞计数最终正确(允许短暂延迟要说明)。
热点:明星视频计数器、Redis 与 DB 对账。
安全:刷赞、未登录、越权给他人内容点赞。
体验:弱网连点、列表与详情计数一致。
13. 线程池核心参数有哪些?怎么结合测试验证?
参考答案:
参数:corePoolSize、maximumPoolSize、keepAliveTime、workQueue、拒绝策略、线程工厂。
设置:CPU 密集约核数+1;IO 密集可更大,但看下游。
测试:打满队列触发拒绝策略;任务堆积告警;慢任务占满线程导致接口超时——用压测与线程栈验证。测开常被追问「拒绝后业务是否可感知」。
14. Linux 上磁盘打满或 inode 耗尽怎么排查?
参考答案:
- 空间:
df -h,再du -sh *找大目录;查日志是否无限增长。 - inode:
df -i,小文件过多也会写失败。 - 已删但未释放:
lsof | grep deleted,重启或结束占用进程。 - 测试侧:日志轮转、磁盘水位告警、填满磁盘看服务是否优雅失败。
15. 接口签名防篡改怎么设计测试用例?
参考答案:
- 正确签名通过。
- 改任意参数、改签名、重放旧签名、过期 timestamp。
- 缺字段、乱序拼接(若算法对顺序敏感)。
- 时钟偏移边界。
- 越权:用 A 签名访问 B 资源。
安全测试要在授权环境下进行。
16. 消费消息「至少一次」语义下,业务如何保证正确?怎么测?
参考答案:
至少一次 ⇒ 可能重复消费 ⇒ 业务必须幂等(唯一键、状态机守卫、Redis 去重)。
测:同一消息投递多次;消费成功后再次投递;消费半成功进程崩溃再投递。断言副作用只发生一次(积分只加一次等)。
速查: 多练「MQ/Redis 故障怎么测、购物车场景」;少踩「中间件只背概念」。
