4196 字
21 分钟
去哪儿 AI 应用开发(测试开发方向)AI 面试复盘

去哪儿 AI 应用开发(测试开发方向)AI 面试复盘#

记录日期:2026-08-31 用途:先完整记录面试中被问到的问题,复盘阶段再逐题分析(考点、参考回答、薄弱点)。

一、面试问题记录#

1. 自我介绍(环节)#

2. Java 中反射是什么,它的作用是?#

3. (追问)Java 中反射机制是如何访问私有对象/私有成员的?#

注:在第一问(反射)到第三问(TCP)之间还应有一道八股题,具体内容忘记了,待回忆后补充到此处附近。

4. Redis 的特点是什么?你在什么业务场景下会使用 Redis?#

5. (追问)如果运行中突发问题,如何保证 Redis 中的任务不丢失?#

6. 请介绍一下 TCP 三次握手的过程,说明为什么采用三次握手而不是二次#

7. (追问)客户端消息发出后在网络中被长时间阻塞,之后才到达服务器端;如果采用两次握手,会有什么后果?#

8. 如果让你对一个多用户的工作流审批模块做测试,你会怎么设计测试用例?#

9. (追问)两个用户在毫秒级延迟内对同一工作流提交了“通过”审批,你要怎么设计测试的基准(预期结果如何判定)?#

10. (追问)如何确认数据库中结果的正确性?#

11. (追问)你之前提到了 Playwright,请讲一下使用该工具做测试的细节#

注:此题还有更多追问,暂未回忆起来,后续想起再补充。

12. 如何向开发同事反馈你测试出来的问题?#

注:此题有一部分追问记不清了,后续想起再补充。

13. 介绍一下你在工作中的 AI 相关开发经历#

14. (追问)围绕该 AI 项目的一系列系统架构与优化追问#

注:具体子问题记不清,后续想起可展开补充(复盘时按“架构设计 + 性能/成本优化”两条线准备)。

15. 最近半年你是否有学习 AI 相关内容的开发,并投入到生产的项目?#

16. (追问)你为什么使用 CrewAI 而不是 LangChain 等其他框架?#

17. (追问)整个项目开发过程中有没有遇到什么问题?你是如何解决的?#

18. (追问)一系列优化追问,以及你是如何评测你的项目效果的?#

注:优化类追问具体子问题记不清;效果评测是独立考点(复盘时重点准备:评测指标、评测方法)。


二、面试结构分析#

这场 AI 面试的提问路径非常清晰,是一条“测开基本功 → 测试设计实战 → 协作素养 → AI 应用能力”的漏斗:

环节题目考察意图
开场自我介绍表达结构化、亮点前置
八股层反射、Redis、TCP(另有一道待补充)Java 后端与网络基础是否扎实
实战层工作流审批测试设计 + 并发/数据库/工具追问链测试思维深度:会不会只停留在功能用例
素养层如何向开发反馈问题缺陷管理规范、沟通协作
岗位核心层AI 项目经历、框架选型、踩坑、效果评测AI 应用开发的真实落地能力

三个关键观察:

  1. 每道主题都挂 2~3 层追问,且追问方向固定:主线是“是什么 → 怎么用 → 异常/极端场景”。八股的追问(私有成员、任务不丢失、失效 SYN)全是主线的“边界篇”。
  2. 测试设计题是分水岭:前三问考用例设计方法论,追问考并发测试与数据校验。能答出“预期结果由业务规则定义、断言下沉到数据库终态”就已经超过大多数候选人。
  3. AI 项目环节占了后半场,问法是“选型对比 + 踩坑 + 评测”三件套——这正是测试开发方向的 AI 岗最看重的:不只把 demo 跑起来,还要能证明它靠谱。

三、逐题复盘#

第 2~3 题:Java 反射#

考点:反射定义与运行时机制;反射在框架/测试工具中的实际作用;setAccessible 与访问控制。

参考回答骨架:

  1. 一句话定义:程序在运行时动态获取任意类的信息(字段、方法、构造器、注解),并能实例化对象、调用方法,而无需在编译期确定类型。
  2. 入口是 Class 对象,三种获取方式:类名.class、实例.getClass()、Class.forName("全限定名")。
  3. 作用要结合岗位说:
    • 框架基石:Spring IoC 根据配置/注解反射创建 Bean、MyBatis 结果映射、动态代理(AOP 的底层);
    • 测试开发强相关:JUnit 扫描 @Test、Mockito 生成 mock 对象、参数化注入,本质都是反射 + 注解处理。
  4. 补一句代价显成熟度:反射调用无法被 JIT 充分优化、破坏封装、可读性差,高频路径应缓存 Method/Field 对象。

追问“如何访问私有成员”:

  • getDeclaredField/getDeclaredMethod 能拿到本类声明的所有成员(getXxx 只能拿 public 及继承的 public);
  • 拿到后调用 setAccessible(true) 关闭运行时访问检查,即可读写 private 成员;
  • 加分点:Java 9+ 模块系统对跨模块反射收紧,需 --add-opens 放开;反射私有是“打破封装”的手段,测试里可用于注入 mock、校验内部状态,生产代码慎用。

常见误区:只背“运行时获取类信息”却举不出一个框架实例;getField 与 getDeclaredField 混为一谈。

第 4~5 题:Redis#

考点:核心特性与典型场景;更深一层——把 Redis 当任务队列时的可靠性边界。

参考回答骨架:

  1. 特点:基于内存的 KV 存储;命令执行单线程 + IO 多路复用(6.0 引入多线程 IO);数据结构丰富(String/Hash/List/Set/ZSet/Stream);支持持久化、主从/哨兵/集群;单 key 十万级 QPS。
  2. 场景要“结构 + 一个具体例子”:
    • 缓存(热点数据、会话共享)——顺带准备缓存穿透/击穿/雪崩,几乎必被追问;
    • ZSet 排行榜、计数器/限流、分布式锁(SET NX + 过期 + 续期)、List/Stream 简单队列;
    • 结合业务举一个:如“机票搜索页热点航线缓存,读多写少,TTL 加随机过期防雪崩”。

追问“突发问题如何保证任务不丢失”——建议分三层作答:

  1. 持久化:RDB 定期快照(会丢最后一段)、AOF 追加日志(appendfsync everysec 最多丢约 1 秒)、4.0+ 混合持久化。先亮结论:Redis 能把丢失窗口压到很小,但做不到零丢失。
  2. 高可用:主从复制 + 哨兵自动故障转移 / Cluster 分片,避免单点整体丢失。
  3. 任务语义(真正的考点):若“任务”指用 Redis 做队列,要指出 BRPOP 这类“弹出即消费”模式在 worker 崩溃时任务即丢失;可靠做法:
    • Stream + 消费组:ACK 制,未 ACK 进 PENDING 列表可重投;
    • 或 BRPOPLPUSH 备份队列模式;
    • 结论句:可靠性要求高的任务流,Redis 只做缓冲层,落地应对接专业 MQ 或数据库事务表,且消费侧幂等。

第 3 层答出来,等于告诉面试官“我知道 Redis 的能力边界”,比背特性更有说服力。

第 6~7 题:TCP 三次握手#

考点:握手流程与状态机;两次握手为什么不够——追问正是标准答案的展开。

参考回答骨架:

  1. 过程(带序号和状态):
    • 客户端发 SYN=1, seq=x,进入 SYN_SENT;
    • 服务端回 SYN=1, ACK=1, seq=y, ack=x+1,进入 SYN_RCVD;
    • 客户端回 ACK=1, seq=x+1, ack=y+1,双方 ESTABLISHED。
  2. 为什么三次:两次握手下服务端无法确认“自己的发送能力”和对方的接收能力;更致命的是无法防止失效的连接请求建立连接;同时第三次握手完成双方初始序列号(ISN)的确认——ISN 随机化还能防历史报文混入新连接、防序号预测攻击。

追问“长时间阻塞的报文 + 两次握手的后果”(经典场景题):

  • 客户端早先发出的 SYN 在网络中滞留,客户端超时放弃(可能又发了新连接);
  • 两次握手下:失效 SYN 迟到到达服务端,服务端回 ACK 后直接进入 ESTABLISHED,单方面分配连接资源、等待数据——但客户端根本不认这个连接,不会发数据;
  • 结果:服务端维持一批“僵尸连接”白白消耗资源,大量失效 SYN 会堆积耗尽半连接队列(也是 SYN Flood 的原理性入口);
  • 三次握手下:客户端收到莫名其妙的 SYN+ACK,发现对不上自己的连接,回 RST,服务端立刻释放——第三报文给了客户端“否决权”。
  • 可加分:SYN Flood 与 SYN Cookie 防御。

第 8~11 题:工作流审批模块测试设计(本场分量最重的题组)#

考点:用例设计方法论覆盖度;并发测试与测试基准(oracle)设计;结果校验下沉数据库;UI 自动化工具的工程细节。

主问题建议按“澄清需求 → 方法论 → 分类展开 → 非功能”四段答:

  1. 先澄清规则再设计:流程形态(串行/并行/会签/或签)、节点操作(通过/驳回/转办/加签/撤回)、权限、超时策略、通知方式——先问清规则是测试设计的第一步,这句话本身就是加分项。
  2. 方法论落到具体维度:
    • 等价类/边界值:审批意见长度 0/1/上限、附件类型与大小、超时时间边界;
    • 状态迁移:画审批单状态机(草稿→审批中→各节点→通过/驳回/撤回/作废),覆盖所有迁移边 + 验证不可达迁移(已通过的不能再审);
    • 场景法:正常全流程、中途驳回重提、转办后原审批人失效;
    • 权限矩阵:角色 × 节点 × 操作三维组合,重点打越权(无权限审批、申请人自审、非当前节点审批);
    • 异常:重复提交、网络中断重试、服务重启恢复。
  3. 非功能:并发审批(正呼应追问)、性能(流转响应时间、批量查询)、多端入口(PC/移动审批)。
  4. 自动化策略:接口层为主覆盖状态机回归,UI 层只留核心路径冒烟——顺势引出 Playwright。

追问“毫秒级并发双通过,怎么设计测试基准”——坑在“基准”二字:

  • 第一步不是写用例,而是确认业务规则:并发双通过到底是“先到先得、后者拒绝”,还是“或签场景双双计入”?预期结果必须来自业务定义,不能由测试臆断——这句话就是面试官想听的“基准”。
  • 构造真并发:不能靠手动两次点击,用 JMeter/多线程 + CyclicBarrier/CountDownLatch 对齐发射点,从接口层发起,绕开 UI 的时序抖动。
  • 判定基准(以先到先得为例):
    • 数据库终态:审批流水恰好新增一条,单据状态 = 通过,无重复、无脏数据;
    • 后到方收到明确冲突响应(409/业务错误码),而不是 500 或静默丢弃;
    • 幂等性:同一请求重复提交不产生副作用。
  • 观察服务端实现方式:悲观锁/乐观锁版本号/分布式锁/唯一索引兜底,检查有无死锁与锁等待超时。

追问“如何确认数据库中结果的正确性”:

  • 断言下沉:不只看接口返回,脚本直连数据库做终态断言——预写校验 SQL(流水条数、状态字段、审批人、时间戳、审计字段);
  • 一致性对账:单据当前状态应与流水推演结果一致(状态机重放校验);
  • 事务完整性:并发失败方的中间写入是否回滚,有无半提交;
  • 取证能力:用 binlog / update_time 排序还原两条请求的真实执行顺序,与响应码交叉验证。

追问“Playwright 细节”(准备这些点):

  • 选型理由:自带 auto-waiting(元素可操作才行动,省掉大量显式等待)、单套 API 驱动 Chromium/Firefox/WebKit、codegen 录制生成脚本、trace viewer 失败取证;
  • 工程细节挑真用过的说两三个:语义化定位(getByRole/getByText 优先,忌 xpath 硬编码)、storage_state 复用登录态、route() 网络拦截做 mock/弱网、失败自动截图 + trace、CI 无头运行与 BrowserContext 级并行隔离;
  • 诚实边界:没用的特性直说“没用过,文档方案是 XX”,比硬编安全。

第 12 题:如何向开发反馈问题#

考点:缺陷管理规范 + 沟通协作。

参考回答骨架:

  1. 一条合格 bug 单 = 标题(现象 + 模块)+ 环境(版本、环境、账号、数据)+ 可复制的步骤 + 预期 vs 实际 + 证据(日志、截图/录屏、接口报文)+ 严重程度 + 复现概率(偶现必填尝试次数)。
  2. 偶现 bug 提单前先自证:翻日志定位时间点、抓包看请求、排除环境/数据差异,把范围缩小到“哪一层、什么条件”再提单——给线索,不下结论(“怀疑并发下没加锁,日志里有 XX”,而不是“你们代码写错了”)。
  3. 提单后跟进闭环:关注处理进展、修复后回归验证、通过再关单;被打回用证据说话。
  4. 姿态与工具:对事不对人,走缺陷平台(JIRA/TAPD)沉淀,便于统计复盘。

第 13~18 题:AI 项目深挖(岗位核心环节)#

考点:经历真实性(一追问就露馅)、选型判断力、工程踩坑、效果评测——最后一项正是“测试开发 × AI”的交叉点,几乎是必然考点。

Q13/Q15(AI 经历 / 近半年学习落地)——回答结构:背景与目标 → 架构与个人职责 → 难点与解决 → 结果量化。Q15 还隐含考察学习持续性:要给出近半年的具体动作和产出,而不是“在学”。

Q16 为什么 CrewAI 而不是 LangChain——原则是场景匹配,不踩一捧一:

  • 参考话术:项目形态是多角色协作流水线(角色职责与工具明确),CrewAI 的 Agent/Task/Crew 抽象正好对齐,开箱即用、胶水代码少、能快速验证效果;LangChain 组件更底层更灵活(RAG 生态、链式组合),适合深度定制控制流,但抽象层级低、版本迭代快、样板代码多。
  • 加分:主动提 LangGraph——把编排建模成状态机/图,复杂条件分支和人工介入场景比 CrewAI 更合适。能说清“我选的框架边界在哪”,比“X 最好”高一个层级。

Q17 项目中的问题及解决——准备 2~3 个真实 STAR,方向参考:输出不稳定/幻觉(结构化输出 Schema 校验 + 失败重试 + 低置信度转人工)、工具调用参数错误(JSON Schema 约束 + 参数校验兜底)、上下文/成本失控(历史裁剪、prompt 模板化、缓存)、多 Agent 死循环(最大轮次 + 超时熔断)。结构:现象 → 定位过程 → 方案 → 效果数据。

Q18 如何评测项目效果(测开方向的重头戏):

  • 先指标后方法:
    • 质量:任务完成率/准确率、关键信息抽取 P/R、幻觉率、工具调用成功率;
    • 性能与成本:首 token 延迟、P95 响应、单任务 token 成本;
    • 稳定性:失败率、重试率、人工接管率。
  • 方法:构建标注评测集(典型 + 边界 + 对抗 case)定基线 → 每次改 prompt/换模型跑回归评测集对比 → LLM-as-a-judge 辅助评分(抽样人审校准)→ 线上灰度 A/B + badcase 回流补进评测集。
  • 点题句:LLM 应用的“回归测试”本质就是评测集 + 指标门槛——这正是测试方法论迁移到 AI 的地方,一句话把面试前后半场串起来。

四、我的反思#

Java 八股这一块相对薄弱,前一个月精力主要放在力扣刷题、项目完善、小应用开发上了,可能需要近期补充一些八股知识。

去哪儿 AI 应用开发(测试开发方向)AI 面试复盘
https://emiblog.vercel.app/posts/qunar-ai-interview-review/
作者
emicyx
发布于
2026-08-31
许可协议
CC BY-NC-SA 4.0