小米小爱测试开发一面:AI 辅助开发与自动化测试流水线
- 轮次
- 一面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
项目相关(实习自动化流水线项目)
- 在项目开发过程中,你是如何利用 AI 来辅助工作的?效果如何?
- 你提到的自动化测试流水线中,哪些是已有流程,哪些是新建立的?
- 这个项目的整体开发周期是多久?你的核心开发时间占多长?后续用户反馈如何?
- 当前这个自动化系统的推广情况如何?具体是怎么使用的?
- 与去年相比,今年上半年你在开发方式上的感受有哪些显著变化?
- 在实验室工作中,AI 工具对你的日常开发有何帮助?
业务相关
- 关于小爱同学的模型评测,是否需要构建专门的评测集?具体是如何开展的?
- 目前自动化测试框架的建设重点是继续扩展新框架,还是更侧重于业务测试?
算法手撕
- 写一个反转单链表,写出核心代码,并讲一下核心算法原理。
反问面试官
- 小爱这边做 AI 评测,是需要构建专门的模型评测集是吗?
- 自动化流水线,后续是继续扩展新自动化框架,还是业务测试占比更高?
个人情况
- 你的毕业论文目前进展如何?节奏是怎样的?
《参考解析》
「你怎么用 AI 辅助开发、效果如何」要拿证据答,不要谈感受。 面试官真正想验证的是两件事:你会不会把 AI 用在刀刃上,以及你怎么确认它没写错。可以按环节讲:需求澄清与任务拆解(让模型把模糊需求拆成可验收条目)、方案设计(先让它列改动清单再动手)、编码(小步生成、每步可编译)、测试用例生成(让它按边界值、异常路径补用例,人再筛)、以及代码 review(自己读 diff,或用另一个模型当第二双眼睛)。「效果如何」必须落到可核对的量上:某个模块开发时间从 3 天压到 1 天、用例编写效率提升、漏测率变化、review 阶段拦下的问题数。再补一句边界:涉及生产数据、并发与权限的改动不交给模型自己拍板,AI 生成的用例要人工筛掉和需求不符的,否则用例数量涨了、有效覆盖没涨。
自动化流水线的「已有 vs 新建」和推广情况怎么讲。 这题考的是你有没有真正接手过一个存量系统。答法是先给一张现状图:旧流程是什么(手工触发、本地跑脚本、结果只留在个人机器上)、痛点在哪(不可复现、没有统一报告、失败没有通知所以经常漏跑),再逐条对应你新建的部分(流水线编排、用例分层、报告聚合、失败通知与重跑、环境与数据的准备/清理)。推广与使用情况要讲事实:当前多少个业务线接入、日均触发多少次、平均耗时、失败率,以及怎么说服别人用——一般是从一个痛点最强的团队试点,把报告和通知做成他们真的会看的样子,再横向复制。被追问「用户反馈如何」时,正负都要说:正向是回归时间缩短、问题在合并前被拦住;负向有误报率高导致被忽略、环境不稳导致的假失败——这也是最能体现你工程判断的部分。
小爱同学这类对话式 AI 的评测集怎么建。 对话助手的评测不能只看单轮准确率,要按能力维度切片:唤醒与指令理解(含方言、口音、噪声场景的语音输入)、多轮上下文与指代消解、口语化与省略表达、拒答与安全(不懂要说不懂,而不是编)、以及端到端体验(首字延迟、打断、连续对话)。评测集来源三条腿:线上真实日志采样并脱敏(最能代表真实分布)、人工按能力矩阵构造(覆盖长尾与边界)、模型生成后人工筛选(扩量快但必须人工定标)。评测方式上,客观项用规则与程序判定(指令是否命中、槽位是否填对、格式是否合规),主观项用 LLM-as-judge 打维度分并抽检校准(注意位置偏差与长度偏差,成对比较要交换顺序),关键场景保留人工标注做基准。评测集要版本化管理、跟着业务迭代扩充,并且每一次上线都跑回归——不然评测集本身会过期。
「继续扩框架还是做业务测试」的取舍。 这是测试开发岗的经典问题,答案不是二选一,而是先看阶段与收益。判断依据可以摆三条:一是框架当前覆盖率与稳定性——如果核心链路的自动化还没打通、误报率还高,先把已有的做扎实,别急着铺新框架;二是新增框架能不能解决现存的最大痛点(比如现在业务是端侧 App,缺的是性能与稳定性自动化,那扩这一类框架就有明确收益);三是投入产出比——框架是一次性投入、长期复用,业务测试是当期风险的直接兜底,两者配比应随版本节奏变化:发版密集期业务测试优先,平台期做框架沉淀。回答时最好带上自己团队的量化现状(多少用例、覆盖多少核心链路、多少靠人肉回归),再给一个 6:4 或 7:3 的判断和理由,比一句「都重要」有说服力得多。
反转单链表:迭代优于递归,边界要写全。 迭代写法用三个指针:prev = null、cur = head,循环里先存 next = cur.next,再 cur.next = prev,然后 prev = cur、cur = next,循环结束返回 prev(不是 cur,因为最后 cur 已经是 null)。时间复杂度 O(n)、空间 O(1)。递归写法 newHead = reverse(head.next); head.next.next = head; head.next = null; return newHead; 更短,但要讲清代价:递归深度等于链表长度,长链表会爆栈,实际工程里更倾向迭代。面试官追问一般有三个方向:空链表与单节点(prev=null 的初始化正好兜住)、部分反转/区间反转(用哑结点 dummy 定位前驱,绝大多数「头节点会变」的题都靠哑结点省掉特判)、以及每 K 个一组反转(先判足 K 个再反转,不足则保持原序,注意接回上一组的尾巴)。写的时候边写边说每步指针的含义,比默写完再解释更容易拿分。