已解析题目
测试开发工程师相关题目
并发怎么控制?
并发控制的核心不是简单加锁,而是在正确性、吞吐量、延迟和资源保护之间做取舍。高质量回答应先说明控制目标,再识别共享资源和一致性边界,最后按单机内存、线程调度、数据库、分布式协调、入口限流和异步削峰等层次选择手段。
死锁产生的条件和排查方式是什么?
死锁本质上是多个执行单元在持有部分资源的同时继续等待对方释放资源,导致所有相关线程都无法向前推进。面试回答要先讲清四个必要条件,再说明排查时如何从现象、线程状态、锁拥有关系、业务调用链和复现路径逐层定位,最后补充预防策略,例如统一加锁顺序、缩短锁范围、使用超时锁和减少共享可变状态。
进程、线程和协程有什么区别?
这道题本质是在考操作系统并发模型的分层理解:进程是资源隔离和资源分配的基本单位,线程是内核调度和 CPU 执行的基本单位,协程是用户态组织异步流程的轻量执行单元。面试时不能只背“进程重、线程轻、协程更轻”,要讲清地址空间、调度权、上下文切换成本、通信方式,以及在 I/O 密集、高并发服务中的取舍。
一个游戏场景题,多线程下更新分数排行榜?
这题核心不是选一个线程安全容器就结束,而是把排行榜拆成两个一致性问题:玩家当前分数的唯一真值,以及按分数排序的索引。多线程更新时,必须保证这两个结构的复合更新具备原子性,否则会出现丢分、重复排行项、旧分数残留、TopN 短暂错误等问题。一个成熟答案应先定义分数语义,再给出单机强一致方案,随后讨论 TopN、锁粒度、读写分离、分片、最终一致和测试验证。
为什么 TCP 建立连接需要三次握手?
TCP 三次握手的目的不是单纯通知双方在线,而是让双方确认彼此的发送和接收能力、同步初始序列号、协商连接参数,并避免历史重复连接请求造成错误连接。两次握手无法可靠完成这些目标。
同题还出现在 2 个公司岗位
TCP 和 UDP 有什么区别?
TCP 和 UDP 的核心区别在于是否提供面向连接、可靠传输、有序交付、流量控制和拥塞控制。TCP 更像一条可靠的字节流通道,适合对完整性和顺序要求高的场景;UDP 更像一次次独立投递的数据报,协议本身不保证到达、不保证顺序,但开销小、时延低、应用层可自由定制可靠性策略。
游戏用 UDP 传输,丢包了怎么办?
UDP 本身不保证可靠、有序和不重复,游戏选择 UDP 是为了把实时性放在第一位,而不是简单地追求不丢包。丢包后的处理要先区分消息类型:位置、朝向、动画等高频状态通常不重传,靠序号、快照、插值、预测和纠偏恢复体验;开火、受击、结算、道具、匹配等关键事件则需要在应用层实现可靠通道,配合 ACK/NACK、选择性重传、冗余或 FEC,在带宽和时延之间做权衡。
讲一下研发流程?
研发流程本质上是把不确定的业务目标,经过需求澄清、方案设计、开发实现、联调验证、测试准入、灰度发布、线上回归和复盘改进,逐步转化为稳定可交付能力的过程。测试开发视角不能只讲测试阶段,而要强调质量左移、自动化保障、风险识别、环境数据建设、发布门禁和线上质量闭环。
哈希冲突怎么解决?
哈希冲突是指不同 key 经过哈希函数计算后落到同一个桶或同一数组位置。回答时不能只背方法名,要先说明冲突不可完全避免,再按数据结构设计思路展开:优化哈希函数、选择冲突处理策略、控制负载因子、必要时扩容,并结合 Java HashMap 的链表转红黑树说明工程实践。
CPU 负载很高但利用率很低,可能是什么原因?
CPU 负载很高但利用率很低,核心原因通常是:load average 统计的是正在运行或等待运行的任务,以及处于不可中断睡眠状态的任务;而 CPU utilization 只反映 CPU 真正在执行用户态、内核态等计算工作的时间占比。因此,很多进程卡在 D 状态、IO wait、磁盘或网络阻塞、锁等待、容器 CPU 配额限制等场景下,系统会表现为 load average 很高,但 CPU 使用率并不高。
针对登录界面设计case?
登录界面测试用例设计不能只停留在用户名密码正确或错误。一个测试开发视角的完整答案,应从业务入口、账号体系、认证链路、安全风控、状态保持、跳转权限、兼容性、性能、可用性、可观测性和自动化回归等维度展开。核心目标是验证用户能正确、安全、稳定地完成登录,同时防止越权、撞库、会话泄露、验证码绕过、弱交互导致误操作,以及高并发下认证服务不可用等问题。
Thread.start() 和 run() 有什么区别?
Thread.start() 的本质是请求 JVM 创建并启动一个新的操作系统线程,使线程对象从 NEW 进入 RUNNABLE,就绪后由调度器安排执行,最终在新线程中回调 run()。run() 本身只是 Thread 类上的普通实例方法,直接调用不会创建新线程,不会改变线程生命周期,只会在当前调用线程里同步执行方法体。
手游一般多少帧率比较合适?
手游合适帧率没有唯一答案,核心判断不是越高越好,而是在游戏类型、目标设备、输入响应、功耗发热和长时间稳定性之间取平衡。轻度休闲、棋牌、放置类游戏稳定 30 FPS 或 45 FPS 往往可以接受;大多数主流手游以稳定 60 FPS 作为推荐目标;射击、竞速、动作、音游等强操作品类可以在高端设备上提供 90 FPS 或 120 FPS,但必须验证温升、电量和帧时间稳定性。
给定数组指针,如何访问第 50 个元素?
这道题考察的是数组下标、指针运算和数组指针类型的边界理解。核心回答应先澄清“第50位”通常指第50个元素,因此数组从 0 开始计数时应访问 arr[49],若给的是首元素指针则写成 *(p + 49)。如果题目说的是下标 50,则对应 arr[50],也就是第 51 个元素。
为什么要做测试?
测试的核心价值不是简单找 bug,而是用系统化方法识别、评估和控制质量风险。它贯穿需求、设计、开发、发布和线上运行全过程,帮助团队更早发现问题、更低成本修复问题、更稳定地交付产品。对于测试开发角色来说,测试还意味着建设自动化、质量门禁、监控告警、回归体系和质量度量,让发布从依赖个人经验变成依赖可验证的数据和机制。
怎么排查性能问题?
排查性能问题不能从单点经验出发,而要先把问题定义清楚:慢在哪里、影响谁、从什么时候开始、哪个指标异常、是否可复现。标准思路是先量化现象,再按调用链从客户端、网关、应用、缓存、数据库、网络和机器资源逐层缩小范围,结合压测、监控、日志、链路追踪、慢查询、线程栈、GC 日志、火焰图以及 CPU、内存、IO、网络等指标定位根因,最后通过修复验证和回归压测证明问题真正解决。
自动化测试流程和工具底层原理是什么?
自动化测试不是把手工步骤录制成脚本,而是围绕需求风险、用例分层、框架能力、工具协议、稳定性治理和持续集成建立一套可重复验证体系。工具底层通常通过浏览器调试协议、WebDriver 协议、移动端自动化驱动或操作系统辅助能力来发现元素、计算可操作状态、注入事件、采集结果并回传执行状态。
指针函数和函数指针的区别?
指针函数和函数指针的核心区别在于“谁是指针”。指针函数本质仍然是函数,只是返回值类型是指针;函数指针本质是指针变量,只是它保存的是某个函数的入口地址。区分它们时,重点看括号优先级、标识符先和谁结合,以及后续是被调用还是被赋值保存函数地址。