测开面经收集(2024-2025)
持续更新中,来源:网络整理 + 真实面试
一、测试基础
1. 软件测试的目的是什么?
发现软件的错误,而不是证明软件正确。测试无法保证程序没有错误,只能发现已存在的错误。
2. 软件测试的原则有哪些?
- 所有测试的标准建立在用户需求之上
- 80-20原则:80%的bug在分析、设计与评审阶段就能被发现
- 尽可能早开展测试,越早发现错误,修改代价越小
- 发现错误较多的程序段,应进行更深入的测试
- 开发人员应避免测试自己的程序
- 严格执行测试计划,排除随意性
3. 测试用例设计方法有哪些?
- 等价类划分
- 边界值分析
- 因果图法
- 正交试验法
- 状态迁移图
- 场景法
- 错误推测法
4. 什么是回归测试?
修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误。
5. 冒烟测试是什么?
在深入测试前,对软件基本功能进行的快速验证,确保主流程能跑通。如果冒烟测试不通过,测试可以打回开发修复。
6. V模型和W模型的区别?
- V模型:测试与开发阶段一一对应,测试在开发之后,出错后回归量大
- W模型:测试伴随整个开发周期,测试与开发同步进行,有利于尽早发现问题
7. 单元测试、集成测试、系统测试的侧重点?
- 单元测试:针对模块/函数级别的代码逻辑正确性
- 集成测试:模块之间的接口、数据传递是否正确
- 系统测试:整个系统是否满足需求规格说明
8. 黑盒测试和白盒测试的区别?
- 黑盒测试:不考虑程序内部结构,只关注输入输出是否正确
- 白盒测试:基于程序内部逻辑结构设计测试用例,如语句覆盖、分支覆盖
9. Bug的等级如何划分?
- 致命:系统崩溃、数据丢失、安全漏洞
- 严重:主要功能丧失、严重性能问题
- 一般:次要功能缺陷、UI问题
- 微小:提示信息不规范、建议性修改
10. 偶现性Bug怎么处理?
- 记录复现步骤和当时的测试环境
- 尝试多种方式复现(不同浏览器、设备、网络环境)
- 查看日志定位问题
- 如无法复现,标注为偶现,持续跟踪
二、接口测试
1. 接口测试怎么做的?
- 获取接口文档,理解接口功能
- 设计测试用例(正常、异常、边界值)
- 参数验证(类型、必填、互斥关系)
- 返回值验证(状态码、数据格式、业务逻辑)
- 使用工具(Postman/JMeter)或代码执行测试
2. GET和POST的区别?
- GET:获取数据,参数在URL中,有长度限制
- POST:提交数据,参数在请求体中,无长度限制,相对安全
3. 为什么要做接口测试?
- 能快速发现非功能层面的逻辑问题
- 提高测试效率
- 相对UI自动化更稳定,减少回归成本
4. 如何判断是前端Bug还是后端Bug?
- 查看接口返回:500+状态码通常是后端问题
- 查看日志:有异常报错则是后端问题
- 页面排版显示问题通常是前端问题
- 使用Fiddler/Charles抓包分析请求响应
5. 接口依赖登录态怎么处理?
- 先调用登录接口获取token
- 将token存为环境变量
- 后续接口请求时在header中携带token
三、自动化测试
1. 自动化测试和手工测试的关系?
谁也不能完全代替对方。自动化适合回归测试、重复性高的场景;手工测试适合探索性测试、体验类测试。
2. Selenium常用定位方式?
- id
- name
- class_name
- xpath
- css_selector
- link_text
- tag_name
3. 如何处理iframe?
需要先切换到iframe内部才能定位其中的元素:
python
driver.switch_to.frame("iframe_id")
# 操作iframe内部元素
driver.switch_to.default_content() # 切回主文档4. 显式等待和隐式等待的区别?
- 隐式等待:全局设置,查找元素时等待一定时间
- 显式等待:针对特定元素设置,满足条件后继续执行,超时报错
5. 自动化测试框架有哪些?
- Python:Pytest、Unittest
- Java:TestNG、JUnit
- Web自动化:Selenium、Playwright、Cypress
- APP自动化:Appium
四、MySQL相关
1. 索引的作用?
提高查询效率,但会降低插入、更新速度。适合大表、查询频繁的字段。
2. 事务的特性(ACID)?
- 原子性:要么全部成功,要么全部失败
- 一致性:事务前后数据一致
- 隔离性:并发事务互不干扰
- 持久性:事务提交后永久保存
3. SQL查询优化方法?
- 避免SELECT *
- 合理使用索引
- 避免在WHERE子句中使用函数
- 使用EXPLAIN分析执行计划
- 大表分页优化
4. HAVING和WHERE的区别?
- WHERE在分组前过滤
- HAVING在分组后过滤,常与GROUP BY配合使用
五、性能测试
1. 什么是性能测试?
在一定的压力情况下,查看CPU、内存、TPS、响应时间、并发用户数等指标,验证系统是否满足性能要求。
2. 性能测试的类型?
- 负载测试:在既定负载下测试系统性能
- 压力测试:测试系统极限和瓶颈
- 并发测试:多用户同时访问
- 稳定性测试:长时间运行是否稳定
3. JMeter常用组件?
- 线程组
- HTTP请求
- 监听器
- 断言
- 定时器
- 前置/后置处理器
4. 性能测试关注哪些指标?
- 响应时间
- 吞吐量(TPS/QPS)
- 并发数
- 错误率
- CPU/内存使用率
六、APP测试
1. APP测试和Web测试的区别?
- 安装/卸载:APP需要测试安装、卸载、升级
- 兼容性:APP要考虑不同机型、系统版本
- 中断测试:来电、短信、网络切换
- 弱网测试:2G/3G/4G/WiFi切换
- 权限测试:相机、通讯录、定位等权限
2. Android四大组件?
- Activity:界面,与用户交互
- Service:后台服务
- BroadcastReceiver:广播接收器
- ContentProvider:数据共享
3. 常用adb命令?
bash
adb devices # 查看设备
adb install xxx.apk # 安装应用
adb uninstall 包名 # 卸载应用
adb logcat # 查看日志
adb pull <远程> <本地> # 从设备拉取文件
adb push <本地> <远程> # 推送文件到设备七、大厂真实面试题
番茄小说一面
- 脚本实现思路,关注哪些点
- 讲讲脚本的实现
- 业务整体流程
- 自动化脚本怎么提升回归效率
- MySQL索引结构
- 算法题:异位词分组
滴滴三面
- 自动化怎么做的
- 举一个印象最深的解决问题案例
- 遇到的一个Bug及解决过程
- 手撕:合并两个有序数组
米哈游一面
- Java接口和抽象类的区别
- 什么是线程安全
- ConcurrentHashMap如何保证线程安全
- TCP四次挥手过程
- TIME-WAIT状态什么时候出现
- 进程、线程、协程区别
- Redis持久化方式
- JMeter压测关注什么
- 手写双向队列
字节一面
- 介绍业务、流程、需求
- 资损防控发现的问题
- 怎么梳理核对要点
- Spring AOP原理
- final关键字作用
八、高频八股文
1. HashMap底层原理?
数组+链表+红黑树(JDK1.8)。通过hash(key)确定位置,链表长度>8转红黑树。
2. ConcurrentHashMap如何保证线程安全?
JDK1.7使用分段锁,JDK1.8使用CAS+synchronized。
3. Spring的AOP是什么?
面向切面编程,将通用逻辑(如日志、事务)从业务代码中分离出来。通过动态代理实现。
4. TCP三次握手?
- 客户端发送SYN
- 服务端返回SYN+ACK
- 客户端发送ACK
5. 进程间通信方式?
- 管道
- 消息队列
- 共享内存
- 信号量
- Socket
持续更新中...