他整整复习了三个月,金三成功上岸字节,面试题及答案分享!
前言:
相信大多数人都经历过面试,然后面试完就在怀疑人生,发现自己啥也不会,这是绝大多数人都会有的感觉,不单单只是测试开发工程师,因此,这几天抽空将之前朋友面试时遇到的面试题做了个汇总,一方面自己以后回顾学习用,一方面为大家奉送上一份福利。
很多软件测试开发工程师面试之前,可能没有较长的工作时间或者较为丰富的工作经验,所以不知道互联网公司或者一线互联网公司技术面试都会问哪些问题? 再加上可能自己准备也不充分,去面试没几个回合就被面试官几个问题打蒙了,最后以惨败收场。所以我找这位朋友要来了他当时去字节面试时的面试题,我把它整理好了,还有一些他自己平常复习的学习 资料以及笔记,获取方式在文末哈!!在这分享给大家参考,让即将面试或是有想法跳槽的朋友们了解一下一线大厂面试时都喜欢问那些问题。
面试内容:
- 个人信息:(工作/实习经验,所做的项目,态度素养)
- 测试思维
- 情景问题
- 计算机网络
- 操作系统
- 代码/算法题
- 语言(Python/Java)
- Linux
- 数据库
个人信息
1. 公司测试流程?/测试工作怎么开展的?/怎么展开测试?
考察是否熟悉测试过程中各个环节。具备知识:软件生命周期、bug 生命周期、测试流程。
大概流程为需求评审会议 ---> 测试计划(测试范围、时间节点、任务分配、测试策略、环境,风险评估)---> 测试用例编写(测试思维)、内部/项目组评审 ---> 测试执行(开发编译完成,提测):发现 bug 定位 bug,提交并跟踪 bug,多轮回归测试,测试结束 ---> 整理测试报告--> 发布线上,线上问题跟踪。
可依据自己公司做适当调整。
2.做过什么项目,负责什么?
3.项目中每个业务扣细节?
4.个人规划、如何理解测试岗位
*************
测试思维
1.纸杯子做什么测试?
反问面试官:这个水杯容量、材质、大小、形状、功能有无限制?
面试官:没有限制
我:假设这个水杯 100ml 办公室一次性的纸质水杯
功能测试、界面测试、易用性测试、兼容性测试、安全测试、性能压力来思考
功能测试:水杯能否正常装水,不漏水?100ml 边界值? 装冷水开水热水?能否降解?....
界面测试:外观颜色、设计、logo、界面文字是否正确?.
易用性测试:隔热、易握?杯口是否毛刺?设计是否符合人体工学?....
兼容性测试:装气体/固体/液体?不同环境下是否正常?
安全测试:材质质量,是否防止腐蚀能力?防止碰撞,割手?抑制细菌?....
性能压力:摔多次?是否耐摔?(不同高度) 挤压(不同角度),是否变形?.....
2.发红包测试用例?
3.微信点赞如何测试?
4. 设计发朋友圈测试用例
5.领取优惠券的页面如何设计?
6.设计抖音视频播放页面测试用例?
7.针对抖音搜索界面,设计测试用例?
8.如何测试一瓶矿泉水?
9.一个项目,有增删改查接口等,做接口测试,怎么测?
情景问题
1. 视频卡顿如何排查
2.打开 APP 后页面空白,怎么排查问题?
答案:
- 先确保网络正常、输入的 URL 地址是正确的
- 通过浏览器调试工具或者抓包工具例fiddler,查看控制台的请求和响应,
- 查看请求地址和参数等是否正常;后台返回状态码、响应数据等是否正常
- 一般经过以上步骤,基本能够定位到问题,例控制台报 js 异常之类的,则前端问题;若返回状态 500,则后端问题,可同步查看服务器日志来定位
3. 为微信的点赞功能设计测试用例,假如点赞了但是点赞数没有加一,可能报错在哪里?
答案:url 定位错误、代码错误、断网操作网络不好、未更新、次数限制
4. 网络良好的情况下,发现数据传输过程出现 404 的情况,你认为是什么问题。
原因一般来说有几种情况:
- 无法在所请求的端口上访问 Web 站点。
- Web 服务扩展锁定策略阻止本请求。
- MIME 映射策略阻止本请求
- 网站更新改版,但某些局部板块沿用原来的模块,而原有的模块调用的文件已经被删除或转移了路径。
- 跟踪访问的各类脚码或 CSS 文件无效但调用代码依然存在。
- 某个目录直接删除
- 网页 URL 生成规则改变
- 网页文件更名或移动位置
- 导入链接拼写错误等
5. A 给 B 发送消息后,A 看见消息发送出去了,但是 B 没有收到,怎么排查问题?
6. 网页加载慢的原因?
7. 与开发人员冲突的处理方法及遇到问题的解决方法
8. 一个 bug 开发不认同是 bug 你该怎么做 ?
首先确认开发环境是否跟自己测试环境一致(有时候开发是在他们已更新代码的环境上验证 bug 的,所以 bug 就没出现,但在测试环境上面会出现),确认在测试环境能重现,如果确认是缺陷跟开发保持有效的沟通,
如果是级别较低的建议性 bug,可以先记录到 bug 平台,先保留沟通;
如果是 bug 级别较高的问题,对应需求文档的预期结果跟开发说明,更有说服力;耐心讲解 bug 的危害,不行就找产品确认,确认是 bug 注明情况并再次指派给开发
9. 你正在测试,产品组拿来一个紧急测试让你测,你该怎么办?
10. 如果同事进度不能符合预期,影响整体进度怎么办
11. 如果领导给你一个不熟悉的事件,但很紧急怎么办?
计算机网络
1.介绍 OSI 模型
第一层:物理层,功能:利用传输介质为通信的主机之间的建立、管理和释放物理连接,实现比特流的透明传输,为数据联立层提供数据传输服务
第二层:数据链路层,功能:在物理层提供比特流的基础上通过建立数据链路连接,采用差错控制与流量控制方法,使有差错的物理线路变成无差错的数据链路
第三层:网络层,功能:通过路由选择算法为分组通过通信子网选择适当的传输路径,实现流量控制,拥塞控制与网络互联的功能
第四层:传输层,功能:为分布不同地理位置计算机的进程提供可靠的端对端链接与数据传输服务;传输层向高层屏蔽了底层数据通信的细节
第五层:会话层,功能:负责维护两个会话主机之间连接的建立、管理和终止,以及数据的交换
第六层:表示层,功能:负责通信系统之间的数据格式变换、数据加密与解密、数据压缩与恢复
第七层:应用层,功能:实现协同工作的应用程序之间的通信过程控制
2.为什么 TCP 消耗系统资源多
3.TCP 与 UDP 区别
- 基于连接与无连接;
- 对系统资源的要求(TCP 较多,UDP 少);
- UDP 程序结构较简单;
- 流模式与数据报模式 ;
- TCP 保证数据正确性,UDP 可能丢包,TCP 保证数据顺序,UDP 不保证。
4.TCP 怎么保证可靠连接
5.http 会话保持功能如何实现?
6.http 状态码?
1XX:通知。1XX 系列响应代码仅在与 HTTP 服务器沟通时使用。
2XX: 成功。2XX 系列响应代码表明操作成功了。
3XX 重定向。3XX 系列响应代码表明:客户端需要做些额外工作才能得到所需要的资源。
4XX:客户端错误。这些响应代码表明客户端出现错误。不是认证信息有问题,就是表示格式或 HTTP 库本身有问题。客户端需要自行改正。
5XX 服务端错误。这些响应代码表明服务器端出现错误。
7.http 长连接和短连接以及他们分别适用的场景 ?
8.get 和 post 区别?
Get:
a.一般对于从服务器取数据的请求可以设置为 get 方式
b.Get 方式在传递参数的时候,一般都会把参数直接拼接在 url 上(例如:http://xxx?id=1&type=2)
c.Get 请求方法可以传递的参数数据量是有限的(因为一般参数是拼接在 url 上,而浏览器对于 url 的长度是有限制的)
d.Get 请求因为是直接将数据拼接在 url 上,所以安全性不如 post 强(相对),但是 get 的执行效率要快于 post
Post:
a.一般往服务器提交数据的请求会设置为 post 方式
b.Post 方式传递参数一般都会把参数放在请求体,而不会拼接在 url
c.Post 请求方法可以提交的数据量不受限制
Post 请求传参相对于 get 要安全(相对不是绝对),但是 post 的执行效率不如 get。
9.post 主体的格式?
10.http 协议的 header
11.cookie 和 session 是什么,为什么要用 cookie 和 session ?
12.DNS 协议和作用?
13.Https 中的 CA 证书在客户端还是在服务端?
操作系统
1. 进程和线程的区别?
进程是资源分配的最小单位,线程是程序执行的最小单位。
进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此 CPU 切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。
线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
2. 多线程和多进程,以及应用场景?
3. 进程通信方式 ?
4. 内存泄漏?
5. 堆和栈?
栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由 OS 回收 。
6. 堆内存和栈内存?
7. 什么是死锁,死锁的条件?
8. 产生死锁的原因?
可归结为如下两点:
a. 竞争资源
系统中的资源可以分为两类:
可剥夺资源,是指某进程在获得这类资源后,该资源可以再被其他进程或系统剥夺,CPU 和主存均属于可剥夺性资源;
另一类资源是不可剥夺资源,当系统把这类资源分配给某进程后,再不能强行收回,只能在进程用完后自行释放,如磁带机、打印机等。
产生死锁中的竞争资源之一指的是竞争不可剥夺资源(例如:系统中只有一台打印机,可供进程 P1 使用,假定 P1 已占用了打印机,若 P2 继续要求打印机打印将阻塞)
产生死锁中的竞争资源另外一种资源指的是竞争临时资源(临时资源包括硬件中断、信号、消息、缓冲区内的消息等),通常消息通信顺序进行不当,则会产生死锁
b. 进程间推进顺序非法
若 P1 保持了资源 R1,P2 保持了资源 R2,系统处于不安全状态,因为这两个进程再向前推进,便可能发生死锁
例如,当 P1 运行到 P1:Request(R2)时,将因 R2 已被 P2 占用而阻塞;当 P2 运行到 P2:Request(R1)时,也将因 R1 已被 P1 占用而阻塞,于是发生进程死锁
9. 如何预防死锁,!避免死锁,死锁发生的检查?
资源一次性分配:一次性分配所有资源,这样就不会再有请求了:(破坏请求条件)
只要有一个资源得不到分配,也不给这个进程分配其他的资源:(破坏请保持条件)
可剥夺资源:即当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源(破坏不可剥夺条件)
资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)
代码题、算法题
1.装饰器并写一个装饰器例子?
2.找出 数组中出现次数超过一半的数字
3.哈希表的空间复杂度
4.算法题:给你一个字符串,查找出所有的重复子字符串。
5.算法题:树的深度遍历:while 循环:栈,先入右子树节点,后入左子树节点。
6.算法题:给你一个字符串找出其中的回文字符串,对你的算法设计用例
7.算法题:二叉树的前序遍历
Python/Java 基础
- 面向对象语言的特性?
- 深拷贝与浅拷贝?
数据类型分为两种基础类型和引用类型
- 基础类型:像 Number、String、Boolean 等这种为基本类型
- 引用类型:Object 和 Array
浅拷贝只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化,这就是浅拷贝(例:assign())
深拷贝是将对象及值复制过来,两个对象修改其中任意的值另一个值不会改变,这就是深拷贝
- python 元祖和列表的区别
a=[] 这是一个列表
b=() 这是一个元组
区别:列表可以修改而元组不能修改,例如可以往列表中用 append()添加元素,由于元组是不可修改的所以不存在添加元素的问题。
相同点:列表和元组都是容器,包含了一些列的对象,二者都可以包含任意类型的元素甚至包含序列。
- python 去重用什么 ?
- python 用过哪些库函数?
- selenium 用到什么程度了?
- python 装饰器,作用,用法
- Java:多态说一下,接口类和抽象类的区别;
- Java/Python 的垃圾回收机制?
- Java 和 python 创建多线程和多进程的方式 ?
Linux
1.常见命令
2.打印当前文件夹文件 ls -al a 所有文件 l 详细信息
3.查询 CPU 等情况的命令
答案:free 命令是一个快速查看内存使用情况的方法,它是对 /proc/meminfo 收集到的信息的一个概述。
top 命令提供了实时的运行中的程序的资源使用统计
atop 命令是一个终端环境的监控命令。它显示的是各种系统资源(CPU, memory, network, I/O, kernel)的综合,并且在高负载的情况下进行了彩色标注
htop 命令显示了每个进程的内存实时使用率。它提供了所有进程的常驻内存大小、程序总内存大小、共享库大小等的报告。列表可以水平及垂直滚动。
ps 命令可以实时的显示各个进程的内存使用情况。
smem 命令允许你统计基于/proc 信息的不同进程和用户的内存使用情况。内存使用情况的分析可以导出图表(如条形图和饼图--图形界面窗口才提供)。
vmstat 命令显示实时的和平均的统计,覆盖 CPU、内存、I/O 等内容。例如内存情况,不仅显示物理内存,也统计虚拟内存。
nmon 是一个基于 ncurses 的系统基准测试工具,它可以监控 CPU、内存、I/O、文件系统及网络资源等的互动模式。对于内存的使用,它可以实时的显示 总/剩余内存、交换空间等信息。
数据库
- MySQL 存储引擎如何实现?
- 事务概念及其特性?
概念:
1.数据库事务: 数据库事务通常指对数据库进行读或写的一个操作序列。
它的存在包含有以下两个目的:
- 为数据库操作提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
- 当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。
- 多表查询、普通 SQL 和存储过程的区别?
- 索引的底层、底层为什么要采用 B 树或 B+ 树?
- B 树和 B+ 树区别?
- 熟悉数据库吗:学生选课系统怎么建表,查询一个老师教的所有学生的名字?
- 取一个年级中每个班级年龄最小的同学名字?
- where 和 having 的区别?
答案:
用的地方不一样
where 可以用于 select、update、delete 和 insert into values(select * from table where ..)语句中。 having 只能用于 select 语句中
执行的顺序不一样
where 的搜索条件是在执行语句进行分组之前应用
having 的搜索条件是在分组条件后执行的
即如果 where 和 having 一起用时,where 会先执行,having 后执行
子句有区别
where 子句中的条件表达式 having 都可以跟,而 having 子句中的有些表达式 where 不可以跟;having 子句可以用集合函数(sum、count、avg、max 和 min),而 where 子句不可以。
总结
1.WHERE 子句用来筛选 FROM 子句中指定的操作所产生的行。
2.GROUP BY 子句用来分组 WHERE 子句的输出。
3.HAVING 子句用来从分组的结果中筛选行
- 内连接和外连接?
内连接 则是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合
条件的记录不会出现在结果集中,即内连接只连接匹配的行。
外连接 其结果集中不仅包含符合连接条件的行,而且还会包括左表、右表或两个
表中的所有数据行,这三种情况依次称之为左外连接,右外连接,和全外连接。
左外连接,也称左连接,左表为主表,左表中的所有记录都会出现在结果集中,
对于那些在右表中并没有匹配的记录,仍然要显示,右边对应的那些字段值以
NULL 来填充。右外连接,也称右连接,右表为主表,右表中的所有记录都会出现
在结果集中。左连接和右连接可以互换,MySQL 目前还不支持全外连接。
- 数据库字段去重?
- SQL 语句 查询每一门课程分数都大于 80 分的学生姓名?
SELECT 姓名 FROM Student GROUP BY 科目 Having MIN(成绩)>=80
总结:
400页软件测试面试题核心知识点:
这份面试题内容涉及:测试理论、Linux基础、MySQL基础、Web测试、接口测试、App测试、管理工具、Python基础、Selenium相关、性能测试、LordRunner相关等。
电子书系列:
- 《软件测试的艺术》
- 《从零开始学Python》
- 《软件测试自动化》
- 《软件测试第二版》
- 等等
其他
其余一些视频,项目实战,测试报告模板,软件测试工具包等等,都看了看。