感谢大家的莅临,篇幅较长,请大家耐心看完,建议收藏慢慢看,另外文末给大家准备了面试资料(面试题加学习资料等),需要自取!
本科毕业于武汉某二本普通院校,本人 16 年开始工作,曾任职上海哔哩哔哩科技有限公司(B 站)高级测试开发,目前在一家云计算公司担任测试工程师,日常工作比较繁杂,主要负责功能测试,自动化测试,性能测试以及测试工具的开发。
工作六年左右,参与大大小小的面试将近 100 多场,拿到过货拉拉、众安保险、得物、网易和百度等公司的 offer,所以在测试工程师日常学习、面试等方面具备丰富的经验,又加上最近 “金三银四”,所以想把最近几年积攒的部分面试题和答案分享给大家,后期看文章热门程度,再陆续分享其他面试题和答案。
一.基础题
1.测试用例你一般是怎么设计的,怎么可以提高覆盖率?
有没有形成自己的 一套方法论?
答:这些都是基础的理论题。
2.电梯、朋友圈、红包、登录功能是怎么测试的?用例设计
答:这些都是基础的用例设计题目,网上一大堆,建议面试前多准备几个,总结其中的规律。
3.假如让你独立负责一个大项目,你是如何开展测试的?
答:可以理解为如何保障产品质量,从需求分析理解、用例设计和评审、测试 bug 提交和跟踪、上线验证、项目复盘等等方面回答。
4.接口测试你是怎么做的?都发现了哪些问题,详细说下定位分析过程。
答:如截图:
遇到问题如截图:
5.测试过程中你遇到最难的一个技术问题是什么?如何解决的?
答:面试前重点准备一个类似的题目,比如开发了测试工具,提高效率,搭建自动化框架或平台,引入了测试覆盖率工具、代码检测工具等等
6.你们整个测试流程是怎样的?
答:大致分为以下几种测试需求分析阶段、测试计划阶段、测试设计阶段、测试执行阶段、测试评估阶段。
二.网络相关
http 和 https ,tcp 和 udp 协议区别,网络七层模型,
答:HTTPS 和 HTTP 的区别主要如下:
tcp 和 udp 协议区别:
网络七层模型:
2.tcp 为啥三次握手,为啥四次挥手,
答:因为当 Server 端收到 Client 端的 SYN 连接请求报文后,可以直接发送 SYN+ACK 报文。其中 ACK 报文是用来应答的,SYN 报文是用来同步的。但是关闭连接时,当 Server 端收到 FIN 报文时,很可能并不会立即关闭 SOCKET,所以只能先回复一个 ACK 报文,告诉 Client 端,“你发的 FIN 报文我收到了”。只有等到我 Server 端所有的报文都发送完了,我才能发送 FIN 报文,因此不能一起发送。故需要四步握手。
3.tcp 拥塞算法、滑动窗口、重传机制、粘包和拆包
答:滑动窗口协议(Sliding Window Protocol)、重传机制详情见
TCP 滑动窗口/快速重传机制Shawei的博客-CSDN 博客_tcp 快速重传机制 。
拆包 :TCP 直接将应用层数据包(可以认为就是一个数组)发给接收方,并且根据 TCP 协议,TCP 会将每个发送的数据包编号(序列号),发送完一个序列号后,接收端收到会回复该序列号,代表已经被接受,but 接收端有自己的 TCP 缓存区,它会将多个包积累在一起再进行处理,这样的结果是导致包与包之间 “无缝连接”,即所谓的” 粘包 “
粘包:针对此问题,就有了一些解决办法:哪每个包长度固定:这样接收端就可以每隔一定长度进行拆包,但缺点是浪费资源,加入头部信息:每个数据包前加入该数据包中数据的长度值,这样接收端从缓存中读取时,通过读该头部信息,知道了每个包的长度,这样就能拆包
4.一些抓包工具如 fidder、tcpdump 的使用,
答:网上都有现成的使用教程,可以选一两篇去操作下。
5.浏览器输入百度网址发生了什么?DNS 解析过程
答:这个问题比较宽泛,整个流程也比较长,涉及到网络 7 层模型、dns 解析、tcp/ip 协议簇,三次握手、负载均衡、集群架构、数据库,linux 系统状态、进程切换等等方面,看你自己对哪块比较熟悉,重点去说
6.说下 cookies,session 鉴权机制?为什么要引入这套机制?
答:引入原因:HTTP 是无状态的协议(对于事务处理没有记忆能力,每次客户端和服务端会话完成时,服务端不会保存任何会话信息):每个请求都是完全独立的,服务端无法确认当前访问者的身份信息,无法分辨上一次的请求发送者和这一次的发送者是不是同一个人。所以服务器与浏览器为了进行会话跟踪(知道是谁在访问我),就必须主动的去维护一个状态,这个状态用于告知服务端前后两个请求是否来自同一浏览器。而这个状态需要通过 cookie 或者 session 去实现。
三.数据库重中之重
简单
1、基本的增删改查语句;
答:insert、delete、update、select sql 编写。
2、多表联合查询、左右连接区别、子查询等;
答:网上都有教程,可以自行查找,在这里不做赘述。
3、聚合、分组、排序 sql 语句编写、having 和 where 区别
答:表数据
sql 编写:
SELECT
class 班级名称,
COUNT(*) 每个班级人数,
MAX(grade) 最高分,
MIN(grade) 最低分,
SUM(grade) 班级总分,
AVG(grade) 平均分
FROM
student
where age <20
GROUP BY
class
HAVING SUM(grade) >=34
ORDER BY
最高分 DESC
执行结果:
4、char 和 varchar 区别等
答:varchar;表示变长字符串,char;定长字符串。
5、三范式是什么?
答:第一范式 (确保每列保持原子性)、第二范式 (确保表中的每列都和主键相关)、第三范式 (确保每列都和主键列直接相关,而不是间接相关)
中级
1、说一下 sql 是怎么优化的?
答:show variables like ‘%quer%’; 查询慢查询日志相关的设置,找出慢查询的 sql ,用 explain 查询 sql 的执行计划,该加索引的加索引(要知道索引正确使用场景如下面试题),尽量少 连接查询、select *、避免类型转换,减少回表次数。
2、索引的概念、类型,优缺点分析、索引应用场景和索引失效场景;
答:索引是帮助 mysql 高效获取数据的数据结构
优点:
a)可以保证数据库表中每一行的数据的唯一性,
b)可以大大加快数据的检索效率,
c)加速表与表之间的连接,
d)在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
f)通过使用索引对数据进行排序,降低数据排序的成本,降低 cpu 的消耗,可以在时间查询的过程中,使用优化隐藏器,提高系统的性能。
缺点:
a) 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
b) 索引会占据磁盘空间。
c) 以表中的数据进行增、删、改的时候,索引也要动态的维护,这就降低了整数的维护速度。
索引类型:
主键索引:索引列中的值是唯一的并且不允许有空值
普通索引:mysql 的基本索引类型,没有什么限制,允许有重复值和空值
唯一索引:索引列中的值是唯一的,但是允许有空值
还有其他索引 譬如全文索引、空间索引、前缀索引等不常见
4、mysql 几个存储引擎,innodb 和 MyISAM 区别
答:MySQL 有多种存储引,MyISAM、InnoDB、MERGE、MEMORY(HEAP) 等
InnoDB 和 MyISAM 区别:
1). InnoDB 支持事务,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;
2). InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败;
3). InnoDB 是聚集索引,MyISAM 是非聚集索引。聚簇索引的文件存放在主键索引的叶子节点上,因此 InnoDB 必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而 MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针(就是物理地址)。主键索引和辅助索引是独立的 。
注意:MyISAM 无论是主键还是非主键索引 ,data 存储的都是这条数据的物理地址(地址指针),innodb 主键索引的 data 就是这条数据,非主键索引的 data 是主键 id,
高级
1.索引底层机制,B+ 树特性,和其他数据结构(二叉树、红黑树)区别,
答:这个属于高级特性,后续公众号会重点输出数据库相关的知识和面试题
2.mysql 事务隔离级别、MVCC 是什么,
答:
MVCC ,Multi-Version Concurrency Control,多版本并发控制。MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问;在编程语言中实现事务内存
3.数据库锁类型,什么是数据库死锁,如何避免?
答:从数据库系统角度分为三种:排他锁、共享锁、更新锁。
从程序员角度分为两种:一种是悲观锁,一种乐观锁,等等
避免死锁方式:
结构化数据建模:基于范式原则初级建模
热点业务排解:挖出核心业务模型
应用拆解:降低时间片复杂度
提升性能:优化代码,集群、超时机制、回滚机制
4.主从底层数据同步机制、binglog、redolog、undolog 区别,
答:redo log:确保事务的持久性。防止在发生故障的时间点,尚有脏页未写入磁盘,在重启 mysql 服务的时候,根据 redo log 进行重做,从而达到事务的持久性这一特性。undo log:回滚日志保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读 binlog:二进制日志作用:用于复制,在主从复制中,从库利用主库上的 binlog 进行重播,实现主从同步。 用于数据库的基于时间点的还原。
四.开发语言,java 这块后续我会陆续推出一些 java 基础专栏,
面对对象三大特性、通俗解释,八大基本数据类型及其大小,循环、判断等语法
2.java 集合 如 arraylist、linkedlist、hashmap 等特性和底层实现原理 ;
3.java 锁类型,线程安全、线程池、juc 并发组件、反射等;
4.Jvm 内存结构,不同版本区别,gc 方法,调优,命令等等;
5.springboot、spring、mybatis 等框架的使用和常见面试题
6.单例、工厂、适配器等设计模式
7.zk、dubbo、springcloud 等相关 java 框架是否接触过?底层原理
8.分布式事务、分布式锁、幂等性等常见分布式问题是否了解?解决方式?
五.自动化,这块是面试官重点去考察的地方,
1.自己开发的自动化框架吗?为啥要开发这么一个框架呢?市面上很多自动化平台为什么不用,却要自己搭建?想过投入产出比吗?
答:自己搭建,主要是项目每次上线之前,回归重复的功能占用大量迭代时间,通过自动化框架可以节约时间,市面上的测试平台得自己部署和维护,出现问题需要自己去查底层代码解决,学习门槛较高,并且很多功能几乎用不到,自己搭建的自动化框架,开发相对简单,上手特别快,特别符合当前的项目需要。
2.说下接口自动化分别用了哪些框架,怎么实现的,你主要负责哪些部分?
答:我的主要是 springboot、testng、mysql、okhttpcilent、mq 那套东西。
3.你们这套框架最难的技术点有哪些?搭建框架过程中遇到哪些问题,怎么解决的?
答:难点技术有很多,譬如失败用例重跑机制,异步接口校验返回结果,场景测试中前置依赖接口怎么处理,涉及到 mq 怎么操作等等
4.流程场景怎么设计用例的?假如流程比较长,你怎么保障前面流程成功?
答:可以引入失败用例重跑机制 testng 有接口实现、简单接口,我们可以直接在数据库造数据。
5.数据放哪的?数据驱动怎么做的?关键字驱动怎么做的?
答:看情况,如果是灵活的数据,建议放在 excel 里面,做数据驱动,如果是账号、密码这种修改很少的数据,可以考虑放在配置文件中,如果是那种一成不变的可以写死(尽量别这么做)。
关键字驱动:测试用例的步骤 (元素) 和用例分离。关键字驱动表示把项目中的一些逻辑封装成关键字 (一个函数名)。例如 login、 register、order 进行设置变量(Set Viriable),调用不同的关键字组合实现不同的业务逻辑,从而驱动测试用例执行。
数据驱动:数据和用例步骤分离,通过 excel、yaml 等文件保存数据。数据驱动是把测试用例里面的数据提取到 excel 或者 yam 文件里面,然后通过改变 excel 或 yaml 中的数据驱动测试用例执行。
6.这套框架覆盖了开发多少业务代码,怎么统计出来的?多少用例,跑一次多长时间?
答:主要覆盖所负责业务的主要流程和一些常见的异常流程,通过 jacoco 覆盖率统计工具统计出来的,用例大概有 100+ 个,涉及到 30 多个接口,跑一次将近 2 分钟左右。
7.开发修改接口和你的自动化代码怎么同步修改,以保证自动化测试代码不报错?
答:依靠规范、或者技术手段。
六.性能测试重中之重,内容包罗万象,涉及到性能测试方式、策略、监控、分析调优等方面
1.你们公司性能测试怎么做的,说一下流程?
答:基本流程就是产研测三方开会、一起定下 tps 基准值,测试设计性能测试计划和测试用例、用例评审、进行压测、观测数据找出性能瓶颈,调优持续压测等等
2.TPS 上不去什么原因,怎么排查?响应时间太长怎么分析?
答:通过各种监控技术如 prometheus 、skywalking 等 观测系统瓶颈,基本上分为一下几个方面 带宽、连接池、硬件、垃圾回收机制、数据库等方面去分析。
3.线程阻塞和死锁问题怎么去定位分析,有什么现象?
答:在发生死锁之后,程序卡住没有任何反应,但程序仍在运行,因此需要借助一些命令来排查,用 JDK 自带的命令 jstack -pid 去查看线程信息,jstack 很快就帮我们找到了死锁的位置(在实际运行中,往往 dump 一次信息,还不足以确认问题,建议多 dump 几次,如果每次 dump 都指向同一个问题,那么就可以确定是这个问题导致的线程死锁)
4.内存泄露和内存溢出有什么区别?分别会有什么现象?怎么定位分析?
答:内存溢出(Out Of Memory):就是申请内存时,JVM 没有足够的内存空间。通俗说法就是去蹲坑发现坑位满了。
内存泄露(Memory Leak):就是申请了内存,但是没有释放,导致内存空间浪费,通俗点就是占着那啥不那啥。
5.数据库是怎么监控的,sql 慢查询怎么监控分析?
答:见数据库 sql 优化面试题。
6.如何进行全链路监控分析,定位性能瓶颈?
答:自行百度
7.压测线上环境都会遇到什么问题,数据隔离怎么做的?如何减小对生产影响?
答:脏数据影响真实的业务响应和数据,可以考虑落入影子库,mock 对象、或者数据带有明显标识等手段。
8.测试过程中都发现了哪些性能问题,怎么定位分析的?优化方案是什么?
答:每个人准备的问题不一致,我的就是遇到了 jvm fullgc 频繁导致接口响应时间慢,通过 java 一些命令定位分析发现 jvm 配置不合理。
9.项目架构是怎么样的?简单描述或者画图
答:微服务架构,两个入口、公众号和 web 端,请求先经过 Nginx 做负载均衡、流量均匀的打到项目的 api 网关,后面就是项目的微服务架构(采购单、供应商、库存、仓库物流等等)如果对后端采用的架构熟悉,可以顺带提一下,比如用了 springcloud 全家桶、eureka 做服务注册和发现,mq 实现异步解耦,redis 缓存有效减少数据库交互等等。
七.中间件相关问题,简历如果说了,面试官一般都会顺带问下
1.正向代理和反向代理区别?Nginx 了解吗?负载均衡算法
答:Nginx 是一款自由的、开源的、高性能的 HTTP 服务器和反向代理服务器;同时也是一个 IMAP、POP3、SMTP 代理服务器;Nginx 可以作为一个 HTTP 服务器进行网站的发布处理,另外 Nginx 可以作为反向代理进行负载均衡的实现。
正向代理:服务器位于客户端和服务器之间,为了从服务器获取数据,客户端要向代理服务器发送一个请求,并指定目标服务器,代理服务器将目标服务器返回的数据转交给客户端。这里客户端需要要进行一些正向代理的设置的。举例:***,正向代理中被代理的是客户端的请求
反向代理:客户端对代理是无感知的,客户端不需要任何配置就可以访问,客户端将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。
负载均衡算***询、随机、最少连接、hash、加权等,说一下具体使用场景
2.mq 是如何测试的?你项目中怎么应用的?mq 的优缺点?为什么使用 mq?怎么保障 mq 消息的有序性、幂等性、可靠性(不丢失)
答:消息中间件 具备解耦、削峰、异步的作用,具体可自行百度
3.为什么使用 redis,redis 五种数据类型,如何测试 redis 的,项目中如何应用的?
答:基于内存查询效率高,高并发情况下保护数据库,string、hash、list、set、zset 五中数据类型,项目中主要用于请求 token 保存和失效,防重分布式锁,冷数据(改动量小)保存,幂等性校验等等。
4.都发现过哪些缓存方面的 bug,怎么定位的?
答:缓存和数据库数据不一致,缓存穿透,击穿,雪崩等
5.redis 穿透,击穿,雪崩机制,被问了好几次…
答:自行百度
八.算法,一些大厂必问,百度、阿里、字节、腾讯等
1.常见的排序算法,冒泡,快排等
2.数组,字符串的相关算法操作比如找一个字符串中重复最长的字符串、两数之和等
3.简单的数据结构栈,队列,链表的基本的操作等
算法这块没有捷径,需要日积月累,一些常见的算法题,尽量在理解的基础上去默写并记熟,有些网站牛客网、LeetCode 刷刷题加强一下。
九.其他
假如测试任务重,时间紧,但是人手不够你怎么处理?
答:向上反馈真实情况、加派人手、争取更多时间或削减不必要需求,测试中要充分理解需求,设计用例加强评审,需求排优先级等等
2.假如开发不认可你提出 bug,怎么办?
答:自己重新复现一下提出的 bug,如果确实是 bug,可以和开发当面沟通清楚,沟通无效则向上反馈。
3.线上有碰到过漏测的 bug 吗?怎么处理的
答:碰到过,可以说一个不大不小的漏测案例(前提是别人的 bug 才导致的),重点说下防止下次漏测措施。
4.职业规划,离职原因。
答:这个开发性题目,离职原因尽量别说上家公司坏话。
福利
马上冲刺金三银四,希望大家顺利找到工作,这里为大家准备了各大厂面试题合集(含答案)
也为正准备学习软件测试的小伙伴奉上今年(2022)最新资料的收集,(获取方式:***********或者点击下方链接),希望对大家有帮助