转载声明:文章来源 https://www.nowcoder.com/discuss/529228410334302208
之前另一个部门已经二面挂了,又被其他部门捞起来了。
先是自我介绍,然后问实习,然后问项目,然后是八股和算法题,我简单记录下问题,答案是面试完整理的,仅供参考。
1.什么是接口测试?如何给接口设计测试用例?
接口测试是软件测试的一种类型,旨在验证系统的不同组件之间的接口或交互是否按照规范进行工作。在软件开发中,通常会有多个模块、组件或服务相互协作,它们通过接口进行通信和数据交换。接口测试确保这些接口在各种情况下都能正常工作,以确保整个系统的正确性、稳定性和可靠性。
以下是接口测试的关键特点和目标:
验证数据传输:接口测试确保数据在不同组件之间的传输是正确的,数据不会丢失、损坏或被篡改。
检查参数和参数验证:测试确保接口正确处理输入参数,并进行适当的验证,以防止无效或恶意输入导致的问题。
测试用例设计:设计测试用例,以覆盖各种可能的输入、边界情况和异常情况。这有助于确保接口在不同情况下都能正确处理数据。
性能测试:有时接口测试也包括性能测试,以验证接口在负载较高情况下的响应时间和吞吐量。
安全性测试:接口测试也可以包括安全性测试,以确保接口对于恶意攻击或未经授权的访问是安全的。
集成测试:接口测试通常是集成测试的一部分,因为它关注不同组件之间的交互。集成测试确保各组件在一起工作正常。
版本兼容性测试:当系统的不同版本之间存在接口时,接口测试也可以确保新版本的兼容性,以确保升级不会破坏接口。
自动化测试:对于重复性高的接口测试,可以考虑自动化测试,以提高效率和一致性。
2.什么是性能测试?什么是响应时间和吞吐量?
性能测试是软件测试的一种类型,它旨在评估计算机系统、应用程序、服务或组件在不同负载条件下的性能和行为。性能测试的目标是测量系统的响应时间、吞吐量、资源利用率和稳定性,以确保在实际使用中系统能够满足性能要求和用户期望。
响应时间(Response Time):
响应时间是指从发送请求到获得第一个响应的时间间隔。它表示用户或客户端从发出请求到接收到服务响应的延迟。较低的响应时间通常被视为更好,因为它意味着系统响应更迅速,提供更好的用户体验。响应时间通常以毫秒(ms)为单位表示
吞吐量(Throughput):
吞吐量是指在单位时间内系统处理的请求数量。它反映了系统的处理能力和性能。较高的吞吐量表示系统能够有效地处理更多请求。吞吐量通常以每秒请求数(Requests Per Second,RPS)或每分钟请求数(Requests Per Minute,RPM)表示
资源利用率(Resource Utilization):
资源利用率指的是系统在执行任务时使用的资源,如 CPU、内存、磁盘空间等。它表示系统在运行期间的资源消耗情况。监测资源利用率有助于确定系统在不同负载条件下的性能和资源需求,以便进行容量规划和性能优化。
稳定性(Stability):
稳定性表示系统在各种负载条件下的可靠性和稳定性。一个稳定的系统不会在高负载下崩溃或产生严重的性能问题。稳定性测试用于评估系统是否能够在持续运行的情况下表现良好,而不出现内存泄漏、资源耗尽或崩溃等问题。
3.Java如何实现多线程?
创建线程的方式一:继承Thread类
【1】继承Thread类
【2】重写run方法
【3】创建对象,调用start()方法启动线程
创建线程的方式二:实现Runnable接口
【1】实现Runnable接口
【2】重写run方法
【3】创建对象,调用start()方法启动线程
4.And和andand的区别?
1、&&也叫短路与,当&&左边的条件不满足时,就不会判定右边的条件。而&不一样,无论‘&’左边的条件是否满足,它都会判定右边的条件。
2、&可用于位运算,当左右两边的条件不是布尔型,而是数字时,它会进行位运算。
5.什么是内存泄露?如何防止内存泄露?
内存泄漏(Memory Leak)指的是应用程序中的一种常见问题,它发生在对象不再被程序引用或使用时,但由于某种原因没有被垃圾回收机制回收,导致占用的内存一直得不到释放。随着时间的推移,内存泄漏会导致程序占用越来越多的内存,最终可能导致应用程序的性能下降甚至崩溃。
如何防止内存泄露:
显式释放资源:
当使用需要手动关闭的资源(例如文件、数据库连接、套接字)时,确保在不再需要时显式关闭或释放它们。使用 try-with-resources(Java 7及更高版本)或 finally 块来确保资源得到正确释放
避免循环引用:
当两个或多个对象相互引用时,确保它们的引用链不会形成循环。使用弱引用(Weak Reference)或软引用(Soft Reference)来解决特定情况下的循环引用问题。
手动清理缓存,及时垃圾回收。
6.什么是线程中断?如何实现线程中断?
线程中断即线程运行过程中被其他线程给打断了,它与 stop 最大的区别是:stop 是由系统强制终止线程,而线程中断则是给目标线程发送一个中断信号,如果目标线程没有接收线程中断的信号并结束线程,线程则不会终止,具体是否退出或者执行其他逻辑由目标线程决定。
我们来看下线程中断最重要的 3 个方法,它们都是来自 Thread 类
1、java.lang.Thread#interrupt
中断目标线程,给目标线程发一个中断信号,线程被打上中断标记。
2、java.lang.Thread#isInterrupted()
判断目标线程是否被中断,不会清除中断标记。
3、java.lang.Thread#interrupted
判断目标线程是否被中断,会清除中断标记。
7.Get和post的区别?
Get使用URL传参,post放在body中
Get提交的数据长度有限,post可以非常大
Post比get安全
Get请求是幂等性的,post请求不是。
8.MySQL中索引的作用?
使用索引可以大大加快 数据的检索速度(大大减少检索的数据量), 这也是创建索引的最主要的原因。
通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
缺点:
创建索引和维护索引需要耗费许多时间。当对表中的数据进行增删改的时候,如果数据有索引,那么索引也需要动态的修改,会降低 SQL 执行效率。
索引需要使用物理文件存储,也会耗费一定空间。
9.什么是缓存雪崩?什么是缓存击穿?如何预防?
缓存穿透
什么是缓存穿透?
缓存穿透说简单点就是大量请求的 key 是不合理的,根本不存在于缓存中,也不存在于数据库中 。这就导致这些请求直接到了数据库上,根本没有经过缓存这一层,对数据库造成了巨大的压力,可能直接就被这么多请求弄宕机了。
解决:最基本的就是首先做好参数校验,一些不合法的参数请求直接抛出异常信息返回给客户端。比如查询的数据库 id 不能小于 0、传入的邮箱格式不对的时候直接返回错误消息给客户端等等。
缓存无效 key
布隆过滤器
布隆过滤器是一个非常神奇的数据结构,通过它我们可以非常方便地判断一个给定数据是否存在于海量数据中。我们需要的就是判断 key 是否合法,有没有感觉布隆过滤器就是我们想要找的那个“人”。
具体是这样做的:把所有可能存在的请求的值都存放在布隆过滤器中,当用户请求过来,先判断用户发来的请求的值是否存在于布隆过滤器中。不存在的话,直接返回请求参数错误信息给客户端,存在的话才会走下面的流程。
缓存击穿:
缓存击穿中,请求的 key 对应的是 热点数据 ,该数据 存在于数据库中,但不存在于缓存中(通常是因为缓存中的那份数据已经过期) 。这就可能会导致瞬时大量的请求直接打到了数据库上,对数据库造成了巨大的压力,可能直接就被这么多请求弄宕机了
有哪些解决办法?
设置热点数据永不过期或者过期时间比较长。
针对热点数据提前预热,将其存入缓存中并设置合理的过期时间比如秒杀场景下的数据在秒杀结束之前不过期。
请求数据库写数据到缓存之前,先获取互斥锁,保证只有一个请求会落到数据库上,减少数据库的压力。
缓存穿透和缓存击穿有什么区别?
缓存穿透中,请求的 key 既不存在于缓存中,也不存在于数据库中。
缓存击穿中,请求的 key 对应的是 热点数据 ,该数据 存在于数据库中,但不存在于缓存中(通常是因为缓存中的那份数据已经过期)
缓存雪崩
什么是缓存雪崩?
实际上,缓存雪崩描述的就是这样一个简单的场景:缓存在同一时间大面积的失效,导致大量的请求都直接落到了数据库上,对数据库造成了巨大的压力。 这就好比雪崩一样,摧枯拉朽之势,数据库的压力可想而知,可能直接就被这么多请求弄宕机了。
另外,缓存服务宕机也会导致缓存雪崩现象,导致所有的请求都落到了数据库上。
有哪些解决办法?
针对 Redis 服务不可用的情况:
1.采用 Redis 集群,避免单机出现问题整个缓存服务都没办法使用。
2.限流,避免同时处理大量的请求。
针对热点缓存失效的情况:
1.设置不同的失效时间比如随机设置缓存的失效时间。
2.缓存永不失效(不太推荐,实用性太差)。
3.设置二级缓存。
缓存雪崩和缓存击穿有什么区别?
缓存雪崩和缓存击穿比较像,但缓存雪崩导致的原因是缓存中的大量或者所有数据失效,缓存击穿导致的原因主要是某个热点数据不存在与缓存中(通常是因为缓存中的那份数据已经过期)。
10.Sql题:班级里有张三和李四,张三的两门课程是85和65,李四的两门课程是80和70,查询成绩大于80的人?
11.算法题:无重复字符的最长字串?
帖子还没人回复快来抢沙发