> 文章列表 > 热乎的面经——百炼成钢

热乎的面经——百炼成钢

热乎的面经——百炼成钢

请添加图片描述

⭐️前言⭐️

本篇文章记录博主面试上海某大厂,测试开发工程师岗位一面所被问及的问题,回答仅供参考。

🍉欢迎点赞 👍 收藏留言评论 📝私信必回哟😁

🍉博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言

🍉博客中涉及源码及博主日常练习代码均已上传GitHub


请添加图片描述

📍内容导读📍

  • 🍅1.黑盒测试和白盒测试的区别
  • 🍅2.黑盒测试测试用例的设计方法
  • 🍅3.设计测试用例的话会从哪些方面来考虑
  • 🍅4.针对下单功能的功能测试用例设计
  • 🍅5.TCP和UDP的区别
  • 🍅6.TCP和UDP的传输效率
  • 🍅7.TCP可靠性实现的机制
  • 🍅8.TCP请求携带怎样的东西也能保证可靠性
  • 🍅9.GET请求和POST请求的区别
  • 🍅10.GET请求携带参数的大小限制
  • 🍅11.一个GET请求会产生几个TCP数据
  • 🍅12.GET请求能完成增删改操作吗?
  • 🍅13.常用的Linux命令
  • 🍅14.kill -9 中的-9是什么意思
  • 🍅15.进程的状态有哪些
  • 🍅16.进程和线程的区别
  • 🍅17.MySQL实现去重操作有哪些办法
  • 🍅18.左连接和右连接
  • 🍅19.MySQL索引
  • 🍅20.Cookie和Session的区别
  • 🍅21.Cookie和Session的优缺点
  • 🍅22.Cookie支持跨域访问吗
  • 🍅23.接口调不通该怎么办
  • 🍅24.Java的基本数据类型
  • 🍅25.Java实现多线程的方式
  • 🍅26.SpringAOP和 IOC
  • 🍅27.代码题

🍅1.黑盒测试和白盒测试的区别

黑盒测试是一种不关注程序内部的具体实现,从输入输出的角度来测试系统的正确性和稳定性的测试方法。
白盒测试是基于内部代码结构和实现逻辑的测试。

🍅2.黑盒测试测试用例的设计方法

等价类、边界值、判定表、正交排列、错误猜测、场景设计

🍅3.设计测试用例的话会从哪些方面来考虑

功能测试、性能测试、界面测试、兼容性测试、易用性测试、安全性测试

🍅4.针对下单功能的功能测试用例设计

1.商品信息是否正确,包括商品名称、价格、数量等信息。
2.加入购物车功能是否正常。
3.用户信息是否正确,包括用户地址、联系电话等信息。
4.订单流程状态是否正确展示,包括订单支付、发货、退款等流程。
5.优惠券是否能够正常使用。
6.物流信息是否正确展示,包括快递公司、快递单号等信息。

🍅5.TCP和UDP的区别

TCP协议:

  • 有连接
  • 可靠传输
  • 面向字节流
  • 全双工

UDP协议:

  • 无连接
  • 不可靠传输
  • 面向数据包
  • 全双工

🍅6.TCP和UDP的传输效率

TCP是面向连接的协议,通过三次握手建立连接,来保证数据的可靠性和有序性,这使得TCP的传输效率比UDP低。

🍅7.TCP可靠性实现的机制

TCP通过多个机制来共同实现可靠性。
1.确认应答和超时重传机制
TCP在传输数据时,发送方发出数据后,接收方收到消息后要返回给发送方一个应答报文ACK来表示自己已经收到了。
2.连接管理(三次握手、四次挥手)
TCP是面向连接的协议,所以在使用TCP之前必须先通过三次握手来先建立连接,通过三次握手的过程,来确定通信双方的发送和接收能力是否都正常。
完成连接后才能进一步去完成发送HTTP请求,获取响应的操作。
当完成操作后,再通过四次挥手的过程,来断开连接,避免占用资源。
3.滑动窗口
由于确认应答机制的存在,导致当前每次执行一次发送操作,都需要等待上个ACK的到达才能进行下一步操作,将会非常影响传输的效率。

滑动窗口就是“批量发送数据”,一次发送一波数据,然后再一起等待一波ACK

比如发送了N组数据,并不用等N组数据的ACK都到了再继续往下发送,而是收到了一个ACK就往下发送一组,这样这个窗口就在往后滑动。

4.流量控制
流量控制的关键就是根据接收方缓冲区的剩余空间大小,来衡量当前的处理能力。

如果剩余空间比较大,就认为接收方处理能力较强,就让发送方发快点。
如果剩余空间比较小,就认为接收方处理能力较弱,就让发送方发慢点。

5.拥塞控制
拥塞控制衡量的是发送方到接收方之间的链路的拥堵情况。

通过反复调整拥塞窗口的大小,来达到动态平衡的一个效果。

6.延时应答
在发送方询问接收方窗口大小时,不立即做出回答,而是稍等一下再回答,这样接收方又可以多处理一部分数据,窗口就又大一些。

7.捎带应答
由于延时应答的存在,导致接收方的ACK不一定是及时返回的,如果延时应答导致ACK的返回时间和应用代码中返回的响应时机重合了,就可以把这个ACK和响应数据合二为一。(四次挥手中的二三次挥手,ACK和FIN一起返回)

8.粘包问题
由于TCP面向字节流的机制,会导致若干个应用层数据包混在一起,所以需要在应用层中加入包的边界,来解决粘包问题。

🍅8.TCP请求携带怎样的东西也能保证可靠性

序列号:用于标识每一个发送的数据段,保证数据能够按照正确的顺序到达接收方。
确认号:用于确认接收到的数据,接收方会将已接收的数据的下一个序列号发送给发送方。
校验和:用于检查数据在传输过程中是否出现错误或损坏。
窗口大小:用于控制发送方发送数据的速度,接收方会根据自己的处理能力和网络状况动态地调整窗口大小,以保证数据能够及时传输。

通过这些机制,TCP可以确保数据能够按照正确的顺序到达接收方,并且在传输过程中不会出现错误或损坏。即使出现网络拥塞或其他问题,TCP也能够通过调整窗口大小和超时重传机制来保证数据的可靠性。

🍅9.GET请求和POST请求的区别

1、语义上的区别:
GET通常用来取数据,POST通常用来上传数据(实际上两种都可用)
2、body(正文)有无的区别:
通常情况下,GET没有body,是通过query String 查询字符串来向服务器传递数据的。
POST有body的,通过body向服务器传递数据,但是POST没有query String
3、是否幂等:
所谓的幂等,意思就是多次执行相同的操作,结果都是相同的。
GET请求幂等,POST请求一般不幂等。
4、能否被缓存:
GET可以被缓存,POST不能被缓存。
如果结果是幂等的,可以提前把结果记住,节省了下次访问的开销;但如果是不幂等的,就不应该记录结果。

🍅10.GET请求携带参数的大小限制

一般来说,GET请求携带参数的大小是由浏览器限制的,不同的浏览器对此的限制也有所不同,但是通常情况下,浏览器对于URL的长度有一个约束,如果GET请求中携带的参数超过了浏览器的限制,那么浏览器可能会截断URL或直接拒绝请求。
因此为了避免超出限制,建议在GET请求中携带的参数不要过多、过长,尽量使用POST请求来进行数据传输。

🍅11.一个GET请求会产生几个TCP数据包

一个GET请求通常会至少产生一个TCP数据包,但具体产生多少个TCP数据包则取决于多种因素,如请求的大小、服务器响应的大小、网络拓扑结构等。
一般情况下,一个GET请求首先会建立TCP连接,这个过程会至少产生一个TCP数据包,包括发送一个SYN包,服务器回复一个SYN-ACK包,最后客户端回复一个ACK包,之后,客户端向服务器发送请求报文,该请求报文可能需要被分成多个TCP分组发送,每个TCP分组对应一个TCP数据包。同样,服务器的响应报文也可能需要被分成多个TCP分组发送,每个TCP分组也对应一个TCP数据包。
总之,一个GET请求会产生多少个TCP数据包,取决于请求和响应的大小、传输的TCP分组大小和传输过程中出现的任何网络状况。

🍅12.GET请求能完成增删改操作吗?

GET请求通常用于从服务器获取数据,而不是用于进行增删改操作,一般情况下,增删改操作需要使用POST、PUT、PATCH或DELETE请求。
使用这些请求方式,一般可以完成增删改查操作,例如:
● 创建用户:使用POST请求,将包含新用户信息的数据发送到服务器。
● 获取用户信息:使用GET请求,向服务器请求用户信息。
● 更新用户信息:使用PUT或PATCH请求,将包含更新后的用户信息的数据发送到服务器。
● 删除用户:使用DELETE请求,向服务器请求删除指定用户的信息。

🍅13.常用的Linux命令

● ls:列出当前目录中包含的文件和目录
● ll:用列表的方式来列出目录中的内容
● pwd:显示当前目录的绝对路径
● cd:切换到指定目录
● touch:创建一个空文件
● cat:查看文件内容
● echo:打印内容到控制台,也可用于写文件
● mkdir:创建目录
● rm:删除
● cp:复制文件或目录(复制目录要加上-r选项)
● mv:移动目录或文件(或者给文件重命名)
● find:查找文件
● kill -9:杀死进程
● netstat -anp | grep 8080:查看8080端口的进程
● ps aux | grep java:查看所有Java进程
● nohup java -jar xxx.jar &:后台启动Spring Boot项目
● tail -f filename:查看日志(默认最后10行)
● cat -n filename | grep “关键字”:查看日志
● chmod 777 a.txt:更改a.txt文件的权限值为777

🍅14.kill -9 中的-9是什么意思

-9代表发送的信号为SIGKILL,它是一种强制终止信号,可以强制杀死进程。

🍅15.进程的状态有哪些

1.新建状态(New):进程刚刚被创建,操作系统正在为其分配资源。
2.就绪状态(Ready):进程已经准备好运行,等待CPU分配时间片。
3.运行状态(Running):CPU正在执行进程的指令。
4.阻塞状态(Blocked):进程在等待某些事件发生,如等待IO操作完成或等待某个信号量被释放等。
5.终止状态(Terminated):进程执行完成或者被操作系统强制终止,释放所有资源。

线程的状态与进程有些类似,如下:
1.新建状态(New):线程刚刚被创建,但尚未开始执行。
2.就绪状态(Ready):线程已经准备好运行,等待分配CPU时间片。
3.运行状态(Running):线程正在执行。
4.阻塞状态(Blocked):线程在等待某些事件发生,如等待IO操作完成或等待某个信号量被释放等。
5.等待状态(Waiting):线程等待另一个线程完成某个操作或者等待某个条件满足。
6.终止状态(Terminated):线程执行完成或者被操作系统强制终止,释放所有资源。

🍅16.进程和线程的区别

● 直观理解:进程是包含线程的,一个进程里可以有一个线程,也可以有多个线程。 类比:进程是工厂,线程是生产线
● 系统角度:进程是操作系统资源分配的基本单位,线程是操作系统调度执行的基本单位。
● 每个进程都有独立的内存空间(虚拟地址空间),同一个进程的多个线程之间,共用这个虚拟地址空间(例如共同使用同一个变量)。

🍅17.MySQL实现去重操作有哪些办法

DISTINCT关键字:使用SELECT DISTINCT语句来获取唯一的记录,这是最基本的去重操作。例如,SELECT DISTINCT column_name FROM table_name;

GROUP BY语句:使用GROUP BY语句将数据按照指定的列进行分组,并且使用聚合函数如COUNT、SUM、AVG等计算每个分组的汇总数据。这个方法在查询时可以去除重复的记录。例如,SELECT column_name FROM table_name GROUP BY column_name;

UNION操作符:使用UNION操作符将多个SELECT语句的结果合并为一个结果集。这个方法可以去除重复的记录。例如,SELECT column_name FROM table1 UNION SELECT column_name FROM table2;

INNER JOIN语句:使用INNER JOIN语句将两个表连接起来,以删除重复的记录。例如,SELECT t1.column_name FROM table1 t1 INNER JOIN table2 t2 ON t1.column_name = t2.column_name;

这些方法都可以实现MySQL去重操作,但在不同的情况下,不同的方法可能会有不同的性能和效果。需要根据具体的情况选择合适的方法。

🍅18.左连接和右连接

左连接和右连接是SQL中的外连接的两种连接方式,用于将两个表中的数据联合起来,其主要区别在于连接的方向和结果集的组成:

1、左连接(Left Join):左连接返回左表中的所有记录和右表中匹配的记录,如果右表中没有匹配的记录,那么就返回NULL值。左连接的连接方向是从左表到右表。
2、右连接(Right Join):右连接返回右表中所有记录和左表中匹配的记录,如果做左表中没有匹配的记录,那么就返回NULL值。右连接的连接方向是从右表到左表。

🍅19.MySQL索引

MySQL底层使用B+树结构作为索引

B+树是一种基于B树的树形结构(B树其实就是一棵N叉搜索树),相对于B树,B+树具有更高的磁盘读写效率和更好的数据查询性能。

其特点如下:
1、所有数据都存储在叶子节点上,非叶子节点只存储索引信息,这样可以减少非叶子节点的存储空间,提高效率。
2、叶子节点之间使用指针连接,形成一个有序的链表,这样可以方便范围查询和排序操作。
3、所有叶子节点之间高度相同,可以形成一个平衡的树结构,这样可以保证查询的性能稳定,不会受到数据分布的影响。

🍅20.Cookie和Session的区别

Cookie是浏览器给页面提供的一种能持久化存储数据的机制(此处的持久化是指,数据不会因为程序重启或者主机重启而丢失)

典型的应用场景就是浏览器保存你某个页面的用户名和密码。

每位用户在首次进行登录时,都会在服务器端创建一个Session会话,在Session中存储了对应用户的一些属性,而且每个Session都有唯一身份标识session ID;服务器存储管理着很多的Session会话。

在客户端的Cookie中,就存储着sessionID,在客户端进行登录后发送给服务器的请求中就有该sessionID,服务器在存储的所有Session会话中,根据sessionID进行查找,如果找到了就会返回给客户端对应的Session会话响应。

类似于我们去医院时用到的就诊卡,就诊卡就相当于Cookie,包含了当前患者的关键信息,我们刷卡后就能查到自己的过往病历情况,每位患者的情况就是一个Session会话,存储在医院的服务器上。

🍅21.Cookie和Session的优缺点

Cookie 的优点:

简单易用:Cookie 是客户端保存数据的最基本的方法,使用起来非常简单和方便。
跨域支持:Cookie 可以设置跨域(CORS)访问权限,因此可以在不同子域名之间共享数据。
大小限制较小:每个 Cookie 的大小一般被限制在 4KB 左右,这样可以避免过度消耗客户端的存储空间。
Cookie 的缺点:

安全性问题:Cookie 中保存的数据容易被篡改、伪造或盗取,因此需要采取相应的安全措施保障数据的安全性。
存储敏感信息需要加密:如果需要在 Cookie 中保存敏感信息,需要进行加密处理,否则会产生安全风险。
不适合保存大量数据:由于每个 Cookie 的大小有限,因此不能用于保存大量数据,否则会导致 Cookie 过多,影响网站性能。

Session 的优点:

安全性高:Session 中的数据保存在服务器端,能够有效地保护数据的安全性。
支持存储大量数据:Session 的数据存储在服务器端,因此可以存储大量的数据,不会影响客户端的性能。
扩展性好:Session 提供了灵活的扩展机制,可以根据需要自定义 Session 存储方式。
Session 的缺点:

消耗服务器资源:因为 Session 的数据存储在服务器端,因此需要消耗一定的服务器资源,如果用户访问量较大,会对服务器造成压力。
跨域问题:由于 Session 数据保存在服务器端,因此无法跨域访问,需要特别处理才能实现跨域共享数据

🍅22.Cookie支持跨域访问吗

Cookie默认情况下不支持跨域访问,即使是同一个域名下不同端口的网站也被视为跨域。这是由于安全策略所规定的,在同源策略下,浏览器只允许网页向同源服务器发起请求,而同源指的是协议、域名和端口号都相同。

🍅23.接口调不通该怎么办

1、检查接口地址是否正确。确保接口地址的协议、域名、路径等信息都正确,并且可以访问。
2、检查接口参数是否正确。确保接口参数的格式、类型、值等信息都正确,并且符合接口要求。
3、检查接口权限是否正确。确保调用接口时有足够的权限,并且符合接口要求的身份认证方式。
4、检查接口返回值是否正确。如果接口返回值不符合预期,可以使用调试工具查看返回值的具体内容,并对比接口文档中的返回值定义进行排查。
5、检查接口调用过程中是否有异常。如果接口调用过程中出现了异常,可以查看异常信息并进行排查。
6、如果以上方法都无法解决问题,可以尝试联系接口提供方或相关技术支持人员,寻求更进一步的帮助和解决方案。

🍅24.Java的基本数据类型

八大基本数据类型:
byte
short
int
long
float
double
char
boolean

🍅25.Java实现多线程的方式

1、继承Thread类,重写run方法
2、实现Runnable接口,重写run方法
3、继承Thread类,重写run方法,使用匿名内部类的方式
4、实现Runnable接口,重写run方法,使用匿名内部类的方式
5、使用lambda表达式来表示要执行的任务
6、使用线程池
7、实现Callable接口

🍅26.SpringAOP和 IOC

AOP是面向切面编程,它是对某一类事情的集中处理,它是一种思想,而Spring AOP是对这个思想的具体实现。
最具体的实现就是登录验证,除了登录和注册等几个功能不需要做用户登录验证之外,其他几乎所有页面调用的前端控制器(Controller)都需要先验证用户登录的状态。
IOC控制反转是Spring框架的一个核心特性,它通过将对象之间的依赖关系交由Spring容器来管理,实现了系统的松耦合和可扩展性。

🍅27.代码题

较简单不提及


⭐️最后的话⭐️
总结不易,希望uu们不要吝啬你们的👍哟(^U^)ノ~YO!!如有问题,欢迎评论区批评指正😁

请添加图片描述