因为当年大四上学期考完研就直接进了实验室,从来没有接触过职场,算是一直生活在象牙塔里。找实习的想法诞生于今年过完年,开始了解牛客网,力扣等刷题和找工作的网站。第一次上力扣刷题应该是在2月8号,java的语法从HelloWorld开始学起,没事做做牛客网的选择题,复习了哈计算机网络。3月中旬在牛客网看到美团的实习生招聘,因为非科班,没有学过数据库,操作系统和设计模式,对比了招聘要求后,没敢投后台开发,投了测试开发工程师。不得不说美团的效率还是蛮高的,3月20号笔试,3月25号一面,3月26号二面,3月30号三面。本来对自己非常没有自信,因为硕士两年一直在搞深度学习,没有接触过数据结构这一套找工作的东西,只是过完年粗略看了一遍,想来体验哈美团的笔试,没想到就这么一面一面的走过来了。还是挺感谢牛客网这个平台的,上面很多笔试面试的面经,没事就去刷刷对自己很有帮助。一面二面的面经我都发到了牛客网上,传送门在这里[一面面经]([https://www.nowcoder.com/discuss/391434
]),[二面面经]([https://www.nowcoder.com/discuss/392667
])。三面因为是主管面,没有聊技术,这里就不做记录了。另外说一句,美团的面试氛围真的很好,面试官都很和蔼。我被分配到了美团小象事业部(美团买菜),应该是一个氛围很不错的部门。
下面记录一下这几天为面试做的笔记,这些都是我在美团测开面经上扒下来的面试问题或者是我自己面试遇到的问题,方便今年秋招的时候复习:
1. 测试生命周期
需求分析阶段:阅读需求,理解需求,主要就是对业务的学习,分析需求点
计划阶段:根据需求编写测试计划 / 测试方案
设计阶段:根据需求和设计编写一部分测试用例
执行阶段:遇到问题提交bug到缺陷管理平台,并对bug进行跟踪,没有重大bug,测试结束。
评估阶段:出测试报告,对整个测试的过程和版本质量做一个详细的评估。
2. 白盒、黑盒、单元测试等的区别
单元测试:是指对软件中的最小可测试单元进行检查和验证。如C语言中单元指一个函数,Java里单元指一个类。
集成测试:介于单元测试和系统测试之间,采用黑盒+白盒的方式来测试,主要测试模块与模块之间的接口,并测试一些主要的业务功能。
系统测试:粒度最大,一般由独立测试小组采用黑盒方式来测试,主要测试系统是否符合“需求规格说明书”。
验收测试:与系统测试相似,主要区别是测试人员不同,验收测试由用户执行。
黑盒测试:也称功能测试,不考虑程序内部结构和逻辑结构,主要是用来测试系统的功能是否满足需求规格说明书。
白盒测试:也称结构测试,主要应用在单元测试阶段,主要是对代码级的测试,针对程序内部逻辑结构测试。
3. ==和equals区别
==:在基础数据类型中比较的是他们的值是否相等,在引用数据类型中比较的是引用的地址是否相同。
equals:对于非string比较的是引用的地址是否相同,String中的equals方法其实比较的是字符串的内容是否一样。
4. 深拷贝和浅拷贝
深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。
浅拷贝:只是增加了一个指针指向已存在的内存地址,
深拷贝:是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存。
5. TCP和UDP
TCP(传输控制协议):是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。
TCP三次握手过程:
1主机A通过向主机B 发送一个含有同步序列号的标志位的数据段给主机B ,向主机B 请求建立连接,通过这个数据段,主机A告诉主机B 两件事:我想要和你通信;你可以用哪个序列号作为起始数据段来回应我。
2 主机B 收到主机A的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段响应主机A,也告诉主机A两件事:我已经收到你的请求了,你可以传输数据了;你要用哪个序列号作为起始数据段来回应我。
3 主机A收到这个数据段后,再发送一个确认应答,确认已收到主机B的数据段:"我已收到回复,我现在要开始传输实际数据了这样3次握手就完成了,主机A和主机B就可以传输数据了。
TCP四次挥手过程:
1 当主机A完成数据传输后,将控制位FIN置1,提出停止TCP连接的请求
2 主机B收到FIN后对其作出响应,确认这一方向上的TCP连接将关闭,将ACK置1
3 由B 端再提出反方向的关闭请求,将FIN置1
4 主机A对主机B的请求进行确认,将ACK置1,双方向的关闭结束.
UDP(用户数据报协议):
1 UDP是一个非连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。
2 UDP使用尽最大努力交付,即不保证可靠交付.
3 对系统资源的要求比较少。
6. DNS,FTP,HTTP
DNS:域名解析协议,通过域名解析获得域名所对应的IP。
FTP:文件传输协议,用户可通过客户机程序向远程主机上传文件;或从远程主机上下载文件。
HTTP:超文本传输协议。web服务器用这种协议和浏览器交互。
HTTPS:为加密的超文本传输协议。
7. 进程与线程,线程有哪几种模式
进程 :是系统进行资源调度和分配的基本单位,进程间独享内存,一个系统至少一个进程。
线程 :是cpu进行资源分配和调度的基本单位,线程间共享进程的内存,一个进程至少一个线程。
几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程。当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程。
线程是进程的组成部分,一个进程可以拥有多个线程,而一个线程必须拥有一个父进程。线程不能拥有系统资源。它与父进程的其他线程共享该进程的所有资源。
java中,每个线程都需经历新生、就绪、运行、阻塞和死亡五种状态
8. OSI七层协议,每层是干啥的
物理层:为数据端设备提供原始比特流的传输通路。(中继器、集线器、网线、HUB)
数据链路层:在通信的实体间建立数据链路连接。(交换机)
网络层:为数据在节点之间传输创建逻辑链路,并分组转发数据。(路由器)
传输层:提供应用进程之间的逻辑通信。
会话层:建立端连接并提供访问验证和会话管理。
表示层:提供数据格式的转换服务。
应用层:访问网络服务的接口。
9. Linux常用命令
cd <路径> cd命令后面跟一个路径,用于切换当前用户所在的路径。
pwd 显示目前的目录。
ls <参数> <路径> ls命令后面可以跟一个路径或参数,也可以不跟,表示列出路径或当前目录下的所有文件信息。
cat <文件> 表示读取文件内容及拼接文件。
tac <文件> 从最后一行开始读取文件内容。
touch <文件> 在当前目录下创建一个文件。
rm -r <文件夹> 用于删除文件或文件夹,常用参数-r -f,-r表示删除目录,也可以用于删除文件,-f表示强制删除,不需要确认。
mkdir <文件夹> 用于创建文件夹。
rmdir <文件夹> 删除当前目录下的test目录(注意:该命令只能够删除空目录)
cp <文件> <目标文件> 用于复制文件或文件夹。
tar -zcvf <打包压缩后的文件名> <要打包压缩的文件> 打包并压缩文件。
tar -xvf <压缩文件> 解压压缩包
tail <必要参数> <选择参数> <文件> 用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。
kill <PID码> 结束当前进程。
ps aux ps命令用于报告当前系统的进程状态。
reboot 现在重新启动计算机。
su - 切换用户
chmod 修改文件/目录的权限
mv 移动文件与目录,或修改名称
man [命令] 查看各个命令的使用文档
netstat 查看端口开放情况
df 查看磁盘空间大小
du 查看文件和目录大小
grep [选项] “模式” [文件]查找文件里符合条件的字符串
10. 浏览器输入一个网址发生了什么
- 首先,它会请求DNS把这个域名解析成对应的IP地址。
- 向IP所对应的服务器发送请求,服务器创建线程响应并返回默认资源给予用。
当数据返回给浏览器的时候,若浏览器解析数据还有一些静态资源(CSS、图片等) - 再次发送HTTP请求,这些请求可能在CDN(内容分发网络)上,CDN服务器会处理用户请求。
11. GET和POST的区别
GET:一般用于获取/查询资源信息, 它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。 Get是不安全的,很可能你的一些操作会被第三方看到。Get传输的数据量小。
POST:一般用于更新资源信息。Post的所有操作多用户来说是不可见的。Post可以传输大量的数据。
12. https的加密传输
- 浏览器将自己支持的一套加密规则发送给网站。
- 网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。
- 客户端拿到公钥之后先发送一个随机串到服务器,服务器进行加密,并且返回。
- 客户端用公钥解密收到的报文,发现果然能解开,于是确认这就是正确的公钥。
- 客户端生成一个对称加密密钥,公钥加密,并且发送给服务器。这个过程是安全的。
- 服务器收到对称密钥加密报文。用私钥进行解密,于是get到客户端发来的密钥,于是愉快的开始了通信。
13. 状态码总结
2XX——表明请求被正常处理了 :
200 请求已正常处理。
204 请求处理成功,但没有任何资源可以返回给客户端。
206 是对资源某一部分的请求,该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。
3XX——表明浏览器需要执行某些特殊的处理以正确处理请求:
301向是永久重定向,搜索引擎在抓取新的内容的同时也将旧的网址替换为了重定向之后的网址。
302是临时重定向,搜索引擎会抓取新的内容而保留旧的地址。
303与302状态码有着相同的功能,但303状态码明确表示客户端应当采用GET方法获取资源。
304资源已找到,但未符合条件请求。
4XX——表明客户端是发生错误的原因所在:
400服务器端无法理解客户端发送的请求,请求报文中可能存在语法错误。
403不允许访问那个资源。
404服务器上没有请求的资源。
5XX——服务器本身发生错误:
500貌似内部资源出故障了。
503该状态码表明服务器暂时处于超负载或正在停机维护,现在无法处理请求。
14. 数据结构中,什么是线性结构,什么是非线性结构
线性结构:是一个有序数据元素的集合。常用的线性结构有:栈,队列,数组,链表。其特点是数据元素之间存在一对一的线性关系。线性结构拥有两种不同的存储结构,即顺序存储结构和链式存储结构。顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的,链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息。线性结构中存在两种操作受限的使用场景,即队列和栈。
非线性结构:各个数据元素不再保持在一个线性序列中,每个数据元素可能与零个或者多个其他数据元素发生联系。常见的非线性结构有:多维数组,树,图。
15. 重载与重写
重载: 是让类以统一的方式处理不同类型数据的一种手段,实质表现就是多个具有不同的参数个数或者类型的同名函数,同时存在于同一个类中,是一个类中多态性的一种表现。
重写: 是父类与子类之间的多态性,实质是对父类的函数进行重新定义,如果在子类中定义某方法与其父类有相同的名称和参数则该方法被重写,不过子类函数的访问修饰权限不能小于父类的。
16. static关键字
static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。
17. hashCode和equals方法的区别与联系
equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的。
hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。
当需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equal()去再对比了),如果hashCode()相同,此时再对比他们的equal(),如果equal()也相同,则表示这两个对象是真的相同了。
18. TCP/IP分为几层,每一层有那些协议
网络接口层:负责从网络上接收物理帧,抽出IP数据报,交给IP层。(网络接口协议)
网络层:主要定义了IP地址格式。(IP协议)
传输层:主要是提供应用程序间的通信。(TCP协议,UDP协议)
应用层:(FTP、SMTP、DNS)
19. synchronized和volatile的区别
volatile:一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:
1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。
2)禁止进行指令重排序。
Synchronized:则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
二者区别:
1.volatile仅能使用在变量级别;
synchronized则可以使用在变量、方法、和类级别的
2.volatile仅能实现变量的修改可见性,并不能保证原子性;
synchronized则可以保证变量的修改可见性和原子性
3.volatile不会造成线程的阻塞;
synchronized可能会造成线程的阻塞。
20. α测试和β测试
α测试:就是把用户请到公司内部进行测试使用。α测试是由一个用户在开发环境下进行的测试,也可以是公司内部的用户在模拟实际操作环境下进行的测试。注意!α测试不能由程序员或测试员完成。
β测试:用户在不同场所进行测试。β测试是一种验收测试。β测试由软件的终用户们在一个或多个场所进行。
二者区别:
它们都是验收测试!
α测试是指把用户请到开发方的场所来测试
β测试是指在一个或多个用户的场所进行的测试。
α测试的环境是受开发方控制的,用户的数量相对比较少,时间比较集中。
β测试的环境是不受开发方控制的, 用户数量相对比较多,时间不集中。
α测试先于β测试执行。通用的软件产品需要较大规模的β测试,测试周期比较长。