首页 > 面试必会!测试开发岗位秋招面试高频考点汇总
头像
放放风吖
编辑于 2021-11-17 21:53
+ 关注

面试必会!测试开发岗位秋招面试高频考点汇总

序言

本贴是我在面试测开岗位过程中所复习的考点,以及面试官会在秋招面试中常考的一些问题,大家可以针对性的进行参考复习。

测开这个岗位的面试官比较看重面试者的沟通表达以及逻辑思维能力,所以一定要自信,口齿清晰,逻辑清楚。

正文

编程语言Python(主要以JAVA和Python为主)

1.深浅拷贝(高频,简单)注意理解

浅拷贝:构造一个新的集合对象,用原始对象中找到的子对象的引用来填充它,复制过程不会递归,不会创建子对象的副本。
深拷贝:构造一个新的集合对象,递归的用在原始对象中找到的子对象的副本来填充它,创建原始对象及其所有子对象完全独立的克隆。

2.is和==的区别(高频,简单)

is判断两个对象的内存地址是否相同 而==判断两个对象的值是否相同

3.装饰器

装饰器可以在不改变函数代码和调用方式的情况下给函数添加新的功能。

本质上是一个嵌套函数,接收被装饰的函数(func)作为参数,并返回一个包装过的函数,以实现不影响函数的情况下添加新的功能。抽离出大量与函数主体功能无关的代码,增加一个函数的重用性。

4.闭包

如果一个外函数中定义了一个内函数,且内函数体内引用到了外函数的变量,这时外函数通过return返回内函数的引用时,会把定义时设计到的外部引用变量与内函数打包成一个整体即闭包。

5.可变对象与不可变对象总结

可变对象:list、dict、set 可变对象是指对象的内存值可以改变

不可变对象:int、tuple、str、bool 不可变对象是指对象的内存值不可以被改变。改变变量时,其实质是变量指向新的地址,即变量引用新的对象

6.解释型和编译型语言的区别

编译型语言

在程序执行前,需要把源代码编译成机器语言的文件,再执行时可以直接使用该编译结果,以后不需要再次编译。

优点:运行效率高

缺点:难以移植

解释型语言

代码执行时才一行行动态翻译执行

优点:无需翻译器,方便程序移植;可以交互式运行

缺点:运行效率较低

7.lambda函数
8.self的概念

9.python的面向对象特性

封装 继承 多态

面向对象和面向过程语言的区别

面向对象是把问题抽象成一个个对象,给这些对象绑上属性和方法,即以功能而非步骤划分问题。优点:高内聚低耦合、易维护、易复用;缺点:因为需要实例化所以开销较大,性能比面向过程要低

面向过程是把问题拆分成一个个函数和数据,按照一定的顺序来执行这些方法。优点:性能较高;缺点:不易维护,不易复用

10.python的内存管理机制(常考,较难)

python的内存管理机制=垃圾回收机制+内存池机制

(1)垃圾回收机制

垃圾回收机制以引用计数法为主,标记-清除为辅。

1.引用计数法

因为自动回收,所以没有内存泄漏的风险。

引用计数法是指在每个对象的结构体PyObject中定义一个计数变量ob_refcnt,计算该对象被引用的次数,有以下4种情况会造成引用计数变量的增加:1.该对象被引用;2.该对象被加入某容器(列表、字典等);3.对象被创建;4.该对象被作为参数传到函数中。

对应的python计数减少的情况为:1.该引用被释放,也就是说引用该对象的变量换了引用对象;2.该对象被从容器中删除;3.用del删除该对象;4.一个对象离开它的作用域,例如func函数全部执行完毕,非全局变量的对象引用计数器-1(这个引用是指创建引用的副本吗,为什么全局变量的对象计数器不变呢?)

当计数变量减少至0时,自动释放该变量。

优点:高效,自动释放,实时性高,即一旦没有引用立即释放;

缺点:1.增加存储空间,维护引用计数消耗资源;2.无法解决循环调用(一组未被外部使用、但相互指向的对象)的情况。

2.标记-清除法

标记-清除被作为解决循环调用的情况,辅助python进行垃圾回收

过程:①首先创建对象时,python会将其加入零代链表;②遍历零代链表,如果被本链表内的对象引用,自身的被引用数-1;③清除被引用数为0的对象;④其余未被回收的“活动对象”升级为一代链表 一代同样可能会触发gc机制,从而对一代链表标记清除,将剩下的活动对象升级为二代链表

python的GC阈值——即何时会进行标记过程

当被分配对象的计数值与被释放对象的计数值之间的差异增长,超过某个阈值时,就会触发python的收集机制

这里采用了分代的思想,存活越久的对象越不可能是垃圾。这里对零代对象的扫描次数大于对一代对象的次数。核心行为就是:垃圾回收器会频繁地处理新对象。

(2)内存池机制

python引用了一个内存池memory pool机制,即pymalloc机制,用于对小块内存的申请和释放。

当创建大量消耗小内存的对象时,频繁调用malloc/new会导致大量的内存碎片,导致效率降低。内存池即预先在内存中申请一定数量的、大小相等的内存块留作备用,当有新的内存需求时,就先从内存池中分配内存给该需求,不够了再去申请新的内存。对象被释放后,空闲的小内存返回内存池,避免频繁的内存释放动作。

优点:能够减少内存碎片,提升效率

Linux常用命令

  1. ls 列出当前文件夹下的内容
  2. pwd 查看当前所在目录
  3. cd 切换目录 . 当前目录 .. 上级目录 cd ~ 切换到主目录 cd - 在最近两次操作目录间横跳
  4. touch 创建文件
  5. .mkdir 新建目录
  6. rm 删除文件 rm -r 目录名 删除目录 rm -f 强制删除,无该文件也无需提醒 rm -r * 删除当前目录下所有文件和目录
  7. cp 复制文件
  8. mv 移动文件
  9. grep 搜索文本 文件名 搜索文本内容 -n 显示行号; -v 不包括该内容的 ; ^a查找以a开头的行; a$ 查找以a结尾的行
  10. cat 显示文件完整内容  more 分屏显示文件内容   less 分屏显示文件内容,上下键控制翻页  head 打印文件中的前n行  tail 打印文件中的末尾几行
  11. find 目录 -name 搜索字符 搜索名字为xxx的文件 可以使用通配符
    find 目录 -size 数据块 搜索大小为xxx的文件,1数据块=0.5kB
    +n 大于 -n 小于 n等于
    组合条件:-o 或者;-a 并且
    find \ -size +163840 -a -size -204800 查找根目录下大于80MB小于100MB的文件
    find 目录 -group xxx 查询所属组为xxx的文件
    find 目录 -user xxx 查询所属者为xxx的文件
  12. wc 文件 -l 统计文件的行数
    wc 文件 -w 统计文件的单词数
    wc 文件 -c 统计文件的字节数
  13. top 动态实时显示cpu、内存、进程使用情况
  14. ps 列出进程
    ps -ef | grep xxx 查看xx进程,可以获得pid
    ps -a 列出所有运行中的进程
    pgrep -l xxx 查看xx进程的pid
    netstat -atnp| grep xxx 查询pid
  15. kill 杀死进程
    kill -9 pid 强制杀死某进程
  16. .netstat
    netstat -atnp | grep xxxx 查看端口号/状态的进程pid
    查看端口占用情况lsof -i
    查看指定端口占用情况lsof -i:端口号
  17. free 显示当前内存使用情况
  18. 软链接 ln-s 硬链接 ln
  19. su 切换用户 sudo 管理员
  20. chmod 修改权限
  21. jobs 查看后台进程
  22. 创建链接 ln 查看链接 readlink
  23. 如何防止新人误操作 rm-rf这个命令
  24. vim命令
  • linux三剑客(百度重点问了,可以去了解)
    grep
    sed

    awk

计算机网络

1、OSI 七层、TCP/IP 四层的关系和区别?

OSI 七层从下往上依次是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

注意  一般说五层:物理层、数据链路层、网络层、传输层、应用层。

TCP/IP 四层从下往上依次是:网络接口层、网络层、传输层、应用层。与OSI 七层的映射关系如下:

特点:

· 层与层之间相互独立又相互依靠

· 上层依赖于下层,下层为上层提供服务

2、TCP/IP

TCP 与 UDP 的区别?

总结

· TCP 向上层提供面向连接的可靠服务 ,UDP 向上层提供无连接不可靠服务。

· UDP 没有 TCP 传输可靠,但是可以在实时性要求搞的地方有所作为。

· 对数据准确性要求高,速度可以相对较慢的,可以选用TCP。

3、TCP 是如何实现数据的可靠性?

通过校验和、序列号、确认应答、超时重传、连接管理、流量控制、拥塞控制等机制来保证可靠性。

(1)校验和

在数据传输过程中,将发送的数据段都当做一个16位的整数,将这些整数加起来,并且前面的进位不能丢弃,补在最后,然后取反,得到校验和。

发送方:在发送数据之前计算校验和,并进行校验和的填充。接收方:收到数据后,对数据以同样的方式进行计算,求出校验和,与发送方进行比较。

(2)序列号

TCP 传输时将每个字节的数据都进行了编号,这就是序列号。序列号的作用不仅仅是应答作用,有了序列号能够将接收到的数据根据序列号进行排序,并且去掉重复的数据。

(3)确认应答

TCP 传输过程中,每次接收方接收到数据后,都会对传输方进行确认应答,也就是发送 ACK 报文,这个 ACK 报文中带有对应的确认序列号,告诉发送方,接收了哪些数据,下一次数据从哪里传。

(4)超时重传

在进行TCP 传输时,由于存在确认应答与序列号机制,也就是说发送方发送一部分数据后,都会等待接收方发送的 ACK 报文,并解析 ACK 报文,判断数据是否传输成功。如果发送方发送完数据后,迟迟都没有接收到接收方传来的 ACK 报文,那么就对刚刚发送的数据进行重发。

(5)连接管理

就是指三次握手、四次挥手的过程。

(6)流量控制

如果发送方的发送速度太快,会导致接收方的接收缓冲区填充满了,这时候继续传输数据,就会造成大量丢包,进而引起丢包重传等等一系列问题。TCP 支持根据接收端的处理能力来决定发送端的发送速度,这就是流量控制机制。

具体实现方式:接收端将自己的接收缓冲区大小放入TCP 首部的『窗口大小』字段中,通过 ACK 通知发送端。

(7)拥塞控制

TCP 传输过程中一开始就发送大量数据,如果当时网络非常拥堵,可能会造成拥堵加剧。所以 TCP 引入了慢启动机制,在开始发送数据的时候,先发少量的数据探探路。

4、说说 TCP 协议如何提高传输效率?

TCP 协议提高效率的方式有滑动窗口、快重传、延迟应答等。

(1)滑动窗口

如果每一个发送的数据段,都要收到ACK 应答之后再发送下一个数据段,这样的话我们效率很低,大部分时间都用在了等待 ACK 应答上了。

为了提高效率我们可以一次发送多条数据,这样就能使等待时间大大减少,从而提高性能。窗口大小指的是无需等待确认应答而可以继续发送数据的最大值。

(2)快重传

快重传也叫高速重发控制。

那么如果出现了丢包,需要进行重传。一般分为两种情况:

情况一:数据包已经抵达,ACK被丢了。这种情况下,部分ACK丢了并不影响,因为可以通过后续的ACK进行确认;

情况二:数据包直接丢了。发送端会连续收到多个相同的ACK 确认,发送端立即将对应丢失的数据重传。

(3)延迟应答

如果接收数据的主机立刻返回ACK应答,这时候返回的窗口大小可能比较小。

· 假设接收端缓冲区为1M,一次收到了512K的数据;如果立刻应答,返回的窗口就是512K;

· 但实际上可能处理端处理速度很快,10ms之内就把512K的数据从缓存区消费掉了;

· 在这种情况下,接收端处理还远没有达到自己的极限,即使窗口再放大一些,也能处理过来;

· 如果接收端稍微等一会在应答,比如等待200ms再应答,那么这个时候返回的窗口大小就是1M;

窗口越大,网络吞吐量就越大,传输效率就越高;我们的目标是在保证网络不拥塞的情况下尽量提高传输效率。

5、TCP 如何处理拥塞?

网络拥塞现象是指到达通信网络中某一部分的分组数量过多,使得该部分网络来不及处理,以致引起这部分乃至整个网络性能下降的现象,严重时甚至会导致网络通信业务陷入停顿,即出现死锁现象。拥塞控制是处理网络拥塞现象的一种机制。

拥塞控制的四个阶段:

· 慢启动

· 拥塞避免

· 快重传

· 快恢复

6、为什么TCP 链接需要三次握手?

· 两次握手只能保证单向连接是畅通的

第一步,客户端给服务端发送一条消息:你好,服务端。第二步,服务端收到消息,同时给客户端回复一条消息:收到!你好客户端。

这样的两次握手过程,客户端给服务端打招呼,服务端收到了,说明客户端可以正常给服务端发送数据。但是服务端给客户端打招呼,服务端没有收到反馈,也就不能确保服务端是否能正常给客户端发送消息。

· 只有经过第三次握手,才能确保双向都可以接收到对方的发送的数据第三步,客户端收到服务端发送的消息,回复:收到!这样就证明了客户端能正常收到服务端的消息。

7、HTTP

http1.1 和 http2 区别?

HTTP1.1

· 持久连接

· 请求管道化

· 增加缓存处理(新的字段如cache-control)

· 增加Host 字段、支持断点传输等

HTTP2.0

· 二进制分帧

· 多路复用(或连接共享)

· 头部压缩

· 服务器推送

8、HTTP 和HTTPS 的区别?

(1)HTTPS 协议需要到 CA 申请证书,一般免费证书较少,因而需要一定费用。(2)HTTP 是超文本传输协议,信息是明文传输,HTTPS 则是具有安全性的 SSL 加密传输协议。(3)HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。(4)HTTP 的连接很简单,是无状态的;HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。

9、对称加密和非对称加密的区别和原理?

对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方;

而非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。

由于非对称加密的方式不需要发送用来解密的私钥,所以可以保证安全性;但是和对称加密比起来,它比较慢,所以我们还是要用对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去。

10、常见的状态码有哪些?(熟悉常见的)

1×× : 请求处理中,请求已被接受,正在处理

2×× : 请求成功,请求被成功处理 200 OK

3×× : 重定向,要完成请求必须进行进一步处理 301 : 永久性转移 302 :暂时性转移 304 :已缓存

4×× : 客户端错误,请求不合法 400:Bad Request,请求有语法问题 403:拒绝请求 404:客户端所访问的页面不存在

5×× : 服务器端错误,服务器不能处理合法请求 500 :服务器内部错误 503 :服务不可用

11、Get与POST的区别

(1)GET 一般用来从服务器上获取资源,POST 一般用来创建资源;

(2)GET 是幂等的,即读取同一个资源,总是得到相同的数据,而 POST 不是幂等的。GET 不会改变服务器上的资源,而 POST 会对服务器资源进行改变;

(3)从请求参数形式上看,GET 请求的数据会附在URL之后;而POST 请求会把提交的数据则放置在是HTTP请求报文的请求体中。

(4)POST 的安全性要比 GET 的安全性高,因为 GET 请求提交的数据将明文出现在 URL 上,而 POST 请求参数则被包装到请求体中,相对更安全。

(5)GET 请求的长度受限于浏览器或服务器对URL长度的限制,允许发送的数据量比较小,而POST请求则是没有大小限制的。

12、在浏览器中输入一个网址后执行的全部过程?

总体流程

域名解析-> 建立TCP连接(三次握手)-> 发起http请求 -> 服务器响应http请求,浏览器得到html代码 -> 浏览器解析html代码,并请求html代码中的资源(如 js、css、图片等)-> 浏览器对页面进行渲染

13、Session、Cookie 的区别?

两者都是跟踪浏览器用户身份的回话方式。

· session 默认被存储在服务器的一个文件里(不是内存)

· session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)

· session 可以放在 文件、数据库、或内存中都可以。

· 用户验证这种场合一般会用session
· cookie 是存放在客户端的,用于记录用户信息的;session是存放在服务器端的,用于记录用户状态。
· cookie不安全,可以分析存放在本地的cookie进行cookie欺骗,session存放在服务器内存中,安全性较高。
· 单个cookie保存数据不可以超过4k,session则没有限制

操作系统

1.进程与线程的区别

进程:操作系统分配资源的最小单元。具有独立性,动态性,并发性,异步性。

线程:操作系统进行资源调度的最小单元。程序执行的最小单位

联系:进程创建了多个线程,各个子线程拥有自己的独立栈空间(存储函数参数、局部变量等),多个子线程与主线程共享堆、全局变量等非栈内存。
一个程序至少有一个进程,一个进程至少有一个线程,线程依赖于进程而存在。一个线程挂掉,会导致该线程所属的进程整个挂掉,但是一个进程挂掉,不会影响其他进程。
  • 协程是比线程更小的执行单元,调度主要在用户空间进行。(需注意)

1.1. 为什么采用多线程;对多线程的理解?

  1. 为了更好的利用cpu资源,如果只有一个线程则第2个任务必须等到第一个任务结束后才能进行,如果多线程的话,主线程执行任务的同时,可以执行其余的任务;
  2. 进程间不可以共享资源,线程间可以共享资源;
  3. 系统创建进程需要为其重新分配资源而线程代价较小;
  4. python中使用threading来支持多线程。
·  对于cpu密集型代码如循环计算  --多进程效率更高
 · 对于IO密集型代码文件操作,网络爬虫  ---多线程效率更高
·  Python中有全解释锁GIL:保证同一时刻只有一个线程可以执行。

2.进程间的通信方式

管道  有名管道 信号量  套接字 消息队列 信号 共享内存

3.线程间的通信方式

全局变量

消息队列 

4.线程间的同步方式

互斥,信号量,事件

4.常见锁

4.1 互斥锁
4.2 多重入锁(允许一个进程/线程多次拿到锁)
4.3 自旋锁 (CPU不断检查锁是否可用)
4.4 条件
4.5 信号量
4.6 读写锁

5.死锁产生的原因及解决策略

5.1 死锁产生的四个必要条件

1.互斥条件
2.请求保存条件
3.循环等待条件
4.不可抢占条件

5.2 死锁解决策略

1.死锁预防

主要的思想:提前破坏死锁产生的四个必要条件

1 破坏互斥条件

把某些互斥访问的资源改造成共享资源

缺点:可行性不高

2 破坏占有并等待条件

一:在进程执行前,一次性分配进程所需的全部资源,如果资源得不到满足,则不分配任何资源,暂不执行。

二:只有当进程不占有资源时才分配给进程资源。进程可以占有一部分资源,但是当它向os索取更多资源的时候必须先释放当前占有的全部资源

缺点:进程动态执行,难以事先预知进程所需的全部资源;资源利用率低;可能会导致饥饿

3 破坏不抢占条件

一:申请的资源得不到满足时则立即释放当前所拥有的全部资源

二:由操作系统干预按照优先级从别的进程那里剥夺某些资源

缺点:实现复杂;强行剥夺可能会导致进程失效;反复申请和释放导致系统性能较低;可能导致饥饿

4 破坏环路条件

所有资源排序编号,所有进程对资源的申请必须按照严格递增的顺序提出,每次只能申请序号更大的资源,防止产生环路

缺点:导致资源浪费,不方便加入新资源

2.死锁避免

动态地检测资源分配状态,以确保系统处于安全状态。

通过银行家算法进行动态评估,如果有风险就拒绝分配

3.死锁检测

采用资源分配图算法检测最终哪些进程会发生死锁。(允许发生死锁,主要是检测哪些进程会发生死锁)

流程:消除所有不与阻塞进程相连的边,直到无边可消。如果该节点的资源需求得到满足,则消除该节点及其所连的边,直到无边可消。如果此时图内没有任何边,则一定没有死锁,如果还有则一定会发生死锁。

4.死锁解除

1 资源剥夺法

挂起某些死锁资源,抢占其资源分配给其他的死锁进程

缺点:被挂起的进程可能会导致饥饿

2 终止进程法

强制终止部分、甚至全部死锁进程,并剥夺其所占有的资源

缺点:付出代价较大,有些进程已近结束,终止就会功亏一篑

6. 内存换出算法

FIFO先进先出

思想:淘汰最先进入的页面,采用队列实现,先进先出

OPT最佳算法

思想:淘汰以后不需要使用或者最远才会用到的页

LRU最久未使用淘汰算法

思想:淘汰最长时间没有被使用的页。软件可以用双向链表实现,访问的时候就把该页移到头部,淘汰时淘汰尾部

LFU最不经常使用淘汰算法

思想:淘汰访问频率最小的页,以次数为参考。新加入的页放在末尾,计数器置为1,每次访问计数器+1,并重新按照计数器大小排序,淘汰计数器最小的页

7. 进程调度算法

1.先来先服务
2.短作业优先
3.时间片轮转法
4.优先级调度算法

5.多级反馈队列
6.高响应比优先

数据库SQL

1.聚集索引与非聚集索引的区别

(1)一个表中只能拥有一个聚集索引,而非聚集索引一个表可以存在多个。

(2)聚集索引,索引中键值的逻辑顺序决定了表中相应行的物理顺序;非聚集索引,索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同。

(3)索引是通过二叉树的数据结构来描述的,我们可以这么理解聚簇索引:索引的叶节点就是数据节点。而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。

(4)聚集索引:物理存储按照索引排序;非聚集索引:物理存储不按照索引排序;

2.为什么要用B+树,为什么不用普通二叉树?

可以从几个维度去看这个问题,查询是否够快,效率是否稳定,存储数据多少,以及查找磁盘次数,为什么不是普通二叉树,为什么不是平衡二叉树,为什么不是B树,而偏偏是B+树呢?

(1)为什么不是普通二叉树?

如果二叉树特殊化为一个链表,相当于全表扫描。平衡二叉树相比于二叉查找树来说,查找效率更稳定,总体的查找速度也更快。

(2)为什么不是平衡二叉树?

我们知道,在内存比在磁盘的数据,查询效率快得多。如果树这种数据结构作为索引,那我们每查找一次数据就需要从磁盘中读取一个节点,也就是我们说的一个磁盘块,但是平衡二叉树可是每个节点只存储一个键值和数据的,如果是B树,可以存储更多的节点数据,树的高度也会降低,因此读取磁盘的次数就降下来啦,查询效率就快啦。

(3)为什么不是B树而是B+树?

B+树非叶子节点上是不存储数据的,仅存储键值,而B树节点中不仅存储键值,也会存储数据。innodb中页的默认大小是16KB,如果不存储数据,那么就会存储更多的键值,相应的树的阶数(节点的子节点树)就会更大,树就会更矮更胖,如此一来我们查找数据进行磁盘的IO次数有会再次减少,数据查询的效率也会更快。

B+树索引的所有数据均存储在叶子节点,而且数据是按照顺序排列的,链表连着的。那么B+树使得范围查找,排序查找,分组查找以及去重查找变得异常简单。

3.Hash索引和B+树索引区别是什么?

· B+树可以进行范围查询,Hash索引不能。

· B+树支持联合索引的最左侧原则,Hash索引不支持。

· B+树支持order by排序,Hash索引不支持。

· Hash索引在等值查询上比B+树效率更高。

· B+树使用like进行模糊查询的时候,like后面(比如%开头)的话可以起到优化的作用,Hash索引根本无法进行模糊查询。

4.什么是最左前缀原则?什么是最左匹配原则?

最左前缀原则,就是最左优先,在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。

当我们创建一个组合索引的时候,如(a1,a2,a3),相当于创建了(a1)、(a1,a2)和(a1,a2,a3)三个索引,这就是最左匹配原则。

5.索引不适合哪些场景?

· 数据量少的不适合加索引

· 更新比较频繁的也不适合加索引=区分度低的字段不适合加索引(如性别)

6.索引有哪些优缺点?

(1)优点:

· 唯一索引可以保证数据库表中每一行的数据的唯一性

· 索引可以加快数据查询速度,减少查询时间

(2)缺点:

· 创建索引和维护索引要耗费时间

· 索引需要占物理空间,除了数据表占用数据空间之外,每一个索引还要占用一定的物理空间

· 以表中的数据进行增、删、改的时候,索引也要动态的维护

7.悲观锁与乐观锁区别?

(1)悲观锁:

每次拿数据时都认为别人会修改,所以每次那数据时都会上锁,别人拿数据时会阻塞直到拿到锁。

(2)乐观锁:

每次拿数据都默认别人不会修改,所以不会上锁,在更新的时候会判断一下在此期间别人有没有去更新这个数据。

实现方式:乐观锁一般会使用版本号机制或CAS算法实现。

MVCC (Multiversion Concurrency Control),即多版本并发控制技术。

MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁

8.MySQL事务得四大特性以及实现原理?

· 原子性:事务是最小的执行单位,不允许分割。作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
· 一致性:执行事务后,数据从一个正确的状态转换到另一个正确的状态。

· 隔离性:多个事务并发访问时,事务之间是相互隔离的,即一个事务不影响其它事务运行效果。简言之,就是事务之间是进水不犯河水的。

· 持久性:表示事务完成以后,该事务对数据库所作的操作更改,将持久地保存在数据库之中。

事务的隔离级别有哪些?MySQL的默认隔离级别是什么?(注意英文)

· 读取未提交(Read Uncommitted)

· 读取已提交(Read Committed)

· 可重复读(Repeatable Read)

· 可串行化(Serializable)

Mysql默认的事务隔离级别是可重复读(Repeatable Read)

9.什么是幻读,脏读,不可重复读?

事务A、B交替执行,事务A被事务B干扰到了,因为事务A读取到事务B未提交的数据,这就是脏读。

在一个事务范围内,两个相同的查询,读取同一条记录,却返回了不同的数据,这就是不可重复读。

事务A查询一个范围的结果集,另一个并发事务B往这个范围中插入/删除了数据,并静悄悄地提交,然后事务A再次查询相同的范围,两次读取得到的结果集不一样了,这就是幻读。

10.InnoDB与MyIsam的区别?

11.delete drop的区别?

12 连接 (内连接,外连接)

13 数据库三大范式

以及数据库的查询等等的语句,建议多刷题!!

测试知识相关(可参考《软件测试的艺术》一书)

设计测试用例:

主要是功能性,性能性,安全性,易用性,兼容性,网络,压力测试,界面UI,中断测试。(尽可能想全,发散思维去说,不要怕说错)

软件测试方法分类

1 白盒测试

关注程序代码的具体细节,根据软件内部代码的逻辑结构分析来进行测试。主要是通过阅读程序代码或者通过使用开发工具中的单步调试来判断软件质量。关注代码的实现细节

测试用例设计方法:逻辑覆盖、循环覆盖、基本路径覆盖、判定覆盖

2 黑盒测试

不考虑其内部结构,即具体代码实现,检测软件的各个功能能否得以实现,确认软件功能的正确性,依靠软件说明书来判断测试用例,关注具体的客户需求及软件功能

测试用例设计方法:边界值分析法、等价类划分、错误猜测法、因果图法、状态图法、场景法

等价类:输入域的各子集中,各个输入数据对于揭露程序中的错误都是等效的。

· 等价类划分:将全部输入数据合理划分成若干个等价类,在每一个等价类中取一个数据作为输入条件,就可以用少量代表性测试数据取得较好的测试结果。分为有效等价类(合理、有意义的输入数据构成的集合)和无效等价类

· 边界值分析法:大量错误是发生在输入输出范围的边界上,选定测试用例时应该选取正好等于、刚刚大于、刚刚小于边界值的值作为测试数据,而不是选取等价类中的任意值,作为对等价类划分的补充

· 错误猜测法:基于经验和直觉推测,列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据这些情况选择测试用例

· 因果图法:考虑输入条件之间的相互组合,也考虑输出结果对输入条件的依赖关系。原因即为输入条件或者输入条件的等价类,结果即为输出条件,把因果转换为决策表,为决策表中的每一列设计测试用例。

· 场景分析法:根据用户场景来模拟用户的操作步骤

· 大纲法:着眼于需求。将需求转换为大纲的形式,大纲表示为树状结构,在根和叶子节点之间存在唯一路径,大纲为每条路径定义了一个特殊的输入条件集合,用于测试用例。

· 随机测试法:不考虑任何用例和需求,完全站在用户的角度对产品进行测试

灰盒测试

3 静态测试

在不运行程序的情况下寻找代码中可能存在的错误,或者评估程序代码

4 动态测试:

实际运行被测程序,输入相应的测试用例,检查运行结果与预期结果的差异

5 α测试:

一个用户在开发环境下的受控测试,模拟实际操作环境 如内测

6 β测试:

多个用户在实际使用环境下进行的测试,如公测

7.冒烟测试

在大规模测试之前,先对软件的基本、核心、主要功能进行测试,

8.回归测试

开发修正完代码后再回过头来做测试

软件测试阶段分类

1.单元测试

针对软件设计最小单位程序模块进行正确性检测。

2.集成测试

在单元测试基础上,将所有程序小模块组起来,进行有序的测试。

3.系统测试

在系统的真实运行环境下,检查完整的程序系统是否可以和硬件、外设、网络和系统软件、支持平台等正确配置、连接。

4.验收测试

一般由供求双方共同达成,模拟用户实际运行的环境,对功能模块全面测试。

软件测试的基本流程(一般会针对项目来)

1.测试需求阶段:阅读‘软件 需求 规格说明书’,理解需求

2.测试计划阶段:参考软件需求说明书进行测试计划的编写,内容主要包括测试范围、、人力物力分配、整体测试策略以及进度安排

3.测试设计阶段:进行测试用例的编写,并进行评审

4.测试执行阶段:搭建环境,执行即冒烟测试,然后正式测试,提交bug,追踪bug,直到软件达到测试需求要求

5.测试评估阶段:给出测试报告,确认产品是否可以上线

6.项目总结复盘,为后面项目留下经验。
关于自动化测试的知识也很重要,一些工具的使用 如selenium,postman,jmeter,fiddler,wireshark等等建议熟悉了解。

通用知识点(重要)

为什么要做测试或测试开发?(必问,lz面试的公司基本没有不问的)
你对测试或测开的理解?
你的职业规划?(重要)
你做测试的优势?
你个人的性格?
别人对你如何评价?
有没有社团经历?
参加过什么比赛,有什么收获?
编写测试用例一般根据什么?
讲一个你熟悉的一个项目?(必问,重要,重要,重要) 有没有遇到什么困难(坑)?
遇到的最大的困难?怎么去解决这个困难?
最有成就感的事情?
你个人的优缺点?
有什么爱好?
怎么看待加班?压力太大怎么调节?
暂时想到这么多。。。。想到其他的再补充。。

番外

传统软件测试旨在检测现有行为和期望行为之间差异的任何活动。软件测试的一般步骤是先从待测软件的输入域中选择一组测试用例(<输入,输出>),然后将这些测试用例交给待测软件执行,比较待测软件的实际输出与预期输出是否相符,若不符合,表明待测软件存在缺陷。因此,软件测试最重要的两个概念分别是测试预言(oracle)和测试覆盖(coverage)。测试预言提供了一种正确性标准检查被测程序是否存在缺陷;测试覆盖率衡量使用提供的测试输入可以评估多少测试目标程序。

重要:当然刷题也是少不了的啦,牛油们可以多多刷题,至少要把剑指offer刷熟哦,十大排序算法是必刷的!!

各位牛油们如果觉得有帮助,可以点赞、收藏、关注来一波

最后 祝各位牛油OFFER多多!!!中国人不骗中国人 啊哈哈哈哈



更多模拟面试

全部评论

(15) 回帖
加载中...
话题 回帖