蔚来 测试工程师 校招面经:三轮技术车轮战 + HR 面,已拿 offer
- 轮次
- 三轮技术面+HR面
- 结果
- 已offer
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
第一面
- 请做一下自我介绍。
- 介绍一下你的实习项目。
- 批量并发事务读取数据库表造成死锁,怎么处理?
- 介绍一下 Java:它是编译型语言还是解释型语言?类加载过程说一下。
- 在浏览器里输入 URL 地址,一直到最后渲染回来,中间发生了什么?用到了哪些协议?
- Java 中 MySQL 数据库所在机器 CPU 使用过高,怎么定位?
- 什么是栈溢出、OOM?
- 代码题:从千万条数据中取出最大的前五个。(讲思路)
- 测试题:给一场直播发布会设计测试点和测试用例。
- 你知道哪些测试框架?
- 使用索引时的回表问题是什么?
- 解释一下刚才提到的 keepAlive。
- 一个 HTTP 请求中包含哪些信息?
第二面
- 请做一下自我介绍。
- 介绍一下你的实习项目。
- 谈谈你对测开(测试开发)的理解。
- HTTPS 的加密过程是怎样的?
- 批量并发事务读取数据库表,表涉及连表查询造成死锁,怎么处理?
- 你对什么开发语言比较熟?
- 代码题:两数之和,暴力解法之后如何优化?(hashmap)
- 除了 Java,你还会哪些开发语言?前后端都行。
- 你觉得实习接触的测试平台和别的公司用的测试工具有什么区别?测试工具、测试平台、测试框架有什么区别?
- 实习项目中涉及向生产环境数据库表插入、更新数据,会去求证这部分数据的反馈吗?
- 数据库隔离级别有哪些?脏读、幻读分别是什么?
第三面
- 说说你项目中最熟悉的一个项目。
- 实习项目深挖:适应场景、提测、执行等等。
- Java 中的内存模型是什么?
- MyBatis 用过吗?需要哪些文件,作用是什么?
- 为什么要用抽象类的抽象方法,用空白方法(空实现)不行吗?
- 代码题:两个数组,去除里面的重复项。
- 类加载过程是什么?
- 联合索引(a 字段、b 字段)在哪些情况下索引有效、哪些情况下失效?为什么?
- 数据库中主键索引跟非主键索引的区别是什么?
- SQL 题:员工表只有 id、name 两列,输出重名的员工。
- Java 中接口跟抽象类的区别是什么?
第四面(HR 面,3 位面试官,约 15 分钟)
- 请做一下自我介绍。
- 家庭情况怎么样?
- 工作地点怎么选?
- 期望薪资是多少?
- 你对公司有哪些了解?
- 反问环节。
《参考解析》
并发死锁:两轮都问,回答要有定位到消除的完整链条
并发事务读同一批表出死锁,根因几乎都是「加锁顺序不一致 + 锁范围过大」形成循环等待。处理分四层说:① 先靠数据库自愈——InnoDB 默认开启死锁检测,检测到就回滚代价较小的事务,业务侧必须能捕获 Deadlock found when trying to get lock; try restarting transaction(错误码 1213)并带随机退避重试,而不是直接把错误抛给用户;② 定位——MySQL 8 用 SHOW ENGINE INNODB STATUS 看 LATEST DETECTED DEADLOCK 段,或查 performance_schema.data_locks、information_schema.innodb_trx 看谁持锁谁等锁,最后一条 SQL 往往就是元凶;③ 消除成因——让所有事务按同一顺序访问表和行(这就是「规定事务执行顺序」的正确用法)、拆小大事务缩短持锁时间、连表查询给关联字段加索引(没索引时行锁会扩大成锁大量行甚至扫全表)、业务允许时把隔离级别降到 RC 减少间隙锁、只锁必要的行;④ 业务兜底——用版本号乐观锁或串行化队列替代长事务。特别要纠正一种答法:把多张表塞进同一个事务「一起锁定」只会同时占更多资源,死锁概率更高,正确方向是顺序一致、范围更小。
Java 与类加载:编译型还是解释型、JMM、接口与抽象类
Java 两头都占:源码经 javac 编译成字节码(编译),运行时由 JVM 解释执行,热点代码再由 JIT(C1/C2)编译成本地机器码,所以是「编译 + 解释 + 即时编译」的混合模型,这也是它跨平台又逐步接近原生性能的原因。类加载走「加载 → 验证 → 准备 → 解析 → 初始化」,准备阶段给静态变量分配内存并赋类型零值,初始化阶段执行 <clinit>(静态变量赋值与静态代码块),加载采用双亲委派,保证核心类不被篡改、同一个类只被加载一次。注意别把 JMM 和运行时数据区混答:JMM 是规范,定义线程与主内存的交互和 happens-before 规则,靠 volatile、synchronized、final 保证可见性与有序性;堆、栈、方法区是内存结构。栈溢出是递归过深或栈帧过大(StackOverflowError),OOM 是堆、元空间、直接内存等区域耗尽(OutOfMemoryError 会带 Java heap space、GC overhead limit exceeded、Metaspace 这类原因),排查要靠 -XX:+HeapDumpOnOutOfMemoryError 抓 dump 再用 MAT 分析。接口与抽象类的区别落在「约束强度」:接口是能力契约、可多实现、字段都是常量、方法默认 public abstract(Java 8 后可 default/static);抽象类表达「是什么」,可带状态和构造器、单继承,用抽象方法强制子类实现;「空白方法行不行」的答案是——空实现会丢编译期约束,子类忘了重写也不报错,属于把错误推迟到运行时。
索引与 SQL:回表、联合索引最左前缀、两种索引的区别
回表是二级索引的叶子节点只存索引列和主键值,查询需要其他列时要拿主键回聚簇索引再查一次;减少回表的办法是覆盖索引(把 select 的列都放进联合索引)、索引下推(ICP)让过滤在存储引擎层提前做。联合索引 (a,b) 的最左前缀:where a=?、where a=? and b=?、where a=? order by b 都能用;单独 where b=? 用不上;a 用了范围条件(a > ?)之后,b 只能用 ICP 过滤、不能再用索引的有序性;对索引列做函数运算、隐式类型转换(字符串列传数字)、like '%x' 前缀模糊会让索引失效。主键索引即聚簇索引,叶子节点存整行数据,一张表只有一棵,决定了数据的物理组织;非主键(二级)索引叶子存索引列加主键,查非索引列要回表。重名员工的 SQL 有两种写法:select name from emp group by name having count(*) > 1; 或 select name, count(*) c from emp group by name having c > 1;——注意过滤聚合结果只能用 having,不能写进 where。
测试岗的专业问题:测试点设计、测试框架与平台、请求与协议细节
直播发布会的测试点按五类铺开最稳。功能:开播与推流、首帧与延迟、连麦、礼物打赏与到账、弹幕发送与审核、回放录制、分享进入、登录与被禁言等权限差异;兼容:iOS / Android / Web / 小程序、主流机型与系统版本、弱网(3G、丢包、切换网络)、不同分辨率与码率自适应;性能:并发观看人数上限、卡顿率、音画同步、CPU 与内存与耗电发热、CDN 节点切换;异常:断网重连、主播异常退出、推流中断恢复、支付中途失败与重复下单、弹幕刷屏与敏感词、突发扩容;体验:清晰度切换、音量与静音、字幕延迟。用例按「前置条件 + 步骤 + 预期结果 + 优先级」写,并区分冒烟、回归、边界。测试工具、平台、框架的区别用一句话定位:框架是写用例和执行的基础设施(JUnit、Pytest、TestNG、Playwright、Appium),工具解决单点环节(Postman、JMeter、Charles 抓包),平台把用例管理、执行调度、环境管理、报告与告警串成流程并和 CI 打通——框架面向代码,工具面向操作,平台面向协作。HTTPS 的加密过程:TCP 握手后做 TLS 握手,客户端发 ClientHello(版本、密码套件、随机数),服务端回 ServerHello 与证书,客户端校验证书链与域名有效期,再用 ECDHE 交换参数各自算出会话密钥,之后用对称加密(AES-GCM)传数据;非对称只用于握手和身份认证,业务数据走对称,因为快几个数量级。HTTP 请求里有请求行(方法、URL、版本)、请求头(Host、User-Agent、Accept、Cookie、Content-Type、Authorization)、空行和请求体;被问到 keepAlive 时答「TCP 连接复用,减少握手开销,但连接被中间层掐断时要靠心跳或流式协议保活」。
代码题与场景题:TopK、去重、CPU 高定位
千万数据取最大前五,千万别全排序:内存放得下就维护一个大小为 5 的最小堆,遍历一遍 O(n log 5),堆顶就是当前第 5 名,来了更大的就替换堆顶;数据在文件里、内存放不下就分治——按 hash 或取值范围切成若干小文件分别求 TopK 再合并;允许近似时可以用 Count-Min Sketch 之类。两数之和的优化是空间换时间:用 HashMap 存「值 → 下标」,遍历时先查 target - 当前值 是否在表里,一次遍历 O(n);要主动说清不能重复使用同一元素(先查再存)。两个数组去重要先问清约束:允许额外空间就用 HashSet,一趟 O(n),但要说明它不保序;要求原地且限制空间就排序加双指针,O(n log n);如果只是「去除重复项」的展示效果,还要问清是否保留首次出现顺序。CPU 使用率过高按「进程 → 线程 → 栈/语句」三步定位:top 找到是 mysqld 还是应用进程,top -Hp <pid> 找最耗 CPU 的线程并把线程号转十六进制去 jstack 里搜栈;MySQL 侧看 show full processlist 找执行时间长或卡在 Sending data 的 SQL,再 explain、查慢查询日志,常见原因是缺索引导致的全表扫描、无谓的排序与临时表、锁等待、连接数打满。
HR 面:基本信息与谈薪,口径要和投递材料一致
第四轮主要聊基本信息、意向与谈薪,时间短但一样会筛人。期望薪资给区间不给单点,依据放在城市生活成本、同岗位市场价和自己的实习与项目经历上,别虚报——报到明显高于市场又说不清理由,扣分比报低更多;手上还有其他流程可以适度提,但不要夸张。家庭情况、工作地点这类问题,面试官关心的是稳定性和到岗可行性,回答要给出可执行的态度(能到岗时间、是否接受异地与出差),并且和网申时填的信息保持一致,前后矛盾比答案本身更致命。反问别浪费:问团队的技术栈与业务方向、新人培养与 mentor 机制、面试流程还有几轮,比「公司文化怎么样」有用得多。