Skip to content

百度测试开发面经(按一二三面拆分 · 可背诵标准回答版)

每题包含:题目 + 标准回答思路 + 加分回答示例,可直接背诵使用。


一、一面(50 分钟左右 · 基础 + 测试思维 + 手撕代码)

一面关键词:基础扎实、能写代码、会从用户角度测试 面试官目的:判断你是不是"合格的候选人"——知识面够不够、手撕能不能写出来


1. 自我介绍

【标准结构 · 1~2 分钟】

面试官好,我叫 XXX,XX 学校 XX 专业硕士在读 / 已毕业。

我有 X 段实习经历,分别在 X 公司做 XX 岗位,主要负责 XXX。

最近一段实习在 X 公司,负责 XX 系统的测试工作,通过 XXX 方式,
将 XX 场景的回归效率提升了 X%。

我对测开这个岗位很感兴趣,也具备一定的编码能力和测试思维,
今天来应聘贵公司的测开岗位,谢谢。

加分点:

  • 提到和目标岗位匹配的技术栈(Python/Java、Linux、数据库)
  • 主动说一个量化结果(比如:自动化覆盖率 80%、回归时间从 2h 缩到 20min)
  • 不要背简历,要说自己真正做过的、印象深刻的事

2. 介绍你做过的项目(最高频必问题 ‼️)

【STAR 法则 · 3~5 分钟】

这个问题几乎 100% 会问,而且会追问细节

我当时负责的是 XX 模块 / 系统,主要背景是 XX(业务场景)。

我具体做了三件事:
1. 针对 XX 场景写了 XX 自动化用例(Python + pytest),
   解决了 XX 问题,最终 XX 场景覆盖率达到 XX%。
2. 参与了 XX 功能的测试用例设计,用 XX 方法(边界值 / 等价类)
   设计了 XX 个用例。
3. 搭建了 XX 工具 / 平台,提升了团队 XX 效率。

遇到的难点是 XX,我是这样解决的:XX。

结果:XX 指标提升了 / 提前 XX 天完成 / Bug 漏测率为 0。

面试官追问方向:

  • "你在这个项目里具体负责什么?"
  • "项目难点是什么?怎么解决的?"
  • "你提到的 XX 技术方案是怎么设计的?"
  • "如果再做一次,你会有什么改进?"

3. 黑盒测试和白盒测试的区别是什么?

【标准回答 · 1 分钟】

黑盒测试:不关心代码内部实现,只看输入和输出。
         从用户角度出发,验证功能是否符合需求。
         优点是容易上手、不需要编程基础,缺点是覆盖率低。

白盒测试:基于代码内部逻辑进行测试,比如语句覆盖、分支覆盖、路径覆盖。
         需要了解代码结构,优点是能找到隐藏的逻辑 Bug,缺点是对测试人员要求高。

灰盒测试:介于两者之间,结合接口或模块的已知部分信息进行测试。

追问 1:如果让你给一个登录功能设计黑盒测试用例,你会从哪些角度考虑?

1. 功能层面:正确账号+正确密码登录成功;错误密码提示"密码错误";
            账号不存在提示"账号未注册";空输入提示"请输入账号/密码"
2. 边界值:账号最短/最长长度、密码最短/最长长度、空格处理
3. 安全:SQL 注入(账号输入 ' or 1=1 --)、XSS 攻击、暴力破解防护
4. 性能:1000 人同时登录响应时间是否 < 2s
5. 兼容性:不同浏览器、不同系统、不同网络环境
6. 用户体验:错误提示是否清晰、不暴露具体是账号错还是密码错(防枚举)

追问 2:测试百度搜索框,你会怎么设计用例?

1. 功能:输入关键词搜索有结果、无结果;搜索特殊字符(<>、表情);空搜索;
         搜索历史记录;搜索建议词点击
2. 边界:超长字符串搜索;多语言搜索;空格处理
3. 相关性:结果排序是否按相关度;搜索结果标题/摘要是否包含关键词
4. 性能:大词搜索 1s 内出结果;翻页响应时间
5. 安全:搜索关键词 XSS;搜索 SQL 注入
6. 兼容性:不同浏览器、手机不同系统
7. 专项:图片搜索、视频搜索的区别;搜索结果屏蔽逻辑

4. SQL:查每个班级的平均成绩前三名

【手撕代码 · 写出来很重要】

sql
-- 方法1:子查询(推荐,逻辑清晰)
SELECT s.name, s.score, s.class_id
FROM student s
WHERE (
    SELECT COUNT(DISTINCT score)
    FROM student s2
    WHERE s2.class_id = s.class_id AND s2.score > s.score
) < 3
ORDER BY s.class_id, s.score DESC;

-- 方法2:窗口函数(如果熟悉)
SELECT name, score, class_id
FROM (
    SELECT name, score, class_id,
           ROW_NUMBER() OVER (PARTITION BY class_id ORDER BY score DESC) as rn
    FROM student
) t
WHERE rn <= 3;

常见追问:

  • GROUP BY + ORDER BY 执行顺序 → GROUP BY 先分组,ORDER BY 后排序
  • WHERE 和 HAVING 的区别 → WHERE 过滤行,HAVING 过滤分组(先 WHERE 后 GROUP BY,再 HAVING)

5. SQL:给 student 表添加一个"父母姓名"字段

sql
ALTER TABLE student ADD COLUMN parent_name VARCHAR(50);

追问:添加字段和删除字段的 SQL 怎么写?

sql
-- 添加
ALTER TABLE student ADD COLUMN age INT;

-- 删除
ALTER TABLE student DROP COLUMN age;

-- 修改字段类型
ALTER TABLE student MODIFY COLUMN age VARCHAR(10);

6. 手撕代码:判断链表是否有环(快慢指针)

【LeetCode 141 · 常见原题】

python
def hasCycle(head):
    if not head or not head.next:
        return False
    slow = head
    fast = head
    while fast and fast.next:
        slow = slow.next        # 走一步
        fast = fast.next.next   # 走两步
        if slow == fast:
            return True
    return False

追问 1:如何找出环的入口?

python
# 相遇后,让一个指针从 head 出发,一个从相遇点出发,都是每次走一步,再次相遇处即为环入口
def detectCycle(head):
    slow = fast = head
    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next
        if slow == fast:
            # 找入口
            ptr = head
            while ptr != slow:
                ptr = ptr.next
                slow = slow.next
            return ptr
    return None

追问 2:如何求环的长度?

python
# 找到相遇点后,慢指针继续走一圈,再次回到相遇点即为环长

7. 手撕代码:字符串反转(去除特殊字符)

python
# 保留字母和数字,去除其他字符
def reverse_only_letters(s):
    chars = [c for c in s if c.isalnum()]
    chars.reverse()
    result = []
    idx = 0
    for c in s:
        if c.isalnum():
            result.append(chars[idx])
            idx += 1
        else:
            result.append(c)
    return ''.join(result)

8. 手撕代码:合并两个有序数组

python
def merge(nums1, m, nums2, n):
    # 从后往前填,避免覆盖
    p1, p2, p = m - 1, n - 1, m + n - 1
    while p2 >= 0:
        if p1 >= 0 and nums1[p1] > nums2[p2]:
            nums1[p] = nums1[p1]
            p1 -= 1
        else:
            nums1[p] = nums2[p2]
            p2 -= 1
        p -= 1

9. Linux:查看指定进程;查看端口占用

bash
# 查看进程
ps -ef | grep python
ps aux | grep nginx

# 查看端口占用
lsof -i:8080
netstat -tlnp | grep 8080

追问 1:查找日志中包含 error 和 warning 的行?

bash
grep "error" app.log | grep "warning"
grep -E "error|warning" app.log

追问 2:查看大文件的最后 100 行?

bash
tail -n 100 app.log

追问 3:查找文件中含有关键词,并显示前后 10 行?

bash
grep -C 10 "keyword" app.log
grep -B 10 -A 10 "keyword" app.log

追问 4:把所有文件的 IP1 替换成 IP2?

bash
sed -i 's/IP1/IP2/g' *
find . -name "*" -exec sed -i 's/IP1/IP2/g' {} \;

10. HTTP 和 HTTPS 的区别

1. 加密:HTTP 明文传输,HTTPS 用 SSL/TLS 加密,更安全
2. 端口:HTTP 80,HTTPS 443
3. 证书:HTTPS 需要 CA 证书(防止中间人攻击)
4. 性能:HTTPS 有握手开销,略慢(但可忽略,现在基本都用 HTTPS)
5. 搜索排名:百度/Google 优先收录 HTTPS 网站

追问:从输入 URL 到页面展示,发生了什么?

1. DNS 解析:浏览器缓存 → 系统缓存 → DNS 服务器 → 获取 IP
2. 建立 TCP 连接:三次握手
3. 发起 HTTP/HTTPS 请求
4. 服务器处理请求,返回响应
5. 浏览器渲染页面(解析 HTML → 构建 DOM 树 → 渲染树 → 布局 → 绘制)
6. 四次挥手断开连接

11. TCP 和 UDP 的区别

1. 连接性:TCP 面向连接(三次握手),UDP 无连接
2. 可靠性:TCP 可靠(确认、重传、排序),UDP 不可靠
3. 传输效率:UDP 更快(没有确认和重传开销)
4. 场景:TCP 适合文件传输、网页、邮件;UDP 适合视频通话、直播、DNS

追问:三次握手过程是什么?为什么不能是两次?

1. 客户端发 SYN → 服务端
2. 服务端回 SYN+ACK → 客户端
3. 客户端发 ACK → 服务端

为什么不能两次:
防止历史连接请求被服务端接受(网络延迟的老旧 SYN 包干扰正常连接)

12. 常见网络协议有哪些?

HTTP/HTTPS(应用层):网页请求
TCP(传输层):可靠传输
UDP(传输层):快速传输
DNS(应用层):域名解析
DHCP(应用层):动态 IP 分配
FTP(应用层):文件传输
SSH(应用层):远程登录

13. Java:int 和 Integer 的区别

1. int 是基本类型,Integer 是包装类型(对象)
2. int 默认值 0,Integer 默认值 null
3. Integer 提供了工具方法(如 Integer.parseInt)
4. 自动装箱:int → Integer(Integer.valueOf)
   自动拆箱:Integer → int(intValue)
5. Integer 有缓存:-128~127 之间的值是同一个对象(节省内存)

追问:Java 的四种权限修饰符

1. public:所有地方都能访问
2. protected:同类、同包、不同包的子类能访问
3. default(不写):同类、同包能访问
4. private:只有同类能访问

14. Python:深拷贝和浅拷贝

浅拷贝:只拷贝一层,嵌套对象仍指向原引用
深拷贝:递归拷贝所有层级,完全独立

import copy
a = [[1,2], 3]
b = copy.copy(a)   # 浅拷贝
c = copy.deepcopy(a)  # 深拷贝

追问:Python 的函数传参是传值还是传引用?

Python 既不是严格的传值,也不是严格的传引用。
对于不可变对象(int, str, tuple):像传值
对于可变对象(list, dict):像传引用(但本质是传递了对象的引用)

15. 一万条数据的表,查询很慢,怎么优化?

1. 加索引:给高频查询字段加 B+ 树索引(但不要加太多,影响写入)
2. 优化 SQL:避免 SELECT *、避免全表扫描、用 EXPLAIN 分析执行计划
3. 分页优化: LIMIT offset, size → 用游标分页( WHERE id > last_id LIMIT n)
4. 读写分离:主库写,从库读
5. 分库分表:按时间或业务 ID 分表
6. 加缓存:Redis 缓存热点数据

16. 如何测试一个电梯?

【功能测试】
- 每层楼的上下按钮是否正常
- 到达目标楼层后开门/关门是否正常
- 超载报警功能
- 门夹到人是否自动弹开

【性能测试】
- 满载运行速度是否符合标准
- 同时响应多个楼层的效率

【安全测试】
- 电梯下坠时自动制动
- 紧急通话按钮是否可用
- 停电时是否有应急电源

【压力测试】
- 上下班高峰期所有楼层同时呼叫

【边界测试】
- 超过最大载重
- 楼层超过/低于有效范围

二、二面(45~60 分钟 · 项目深挖 + 编码 + 系统设计)

二面关键词:你到底有没有真正做过事、能不能解决实际问题 面试官目的:判断你有没有"真实能力"


1. 项目深挖:你的自动化测试是怎么做的?

【标准回答】

我主要做了三件事:

1. 框架选型:选 Python + pytest。。。。。。。
2. 数据驱动:用 YAML/Excel 管理测试数据,一个用例可以跑多组数据,维护成本低。
3. 持续集成:流水线,每次代码提交自动跑自动化用例,失败的用例自动发钉钉通知。

核心成果:用例数从 50 条扩到 200 条,核心场景覆盖率 80%,
        回归时间从 4h 缩短到 30min。

2. 项目深挖:你遇到的最大难点是什么?

【STAR 法则】

难点:接口之间有强依赖,A 接口返回的数据是 B 接口的入参,
      线下环境数据不稳定,导致自动化用例经常失败。

解决:
1. 用 unittest.mock 拦截依赖接口,返回预设数据
2. 搭建独立的测试数据准备接口,在用例执行前自动初始化数据

结果:自动化用例稳定性从 60% 提升到 95%。

3. 如何设计一个接口自动化测试框架?

1. 请求封装:统一封装 HTTP 请求,处理 Cookie/Session、Headers、超时
2. 数据驱动:测试数据与用例分离,用例只关心业务逻辑
3. 用例管理:用 pytest + marker 管理用例分类(smoke、regression)
4. 报告生成:allure 报告,失败截图、日志自动上传
5. CI/CD:Jenkins + Webhook,代码提交自动触发
6. 通知:失败自动发钉钉/邮件通知

4. 性能测试怎么做?

1. 确定目标:QPS、响应时间、并发用户数
2. 工具选型:JMeter(最常用)、Locust(Python)、wrk
3. 场景设计:基准测试、峰值测试、稳定性测试(压 8h/24h)
4. 监控:后端用 Arthas/Prometheus,前端用 Chrome DevTools
5. 分析:找瓶颈(CPU/内存/IO/数据库),逐步调优
6. 出报告:TPS 曲线、响应时间分布、错误率

5. Redis 为什么快?

1. 纯内存操作,没有磁盘 IO
2. 单线程(6.0 之前),避免上下文切换和锁竞争
3. IO 多路复用(epoll),一个线程处理大量并发连接
4. 数据结构经过优化(跳表、压缩列表),查询效率高

6. 手撕代码:两数之和

python
def twoSum(nums, target):
    hashmap = {}
    for i, num in enumerate(nums):
        complement = target - num
        if complement in hashmap:
            return [hashmap[complement], i]
        hashmap[num] = i
    return []

7. 手撕代码:最长回文子串(说思路 + 写核心代码)

python
# 中心扩展法
def longestPalindrome(s):
    if not s:
        return ""
    start, end = 0, 0
    for i in range(len(s)):
        # 单中心
        len1 = expand(i, i, s)
        # 双中心
        len2 = expand(i, i + 1, s)
        maxlen = max(len1, len2)
        if maxlen > end - start + 1:
            start = i - (maxlen - 1) // 2
            end = i + maxlen // 2
    return s[start:end + 1]

def expand(left, right, s):
    while left >= 0 and right < len(s) and s[left] == s[right]:
        left -= 1
        right += 1
    return right - left - 1

8. 手撕代码:最大子序列和

python
def maxSubArray(nums):
    # 贪心:当前和为负数就重新开始
    max_sum = nums[0]
    cur_sum = 0
    for num in nums:
        cur_sum = max(num, cur_sum + num)
        max_sum = max(max_sum, cur_sum)
    return max_sum

9. 手撕代码:相交链表

python
def getIntersectionNode(headA, headB):
    # 长度对齐法:pA 走完 A 再走 B,pB 走完 B 再走 A,相遇即为交点
    if not headA or not headB:
        return None
    pA, pB = headA, headB
    while pA != pB:
        pA = pA.next if pA else headB
        pB = pB.next if pB else headA
    return pA

10. 手撕代码:找出一个数组中出现次数超过一半的数字(摩尔投票)

python
def majorityElement(nums):
    # 摩尔投票:每次删掉两个不同的数,剩下的一定是众数
    candidate, count = None, 0
    for num in nums:
        if count == 0:
            candidate = num
            count = 1
        elif num == candidate:
            count += 1
        else:
            count -= 1
    return candidate

11. 手撕代码:完全二叉树的节点个数

python
def countNodes(root):
    if not root:
        return 0
    # 利用完全二叉树性质:左深度 = 右深度 → 必为满二叉树
    left_depth = getDepth(root.left)
    right_depth = getDepth(root.right)
    if left_depth == right_depth:
        # 满二叉树,直接用公式
        return 2 ** left_depth - 1 + 1  # 左子树节点数 + 根节点 + 右子树递归
    else:
        return countNodes(root.left) + countNodes(root.right) + 1

def getDepth(node):
    d = 0
    while node:
        d += 1
        node = node.left
    return d

12. 场景题:如何测试一个自助贩卖机?

【功能】
- 选择商品、投币/扫码支付、找零、出货是否正常
- 商品卖完后显示缺货提示
- 纸币/硬币识别
- 扫码支付成功但未出货的补偿机制

【性能】
- 连续出货 100 次,机械结构是否正常
- 支付成功到出货的时间是否 < 10s

【安全】
- 恶意退款漏洞
- 机器被撬开的报警

【故障恢复】
- 突然断电后恢复,数据是否正确
- 网络中断时是否能正常出货

13. 场景题:如何测试微信聊天功能?

【功能】
- 发送文字、表情、图片、语音、视频、文件
- 已发送消息撤回(2 分钟内)
- 消息删除
- 已读回执(好友设置开启时)

【兼容性测试(重点追问)】
为什么 App 需要做兼容测试?
→ 不同手机系统版本、不同微信版本、不同分辨率、不同网络环境,
   行为可能有差异。比如 Android 和 iOS 的推送机制就不同。

【边界】
- 发送超长消息(最大字符限制)
- 发送敏感词是否拦截
- 网络中断时消息是否进入发送队列,重连后自动发送

14. 智力题:100 个球,甲乙轮流拿,每次最多拿 5 个,拿到第 100 个赢。

【先拿必胜策略】

关键:每轮"两人拿的总数 = 6" → 100 ÷ 6 = 16 余 4

策略:先拿 4 个,之后每次和对方凑 6(对方拿 X,我拿 6-X)

必胜条件:第一次拿 4 个

【追问:如果拿到第 100 个输呢?

转变为"谁拿到第 99 个就赢"
策略变为凑 6,但起点不同。

15. 场景题:50 个红球 50 个蓝球,放到两个盒子里,摸到红球概率最大。

最优解:
- 第一个盒子放 1 个红球
- 第二个盒子放剩余全部(49 红 + 50 蓝)

摸到红球概率:
P = 1/2 × 1(从盒子1摸到红球)+ 1/2 × 49/99(从盒子2摸到红球)
  = 0.5 + 0.5 × 49/99 ≈ 0.747

16. 场景题:系统容量提升(ABC 三模块各 3 实例)

题目:一个请求先到 A(随机),A 再随机请求 B(1s 超时,最多重试 2 次),
      B 同样最多重试 2 次请求 C,问系统有什么问题?

可能的问题:
1. 雪崩:某一层超时 → 上层重试 → 流量翻倍 → 进一步超时 → 恶性循环
2. 重复请求:重试导致同一个请求被执行多次 → 数据重复(幂等性问题)
3. 资源耗尽:重试期间连接不释放 → 连接池耗尽
4. 延迟累积:A→B→C,每层重试累积延迟,末端超时率很高

解决方案:
- 限流
- 熔断(当某个下游失败率高时快速失败,不重试)
- 重试时加随机延迟(避免所有请求同时重试)
- 保证接口幂等性

三、三面(30~45 分钟 · 主管面 / 综合面)

三面关键词:稳定性、动机、沟通能力、全局思维 面试官目的:判断你是不是"靠谱、值得培养的人"


1. 你对测开的理解是什么?测开需要具备什么能力?

测试开发 = 测试 + 开发,是用工程化手段保障质量。

测开需要的能力:
1. 测试能力:测试用例设计、缺陷定位、质量评估
2. 编码能力:自动化脚本、测试工具、平台开发
3. 工程能力:CI/CD、DevOps、持续交付
4. 软实力:沟通协调(需要和开发、产品频繁对接)、细心耐心

追问:你觉得自己做测开的优势是什么?

1. 我有测试思维,能从用户角度思考问题
2. 我有开发能力,能把测试工作自动化、工程化
3. 我细心、耐心,适合做质量保障工作

2. 你最大的优点和缺点是什么?

【优点】

我做事比较细心、有责任心。
比如我做自动化的时候,会主动考虑边界情况、网络异常,
设计覆盖率较高的用例。

【缺点】

我有时候追求完美,会在一个细节上花较多时间。
但我现在会先用四象限法评估任务优先级,
先把核心功能做好,再优化细节。

3. 你最大的遗憾是什么?

我本科/研究生期间有一段时间,对未来的方向比较迷茫,
没有提前系统学习测试相关的知识和工具。
但后来我明确了自己要走测开这条路,
就主动做了 XXX 项目、XXX 实习,来补足自己的短板。

4. 如果给你一个不熟悉的项目,三天内完成测试,你怎么做?

1. 快速熟悉需求:和产品/开发要文档,1 对 1 沟通,梳理核心流程
2. 识别关键路径:先找核心功能(用户使用频率最高的路径)
3. 设计核心用例:用等价类+边界值,优先覆盖主流程
4. 利用工具:用 Charles/Fiddler 抓包快速定位问题
5. 自动化辅助:对核心路径写简单脚本,快速回归
6. 沟通同步:每天同步进度,有风险及时暴露

5. 如果一个项目 Bug 很多,你怎么办?

1. 分类统计:用 Bug 管理工具(Jira)统计 Bug 类型、严重程度
2. 找根因:是需求不清、开发粗心、还是测试漏测
3. 推动改进:
   - 需求评审更严格(减少需求歧义)
   - 加强开发自测(引入单元测试)
   - 提高自动化覆盖率(减少回归漏测)
4. 风险预警:提前和项目经理沟通,调整上线时间

6. 职业规划是什么?

短期(1~2 年):
- 扎实测试基础,掌握自动化测试、持续集成
- 能独立负责一个模块的测试工作

中期(3~5 年):
- 成为核心测开,具备独立设计测试方案的能力
- 深入某一领域(性能测试/安全测试/测试平台)

长期:
- 测试架构师 or 测试团队负责人
- 能从全局视角设计质量保障体系

7. 你有其他 Offer 吗?你的意向城市是?

【实话实说 + 表达诚意】

目前有 X 个 offer 在推进中,但百度是我最想来的,
因为 XXX(和公司业务/技术栈相关的原因)。

意向城市是 XXX。

8. 你有什么问题要问我?

1. 这个岗位日常主要负责什么业务?
2. 技术栈是什么?(Java 还是 Python?)
3. 测试和开发的比例是多少?
4. 进入后有没有系统的培训?
5. 面试结果什么时候通知?

【三面不要问太技术的问题,重点问团队文化、成长空间】


四、高频手撕代码汇总(百度一面二面必考)

题目难度出现频率
判断链表是否有环★★⭐⭐⭐⭐⭐
两数之和★★⭐⭐⭐⭐⭐
最长回文子串★★★⭐⭐⭐⭐
相交链表★★★⭐⭐⭐⭐
最大子序列和★★⭐⭐⭐⭐
合并有序数组★★⭐⭐⭐
字符串反转(去除特殊字符)★★⭐⭐⭐
完全二叉树节点个数★★★⭐⭐⭐
判断 IP 地址合法性★★⭐⭐
二叉树每层最大数字★★★⭐⭐

五、面试官视角总结

🥇 一面(基础面)→ 你是不是"合格的候选人"
   重点:基础扎实 + 会测试 + 能写简单代码

🥈 二面(技术面)→ 你有没有"真实能力"
   重点:项目真实经历 + 编码能力 + 问题解决思路

🥉 三面(综合面)→ 你是不是"靠谱的人"
   重点:稳定性 + 动机 + 沟通 + 价值观

每题都有标准回答思路,面试时可直接使用。

Powered by VitePress

🔒 需要口令解锁

关注微信公众号
回复关键词 「」 获取口令

解锁后本浏览器长期有效