测试开发面经分类汇总--今日头条为例:
准备:一定要提前尽早准备,如果能实习最好去,对于自己的项目一定要熟悉,最好系统流程整理,多训练几遍
书籍推荐:楼主主学C++和pyhon
基础:《C++ Primer》,《Effective C++》,《剑指offer》,《王道程序员面试宝典》,《SLT源码剖析》
数据结构:《大话数据结构》
算法:《算法导论》,《编程之美》
测试:虫师的《Selenium2自动化测试实战》,《软件测试面试突击》
网络:《计算机网络》,《计算机操作系统》
《数据库系统概念》,《深入浅出MySQL》,《高性能MYSQL》
看的很杂:《机器学习实战》,《大话设计模式》,《第一行代码》,《程序员代码面试指南》,鸟哥的《linux私房菜》
测试岗位分类:测试也分服务端测试和客户端测试,写代码的测试和手工测试
自我介绍,简历项目介绍,简历详细问
一、进程与线程
1. 写代码:多线程实现从A,B,C三个文件中读取文件放到D文件中,优化:如何同步实现
2.多线程中有哪些锁
1)偏向锁 加锁和解锁不需要额外的消耗,和执行非同步方法比仅存在纳秒级的差距。如果线程间存在锁竞争,会带来额外的锁撤销的消耗。适用于只有一个线程访问同步块场景。
2)轻量级锁 竞争的线程不会阻塞,提高了程序的响应速度。如果始终得不到锁竞争的线程使用自旋会消耗CPU。 追求响应时间。同步块执行速度非常快。
3)重量级锁 线程竞争不使用自旋,不会消耗CPU。 线程阻塞,响应时间缓慢。追求吞吐量。同步块执行速度较长。
详情:https://blog.csdn.net/u012834750/article/details/69398216
3.线程和进程的区别
答:首先得知道什么是进程什么是线程?
我的理解是进程是指在系统中正在运行的一个应用程序;程序一旦运行就是进程,或者更专业化来说:进程是指程序执行时的一个实例。
线程是进程的一个实体。
进程——资源分配的最小单位,线程——程序执行的最小单位。
线程进程的区别体现在几个方面:
第一:因为进程拥有独立的堆栈空间和数据段,所以每当启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这对于多进程来说十分“奢侈”,系统开销比较大,而线程不一样,线程拥有独立的堆栈空间,但是共享数据段,它们彼此之间使用相同的地址空间,共享大部分数据,比进程更节俭,开销比较小,切换速度也比进程快,效率高,但是正由于进程之间独立的特点,使得进程安全性比较高,也因为进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。一个线程死掉就等于整个进程死掉。
第二:体现在通信机制上面,正因为进程之间互不干扰,相互独立,进程的通信机制相对很复杂,譬如管道,信号,消息队列,共享内存,套接字等通信机制,而线程由于共享数据段所以通信机制很方便。。
3.属于同一个进程的所有线程共享该进程的所有资源,包括文件描述符。而不同过的进程相互独立。
4.线程又称为轻量级进程,进程有进程控制块,线程有线程控制块;
5.线程必定也只能属于一个进程,而进程可以拥有多个线程而且至少拥有一个线程;
第四:体现在程序结构上,举一个简明易懂的列子:当我们使用进程的时候,我们不自主的使用if else嵌套来判断pid,使得程序结构繁琐,但是当我们使用线程的时候,基本上可以甩掉它,当然程序内部执行功能单元需要使用的时候还是要使用,所以线程对程序结构的改善有很大帮助。
进程与线程的选择取决以下几点:
1、需要频繁创建销毁的优先使用线程;因为对进程来说创建和销毁一个进程代价是很大的。
2、线程的切换速度快,所以在需要大量计算,切换频繁时用线程,还有耗时的操作使用线程可提高应用程序的响应
3、因为对CPU系统的效率使用上线程更占优,所以可能要发展到多机分布的用进程,多核分布用线程;
4、并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求;
5、需要更稳定安全时,适合选择进程;需要速度时,选择线程更好
4. 线程的状态
1).初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
2).运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。
3).阻塞(BLOCKED):表示线程阻塞于锁。
4).等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
5).超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。
6).终止(TERMINATED):表示该线程已经执行完毕
详情:https://blog.csdn.net/pange1991/article/details/53860651
5. 线程的几种状态,以及如何相互转换?
1.初始状态
实现Runnable接口和继承Thread可以得到一个线程类,new一个实例出来,线程就进入了初始状态。
2.1.就绪状态
#就绪状态只是说你资格运行,调度程序没有挑选到你,你就永远是就绪状态。
#调用线程的start()方法,此线程进入就绪状态。
#当前线程sleep()方法结束,其他线程join()结束,等待用户输入完毕,某个线程拿到对象锁,这些线程也将进入就绪状态。
#当前线程时间片用完了,调用当前线程的yield()方法,当前线程进入就绪状态。
#锁池里的线程拿到对象锁后,进入就绪状态。
2.2.运行中状态
线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一一种方式。
3.阻塞状态
阻塞状态是线程阻塞在进入synchronized关键字修饰的方法或代码块(获取锁)时的状态。
4.等待
处于这种状态的线程不会被分配CPU执行时间,它们要等待被显式地唤醒,否则会处于无限期等待的状态。
5.超时等待
处于这种状态的线程不会被分配CPU执行时间,不过无须无限期等待被其他线程显示地唤醒,在达到一定时间后它们会自动唤醒。
6.终止状态
#当线程的run()方法完成时,或者主线程的main()方法完成时,我们就认为它终止了。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦终止了,就不能复生。
#在一个终止的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。
6. 创建线程两种方式的区别
1)继承Threa类,并且覆盖Thread类的run()方法:这种方法的优点是Thread子类对象就是线程对象,具有Thread类的方法,且具有线程体,但是不适应多继承。因为java里类的继承是单继承的,继承了Thread类就无法继承其他类了。
2)实现Runnable接口:如果一个类已经继承了一个类还必须要以线程方式运行,就需要实现Runnable接口。实现Runnable接口的类的对象本身并不是线程对象,只是作为一个创建线程对象的目标对象使用。
详情:https://blog.csdn.net/xlantian/article/details/80614716
7. 聊天都是新建线程,会影响内存,怎么处理
多线程会遇内存溢出问题,其实说白了就是内存不够用了,那么要解决这个问题,我们就需要 “开源节流”了
1)开源(增加内存分配)
2).节流(内存优化)
说到内存优化,要讲的东西就多了,但是其中效果最明显的就是以下两点
#图片显示的优化
#.解决内存泄漏
详情:https://blog.csdn.net/yulyu/article/details/55669236
8. 线程之间共享数据的方式
方式1:
将共享数据封装在另外一个对象中,然后将这个对象逐一传递给各个Runnable对象。每个线程对共享数据的操作方法也分配到那个对象身上去完成,
这样容易实现针对该数据进行的各个操作的互斥和通信。
思想:一个类提供数据和操作数据的同步方法,另外定义两个线程通过构造函数接收并操作数据,在主函数中直接创建线程对象,即可完成操作
方式2:
将这些Runnable对象作为某一个类中的内部类,共享数据作为这个外部类中的成员变量,每个线程对共享数据的操作方式也分配给外部类,以便实现对
共享数据进行的各个操作的互斥和通信,作为内部类的各个Runnable对象调用外部类的这些方法。
思想:一个外部类里面有两个内部类,为了让这两个内部类共享数据,让它们都操作外部类的同一个成员,方法和数据都在这个成员身上,直接 调用方法即可完成 数据的操作
方式3:将上面两种方式的组合:
将共享数据封装在另外一个对象中,每个线程对共享数据的操作方法也分配到那个对象身上去完成,对象作为这个外部类中的成员变量或方法中的局部变量,每个线程的Runnable的对象作为外部类中的成员内部类或局部外部类。
详情:https://blog.csdn.net/xushuaic/article/details/8259330
9. 进程通信(分别解释),ping工作原理,中断,线程共享父线程的什么,
##Ping:DOS命令,一般用于检测网络通与不通 ,也叫时延,其值越大,速度越慢 PING (Packet Internet Grope),因特网包探索器,用于测试网络连接量的程序。Ping发 送一个ICMP回声请求消息给目的地并报告是否收到所希望的ICMP回声应答.
详情:https://blog.csdn.net/zhuying_linux/article/details/6770730
##.中断是一种可以使CPU和硬件设备进行通信的技术。例如,当我们在敲击键盘时,键盘控制器(控制键盘的硬件设备)会发送一个中断,通知操作系统有键按下。从本质上说,中断是一种特殊的信号,由硬件设备向CPU发送。当CPU接收到中断信号后,就会马上通知操作系统此信号的到来,然后由操作系统负责处理这些新到来的数据。
详情:https://blog.csdn.net/daniel80110_1020/article/details/69257953
10. 多线程里面mutex如何使用(问的太细了我只知道lock和unlock),
创建mutex内核对象,用来作为线程间或进程间通信的API接口,既然是关于多线程的锁使用问题,那么显然需要介绍下创建线程的API,函数原型:既然是关于多线程的锁使用问题,那么显然需要介绍下创建线程的API,函数原型:
详情:https://blog.csdn.net/roger_ranger/article/details/78536704
11. 虚拟内存,QT关于一个信号对应多个槽如何实现
1)虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。目前,大多数操作系统都使用了虚拟内存,如Windows家族的“虚拟内存”;Linux的“交换空间”等
12.进程间通信
进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。
IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中Socket和Streams支持不同主机上的两个进程IPC。
详情:https://www.cnblogs.com/CheeseZH/p/5264465.html
12. Java中哪些实现了CAS https://www.jb51.net/article/125232.htm
在计算机科学中,比较和交换(Conmpare And Swap)是用于实现多线程同步的原子指令。 它将内存位置的内容与给定值进行比较,只有在相同的情况下,将该内存位置的内容修改为新的给定值。 这是作为单个原子操作完成的。 原子性保证新值基于最新信息计算;如果该值在同一时间被另一个线程更新,则写入将失败。 操作结果必须说明是否进行替换;这可以通过一个简单的布尔响应(这个变体通常称为比较和设置),或通过返回从内存位置读取的值来完成(摘自维基本科)https://www.cnblogs.com/javalyy/p/8882172.html
13. AQS
类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch...。
详情:https://www.cnblogs.com/waterystone/p/4920797.html
14. volatile是线程安全的吗 ?为什么?
明白为什么volatile保证不了线程安全。想要线程安全必须保证原子性,可见性,有序性。而volatile只能保证可见性和有序性
详情:http://www.cnblogs.com/kubidemanong/p/9505944.html
16.多线程实现的方式?
Java多线程实现方式主要有四种:继承Thread类、实现Runnable接口、实现Callable接口通过FutureTask包装器来创建Thread线程、使用ExecutorService、Callable、Future实现有返回结果的多线程。
其中前两种方式线程执行完后都没有返回值,后两种是带返回值的。
详情:https://www.cnblogs.com/felixzh/p/6036074.html
二、设计模式
1.写一个单例模式,什么时候用到,还了解哪些设计模式,装饰者模式是什么,举例
2.你比较熟悉的设计模式有哪些
3.设计一个类,我们只能获取这个类的一个实例,其实是一个单例模式,可以作为参考(我写到了static)
4.观察者模式
三、计算机网络
1.post和get的区别
get参数通过url传递,post放在request body中。
get请求在url中传递的参数是有长度限制的,而post没有。
get比post更不安全,因为参数直接暴露在url中,所以不能用来传递敏感信息。
get请求只能进行url编码,而post支持多种编码方式
get请求会浏览器主动***,而post支持多种编码方式。
get请求参数会被完整保留在浏览历史记录里,而post中的参数不会被保留。
GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
GET产生一个TCP数据包;POST产生两个TCP数据包。
长的说:
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
(据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
2. 三次握手
11.TCP三次握手的状态变化
12.TCP四次挥手TIME_WAIT出现在哪 为什么要有TIME_WAIT
13.为啥握手需要三次,挥手需要四次
TCP在传输之前会进行三次沟通,一般称为“三次握手”,传完数据断开的时候要进行四次沟通,一般称为“四次挥手”。
两个序号和三个标志位:
(1)序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
(2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。
(3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
(A)URG:紧急指针(urgent pointer)有效。
(B)ACK:确认序号有效。
(C)PSH:接收方应该尽快将这个报文交给应用层。
(D)RST:重置连接。
(E)SYN:发起一个新连接。
(F)FIN:释放一个连接。
需要注意的是:
(A)不要将确认序号ack与标志位中的ACK搞混了。
(B)确认方ack=发起方req+1,两端配对。
在第一次消息发***,A随机选取一个序列号作为自己的初始序号发送给B;第二次消息B使用ack对A的数据包进行确认,
因为已经收到了序列号为x的数据包,准备接收序列号为x+1的包,所以ack=x+1,同时B告诉A自己的初始序列号,就是seq=y;
第三条消息A告诉B收到了B的确认消息并准备建立连接,A自己此条消息的序列号是x+1,所以seq=x+1,而ack=y+1是表示A正准备接收B序列号为y+1的数据包。
四次挥手:
由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,
收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。
首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。
(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
(1)三次握手是什么或者流程?四次握手呢?答案前面分析就是。
(2)为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,收到对方的FIN报文时,
仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,
再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。
为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
不应该是为了防止B发送的FIN=1的包的丢失,因为如果A没有收到来自B的释放连接请求,是不会进入TIME-WAIT状态的。
所以正确的解释是:A发送的确认释放连接信息B没有收到,这时候B会再次发送一个FIN=1的释放连接请求,而这个时候A还处于TIME-WAIT,所以可以再次发送确认信息
3. 介绍http tcp
TCP是底层通讯协议,定义的是数据传输和连接方式的规范;
HTTP是应用层协议,定义的是传输数据的内容的规范;
HTTP协议中的数据是利用TCP协议传输的,所以支持HTTP也就一定支持TCP;
HTTP支持的是www服务 ;
而TCP/IP是协议, 是Internet国际互联网络的基础,是网络中使用的基本的通信协议。
TCP/IP实际上是一组协议,它包括上百个各种功能的协议,如:远程登录、文件传输和电子邮件等,而TCP协议和IP协议是保证数据完整传输的两个基本的重要协议。通常说TCP/IP是Internet协议族,而不单单是TCP和IP。
详情:https://blog.csdn.net/u013485792/article/details/52100533
4. 输入url,到浏览器显示的过程
5. tcp,udp是第几层协议,区别,应用场景,TCP为什么是可靠的,为什么udp传输速度快
概述
两者都是通信协议,TCP、UDP是传输层协议,但他们的通信机制与应用场景不同,下面来阐述两者的区别以及它们的应用场景。
TCP与UDP
TCP(Transmission Control Protocol),又叫传输控制协议,UDP(User Datagram Protocol),又叫用户数据报协议,它们都是传输层的协议,但两者的机制不同,它们的区别如下:
特点 TCP UDP
连接性 面向连接 面向非连接
可靠性 可靠 不可靠
传输效率 慢 快
TCP
从如上表格看到,TCP是面向连接的,并且是一种可靠的协议,在基于TCP进行通信时,通信双方需要先建立一个TCP连接,建立连接需要经过三次握手,握手成功才可以进行通信,关于TCP三次握手、四次挥手的过程请看该文章。
另外TCP协议是一种可靠的传输协议,那么它是如何保证可靠性的呢?
可靠性
在讲解TCP如何保证可靠性前,首先得理解什么是可靠。在通信的角度来看,可靠即要确保通信双方的通信信息不会丢失,若丢失了保证能够对其进行恢复,并且收到的信息内容与原发送内容一样。
在TCP中,传输报文都是通过建立的虚拟连接来进行传输,发送端传输的每一个TCP报文,都会对其进行编号(编号是由于网络传输的原因,发送的报文可能会乱序到达,因此需要根据编号对报文进行重排),并且开启一个计时器;当接收端收到报文后,并且通过校验和对收到的报文数据进行校验,若校验成功则会返回一个确认报文,告知发送端我已经成功收到该报文了;若发送端在计时器结束前仍未收到确认报文,则认为接收端接收失败,则会重传该报文;服务端若收到重复报文(根据编号发现已经是收到了),则会将该报文丢弃。
因此,从上面的机制可以知道,TCP是通过重传、确认和校验和的方式来确保可靠。
注:校验和并不能检验数据是否被篡改过,想要保证数据的完整性可以了解一下数字签名
UDP
UDP是一种面向无连接,且不可靠的协议,在通信过程中,它并不像TCP那样需要先建立一个连接,只要(目的地址,端口号,源地址,端口号)确定了,就可以直接发送信息报文,并且不需要确保服务端一定能收到或收到完整的数据。它仅仅提供了校验和机制来保障一个报文是否完整,若校验失败,则直接丢弃报文,不做任何处理。
TCP与UDP的应用场景
从特点上我们已经知道,TCP是可靠的但传输速度慢 ,UDP是不可靠的但传输速度快。因此在选用具体协议通信时,应该根据通信数据的要求而决定。
若通信数据完整性需让位与通信实时性,则应该选用TCP协议(如文件传输、重要状态的更新等);反之,则使用UDP协议(如视频传输、实时通信等)。
7、常见的HTTP状态码
1XX系列:指定客户端应相应的某些动作,代表请求已被接受,需要继续处理。由于HTTP/1.0协议中没有定义任何1xx状态码,所以除非在某些试验条件下,服务器禁止向此类客户端发送1xx响应。
2XX系列:代表请求已成功被服务器接收、理解、并接受。这系列中最常见的有200、201状态码。
200状态码:表示请求已成功,请求所希望的响应头或数据体将随此响应返回
201状态码:表示请求成功并且服务器创建了新的资源,且其URI已经随Location头信息返回。假如需要的资源无法及时建立的话,应当返回'202 Accepted'
202状态码:服务器已接受请求,但尚未处理
3XX系列:代表需要客户端采取进一步的操作才能完成请求,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的Location域中指明。这系列中最常见的有301、302状态码。
301状态码:被请求的资源已永久移动到新位置。服务器返回此响应(对GET或HEAD请求的响应)时,会自动将请求者转到新位置。
302状态码:请求的资源临时从不同的URI响应请求,但请求者应继续使用原有位置来进行以后的请求
304自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。 如果网页自请求者上次请求后再也没有更改过,您应将服务器配置为返回此响应(称为If-Modified-Since HTTP标头)。
4XX系列:表示请求错误。代表了客户端看起来可能发生了错误,妨碍了服务器的处理。常见有:401、404状态码。
401状态码:请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
403状态码:服务器已经理解请求,但是拒绝执行它。与401响应不同的是,身份验证并不能提供任何帮助,而且这个请求也不应该被重复提交。
404状态码:请求失败,请求所希望得到的资源未被在服务器上发现。没有信息能够告诉用户这个状况到底是暂时的还是永久的。假如服务器知道情况的话,应当使用410状态码来告知旧资源因为某些内部的配置机制问题,已经永久的不可用,而且没有任何可以跳转的地址。404这个状态码被广泛应用于当服务器不想揭示到底为何请求被拒绝或者没有其他适合的响应可用的情况下。
5xx系列:代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。常见有500、503状态码。
500状态码:服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器的程序码出错时出现。
503状态码:由于临时的服务器维护或者过载,服务器当前无法处理请求。通常,这个是暂时状态,一段时间会恢复
8. 计算机网络的七层结构、每层中有什么协议
OSI(open system interconnect开放系统互联)七层模型:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。
对等层之间不能相互直接通信,各层之间是严格单向依赖,上层使用下层提供的服务,下层向上层提供服务
详情:https://blog.csdn.net/N1neDing/article/details/79938570
第七层应用层
协议:DHCP • DNS • FTP •Gopher• HTTP •IMAP4•IRC•NNTP•XMPP•POP3•SIP•SMTP•SNMP•SSH•TELNET•RPC•RTCP•RTSP•TLS•SDP•SOAP•GTP•STUN•NTP• 更多
第六层表示层
不用协议
第五层会话层不用协议
第四层传输层
协议:TCP • UDP •DCCP•SCTP•RTP•RSVP•PPTP• 更多
第三层网络层
协议:IP (IPv4•IPv6)•ARP•RARP•ICMP•ICMPv6•IGMP•RIP•OSPF•BGP•IS-IS•IPsec• 更多
第二层数据链路层
协议:802.11•802.16•Wi-Fi•WiMAX•ATM•DTM• 令牌环 • 以太网 •FDDI• 帧中继 •GPRS•EVDO•HSPA•HDLC•PPP•L2TP•ISDN• 更多
第一层物理层
协议: RS-443、RS-232C、RS-485、理-2593
1.物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。这一层的数据叫做比特。
2.数据链路层:主要将从物理层接收的数据进行MAC地址(网卡的地址)的封装与解封装。常把这一层的数据叫做帧。在这一层工作的设备是交换机,数据通过交换机来传输。
3.网络层:主要将从下层接收到的数据进行IP地址(例192.168.0.1)的封装与解封装。在这一层工作的设备是路由器,常把这一层的数据叫做数据包。
4.传输层:定义了一些传输数据的协议和端口号, 主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段。
5.会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或或者接受会话请求。
6.表示层:主要是进行对接收的数据进行解释、加密与解密、压缩与解压缩等(也就是把计算机能够识别的东西转换成人能够能识别的东西。
7.应用层 主要是一些终端的应用,比如说FTP,WEB(IE浏览),QQ之类的(你就把它理解成我们在电脑屏幕上可以看到的东西.就是终端应用)。
9. http和https的区别https的加密方式
HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏 览器更加高效,使网络传输减少。http协议属于明文传输协议,交互过程以及数据传输都没有进行加密,通信双方也没有进行任何认证,通信过程非常容易遭遇劫持、监听、篡改,严重情况下,会造成恶意的流量劫持等问题,甚至造成个人隐私泄露(比如银行卡卡号和密码泄露)等严重的安全问题。
HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。
HTTP和HTTPS的区别:
(1)HTTPS协议需要到CA(电子商务认证机构)申请证书,一般免费证书很少,需要交费。
(2)HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的ssl加密传输协议
(3)HTTP和HTTPS使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。
(4)HTTP的连接很简单,是无状态的
(5)HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比HTTP协议安全
(6)HTTPS内容传输经过完整性校验
(7)HTTPS内容经过对称加密,每个连接生成一个唯一的加密密钥
(8)HTTPS第三方无法伪造服务端(客户端)身份
HTTPS的加密算法:
首先介绍两个概念:
对称秘钥:对称密钥加密又叫专用密钥加密,即发送和接收数据的双方必使用相同的密钥对明文进行加密和解密运算。通常有两种模式:流加密和分组加密。
非对称秘钥:非对称加密算法需要两个密钥:公开秘钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
详情:https://www.cnblogs.com/xyzyj/p/7338495.html
14.DNS解析流程(浏览器和本地未命中怎么解析)
15.HTTP请求头包括那些信息
16.三次握手四次挥手的过程,分别对应socket通信的哪个部分(特别详细connect,accept返回是什么额)
17.如果最后一次握手服务器没有收到对方的确认信息怎么办(这个问题没回答上来挂掉了)
18.四次挥手最后为什么需要一个等待时间,时间为多少
19.http有几个版本,分别有哪些特性,
20.ICMP SNMP DHCP ARP等名词解释
21.局域网分为哪几类,IP地址,子网掩码
22.解释交换机、网关、路由器
23.链路层有哪些协议
24.如果是自动获取DNS,那么如何查看当前计算机的DNS地址
25.OSI模型、IP地址和MAC地址、
26.socket网络编程
27.网络中数据量比较大的时候,会发生什么?
2.访问一个网址的整个过程?用到了哪些协议?
3.ARP和RARP协议在那一层?
4.视频采用的是那种协议?
5.一个四核CPU的机器,同一时刻能运行多少个应用程序?为什么?
四、数据库
1.mysql优化
2.写sql语句,找出两门以上成绩不及格的学生的学号
3.数据库增删改查命令(简历里写的实习内容),分别介绍一下每个命令的作用,删除表,删除表的某一行各怎么写
4.打印每个学生的最高分,每个学生有多个成绩。table:courseid username score
1.select * from table group by username having score=max(score)
2.select courseid,username,max(score) from table group by username
5.user:uid uname,project:pid pname,u_p: uid pid打印出姓名为ming的所有pid和pname,user表特别大。
6.建表和查询语句, 自增长的名字怎么拼
7.Mysql如何设计数据表
8.Mylsam和InnDb区别
9.如果给你一个学生表如何设计数据表
10.如果是大量数据的话如何优化
11.Sql语句,插入一行数据,增加表的一列
12.数据库count 函数
13.你知道的数据库常用聚合函数
14.描述一下 数据库 的主键 外键 索引 存储过程 触发器。。
15.数据库:学生表,成绩表,查询成绩最高的十个姓王的学生的姓名
16.数据库左连接与右连接的区别
17.数据库主从结构(如何搭建一个主从数据库)、数据库临时表
18.数据库锁机值、数据库去重、限制个数采用什么关键字、数据库索引、数据库分页机制
19.数据库的三大范式,满足此条件设计一个数据库
20.数据库事务
21.数据库查询如何进行优化(答的子查询和索引,举了一个分页查询的优化;例子),行锁和表锁的区别和应用,
22.sql:inner join查询,写查询语句
23.数据库的连接、左连接、右连接、内连接区别,应用场景?
9.数据库的隔离级别?解释?
10.数据库的索引了解哪些?
11.数组中有两个数出现了1次,其他出现了2次,找出这两个出现一次的?
12.0-9,a-z,36输入两个字符串类型的数,进行两个数36进制内的求和?
11.主从复制和读写分离
12.主从复制中延迟
13.索引如何创建
五、死锁
1.介绍死锁和如何避免
2.怎么检测死锁,死锁检测中的数据结构,死锁定理,资源分配图
3.死锁产生的条件,写一个死锁程序。
六、异常
1.异常:见过哪些异常,classCastException是什么异常,在什么时候出现2.异常的分类、sql中的异常有哪些?
七、测试
1.写测试用例:查单词app,第一个界面有输入框和“查询”按钮,第二个界面有返回按钮和显示查询内容的webview
2.设计测试用例:朋友对你的状态点赞
3.如何测试一个多线程安全的日志类库
4.如何测试一个IM(及时通信)系统
5.给一款监控系统,要检测哪些?针对监控系统,怎么设计,需要检测监控系统本身什么?
6.测试淘宝发表评价界面
7.测试的种类
8.你自己的项目是如何进行测试的
9.手机端测试跟pc端测试有什么区别
10.Pc端的软件如何变成手机端的
11.测试的什么(功能、性能、安全、兼容、移植(可移植性的环境包括软件环境,硬件环境和系统的组织环境,而跨平台性更多的是指不同的操作系统。))
12.黑盒白盒测试的区别以及使用的方法
13.测试一台电视机
14.***测试的流程
15.怎么做的自动化测试
16.测试一个手机登陆界面
17.抖音的上划功能 如何设计测试
18.如何测试一个app(功能、版本兼容、界面、交互、性能包括压力并发流量安全、内存)
19.如何理解单元测试
20.你对测试开发的理解
21.如何做junit、appium以及原理
22.appium原理;如何测试朋友圈发评论
23..设计测试用例,测爱奇艺视频播放功能
24.时针和分针夹角的问题,代码优化,设计测试用例
25.描述测试框架的架构,你做的部分
26.对一支笔设计测试用例
27.对cp命令设计测试用例。。要想的全面一点
28.使用今日头条,有一天用户刷新不出来东西,可能有哪些原因?
29.如何测试微信朋友圈发送视频的功能?
30.如何测试一批矿泉水
31.python自动化测试框架,软件测试基本流程
32.对于测试以自动化测试的理解
33.如何测试一个钟表
34.创建一个十字节动态数组new一个,怎么测试该语句
35.web端测试需要注意什么
36.测试共享单车app界面
37.测试共享单车付费界面
38. 测试一个百度网站,从哪些方面测试?
39.场景题,比如说你认为是bug,开发人员认为不是,应该怎么办?
40.项目马上上线了,你发现了一个重大的bug,你会怎么办?
41.项目上线之后,用户反映一个问题,而在线下又难以复现,你会怎么办?需要提交一个bug,进行后续的追踪?
42.测试一个电梯,考虑从哪些方面测试?危险、断电
43.讲讲你对测试开发的理解?
44.测一张A4纸,如何测?
45.对于网页上出现了一片空白,主要从哪几个方面进行排查?
46.网页访问很慢的时候,怎么排查问题?以及怎么解决?(主要考察负载均衡,以及如何实现)
47.对头条的搜索功能设计测试用例?
八、Linux编程
5.过滤出某一个生产条件(?没听清)对应的进程
1.会不会shell编程
2、Linux命令,查看机器上所有的进程(top
3.介绍Linux管道
4.Linux你会什么指令,例如查看。。
5.一个文件夹下有多少个文件
6.清空文件夹下的所有文件内容,不是删除
7.查看端口号是否被占用
8.打印文件a.log中所有包含error的行数,字符数(error算一个字符)
9.Linux命令 如何杀死占用指定端口的进程
10.你一般都是在Linux上写代码吧,那你说一下gdb调试的原理,比如我们打一个断点,他的原理是什么(其实打断点就是一个进程给另一个进程发送了一个信号,但是我是真的忘记SIGTRAP这个名字了)
11.熟悉哪些linux 命令 统计某个文件行数
12. 1)全局替换,不用vi 的方式。 2) 批量杀死进程
13.写你用过的linux命令 Scp 和cp区别
14.linux查看进程的指令
5.Linux熟悉吗?统计文件的行数?
6.批量杀死进程?
九、语言类
1.java中单例模式和静态类的关系
2、面向对象里面重写和重载的区别(我的回答里面提到了父函数和子函数)
3、父函数子函数是指什么
4、设计一个类,我们只能获取这个类的一个实例,其实是一个单例模式,可以作为参考(我写到了static)
5、类里面静态变量和非静态变量的区别(原题+3)
6.Sleep与wait的区别
7.泛型,泛型好处?(Java)
8.Java反射
9.静态代码块执行几次,为什么
10.string、stringbuffer、stringbuilder的异同,底层实现。为什么把string设置为final类型
11.抽象类和接口的联系和区别
12.PYthon内存管理垃圾回收
13.PYthon2和3的区别,遇到过乱码吗?怎么解决,为啥会出现乱码
14.内存溢出 内存泄露区别
15.Java基本数据类型;String算什么类型;
16.Python 基础
17.Java 和Python 区别
18.Python 内存处理机制
19.Python 去重复 手撕代码 去重复,不能直接调用函数
20.用过哪些python库,详细说明
21.malloc和new的区别
22.python常用数据结构以及展开聊、
3.讲讲java的内存分配
4.Java中对象访问的方式
十、其他
1.***gc,GC什么时候回收,GC标记清除是哪一代的?
2.登录界面,用户名,密码,验证码先验证哪一个
3、过滤出某一个生产条件(?没听清)对应的进程
4.Git用过吗?如何切换分支?如何暂存工作台?
4—1.Pull Github的code如何进行版本控制
5.软件的整个流程
6.软件开发的流程
7.软件开发的模型
8.同步sync的几种用法,这几种用法的不同之处
9.Noi
10.找规律:1,11,21,1211,111221,312211,_______
11.智力题:一根不均匀的绳子,烧完的时间是1小时。给你若干根不均匀的绳子,如何计时1小时15分。
12.用过Jenkins吗?怎么配置的,如何查看报告?除了发邮件通知还有什么通知方法?
13.Jenkins的trigger
14.Jekins Pipeline
15.Jekins怎么集成别的语言
16.Unittest框架
17.xml文件如何可视化更强
18.selenium原理简述
19.Selenium的Webdriver底层实现
20.Webdriver发送command给Chrome后如何渲染HTML网页
21.临界区是啥
22.看你是计算机专业的,你给我讲讲计算机基础里的与门,或门,非门的原理吧.....那异或呢
23.那怎么判断一个一个数是不是2的幂次方,讲思路,写代码
24.如果有很大的数据,你需要把他读取出来,进行数据清理,然后展示到前端去,如果这个系统交给你去设计,那么你会分成哪几个部分去设计他
25.缓存机制;JS如何处理阻塞
26.头条有哪些产品,针对你熟悉的,给一些建议
27.Windows 开机越来越慢,怎么查问题
1.USB硬盘和扫描仪等设备
如果电脑安装了扫描仪等设备,或在启动时已经连接了USB硬盘,那么不妨试试先将它们断开,看看启动速度是不是有变化。一般来说,由于USB接口速度较慢,因此相应设备会对电脑启动速度有较明显的影响,应该尽量在启动后再连接USB设备。如果没有USB设备,那么建议直接在BIOS设置中将USB功能关闭。
提示:由于Windows 启动时会对各个驱动器(包括光驱)进行检测,因此如果光驱中放置了光盘,也会延长电脑的启动时间。
2.令人心烦的网卡
如果设置不当,网卡也会明显影响系统启动速度,如果你的电脑用不着网卡,那就直接将网卡拔掉,以免影响系统启动速度。
如果你的电脑连接在局域网内,安装好网卡驱动程序后,默认情况下系统会自动通过DHCP来获得IP地址,但大多数公司的局域网并没有DHCP服务器,因此如果用户设置成“自动获得IP地址”,系统在启动时就会不断在网络中搜索DHCP 服务器,直到获得IP 地址或超时,自然就影响了启动时间,因此局域网用户最好为自己的电脑指定固定IP地址。
3.文件和打印机共享
有些安装了Windows XP专业版的电脑也会出现启动非常慢的问题,甚至达到了1分40秒之多!系统似乎死机了,登录系统后,桌面也不出现,电脑就像停止反应,1分钟后才能正常使用。这是由于使用了Bootvis.exe 程序后,其中的Mrxsmb.dll文件为电脑启动添加了67秒的时间!
要解决这个问题,只要停止共享文件夹和打印机即可:选择“开始→设置→网络和拨号连接”,右击“本地连接”,选择“属性”,在打开的窗口中取消“此连接使用下列选定的组件”下的“Microsoft网络的文件和打印机共享”前的复选框,重启电脑即可。
4.断开不用的网络驱动器
为了消除或减少Windows 必须重新建立的网络连接数目,建议将一些不需要使用的网络驱动器断开,也就是进入“我的电脑”,右击已经建立映射的网络驱动器,选择“断开”即可。
5.硬盘分区太多也有错
如果你的Windows定义了太多的分区,那么也会使启动变得很漫长,甚至挂起。所以最好不要为硬盘分太多的区。因为Windows 在启动时必须装载每个分区,随着分区数量的增多,完成此操作的时间总量也会不断增长。
6.桌面图标太多会惹祸
桌面上有太多图标也会降低系统启动速度。Windows每次启动并显示桌面时,都需要逐个查找桌面快捷方式的图标并加载它们,图标越多,所花费的时间当然就越多。建议大家将不常用的桌面图标放到一个专门的文件夹中或者干脆删除!
提示:有些杀毒软件提供了系统启动扫描功能,这将会耗费非常多的时间,其实如果你已经打开了杀毒软件的实时监视功能,那么启动时扫描系统就显得有些多余,还是将这项功能禁止吧!
7.字体过多也拖后腿
尽管微软声称Windows可以安装1000~1500种字体,但实际上我们却发现当安装的字体超过500 种时,就会出现问题,比如:字体从应用程序的字体列表中消失以及Windows的启动速度大幅下降。在此建议最好将用不到或者不常用的字体删除,为避免删除后发生意外,可先进行必要的备份。
8.微软自己起“内讧”
还记得Windows XP的某个补丁造成系统启动变慢的新闻吧(比如:代号为 Q328310的补丁会造成Windows 2000/XP启动和关机速度奇慢,甚至有可能导致注册表锁死),可见微软自己内部出问题的可能性也不小,如果你在升级了某个系统补丁后,突然发现系统启动变慢,那么最好留意一下是不是补丁惹的祸
详情:https://www.jb51.net/article/5322.htm
28.如果四川地区大量群众都表示无法打开头条网站,请说明一下原因
28-1.基于上个问题,我也是半蒙半猜,我说可能是1、头条服务器的问题
28-2.运营商的问题3、路由问题
28-3.然后面试官就问如何测试是否是这三个的问题,瞎答了一波
29.智力题 美国海军招兵,散发小纸条,纸条上写美国海军的死亡率还没有居住在纽约市民死亡率高
根据智力题展开提问,类比写为测试用例
30.对加班的看法,互联网公司认识
31.纯虚函数,虚函数表,同步与异步,阻塞与非阻塞,智力题(25匹马5个赛道找出跑的最快的3匹需要多少次)
32.如何找到某个玩家在某一个服务器上打过副本的记录
33.电脑端微信扫码如何登录,
34.画出信息交互的过程(当场懵,不过画了一个三方交互的图还要解释传送一些
35.cookie,session,已经完全凌乱了,感觉面试官放飞了自我呀)
36.stl有哪些容器
37.vector的底层实现以及如何删除内容释放内存的
38.有哪些内存区
39.电脑用久了之后开机时间变长,请问有什么原因
40.判断回文
字典中查找key时间复杂度
inner join、right join、left join区别
41.同步的控制方法
十一、数据结构
1.怎么判断链表有环,怎么找到环入口
2.怎么判断链表是否相交,找到相交点
3.比较熟悉的排序有哪些,(冒泡,归并)分别介绍一下
4.hashmap与hashtable与hashset的区别
5.hashmap基本原理
数据结构采用数组加链表的结构,Hashmap是hash table的。
6.怎么让hashmap线程安全
7.堆栈的区别
8.了解哪些数据结构(解释最小生成树prim Kruskal算法,Dijstra算法),让我画出Dijstra算法的使用图,描述应用场景
9.希尔排序 二分插入排序 直接插入排序
10.链表的几种表现形式、
11.算法中排序的稳定和不稳定性,怎么判断?
12.冒泡排序的优化?
十二、编程题
1.***算法实现:求数组最大连续子序列
2.***算法实现:单链表旋转
3.写代码:找出字符数组中只出现三次,且最早出现完三次的字符(eg:aabcbba输出b)
4. coding:求最大连续子数组和(Maximum subarray)
5. coding:给定两个字符串数组s1和s2,(无重复元素)求s2是由s1删除了哪些元素得到?(例如s1={"a","b","c","d","e"}, s2={"a","e","c"},结果应该为{"b","d"})
6.代码实现二叉树遍历
7.代码实现判断IP合法性
8.给一个数组,判定其中是否有重复元素
9.一个有序数组,判断其中是否有重复元素,如果有返回其起始和结束的位置,如果没有则返回-1, -1
10.***手中一幅扑克牌,假设顺序为ABCDEF,把第一张放到桌面上,第二张挪到最后,第三张放到桌面,第四张挪到最后,一直到所有牌都在桌面
BCDEFA
CDEFB
DEFBAC
EFBD
...
把最后在桌面上的这副牌给你,求出原始牌的顺序
11.编程:不难,二分法思想
12.小球从150层掉落会碎,给两个小球测出求在第几层会碎
13.代码:输出二叉树从左侧看的结果
14.求数组拼接最小数
15.单例模式
16.求前1000个丑数
17.算法:abc可以变成bca、cab,但不可以是acb。如果给你bca你怎么可以判断bca可以由abc推断出。时间复杂度更小
18.手写斐波拉契数列
19.非递归翻转二叉树编程,二叉树的镜像二叉树
20.***最大连续子数组和
21.写代码:读一个文件 找出出现次数最多的字符串
22.写代码:找出一个字符串的最长不重复子串
23.从未知长度的字符串要求找出只出现一次的字符
24.那怎么判断一个一个数是不是2的幂次方,讲思路,写代码
25.***一个长度未知的字符串,找出第一个在整个字符串中只出现过一次的字符的index,如果字符串特别大呢
26. 1)整型数组排序 2) 1,2,23,44,51 最后得到11223445返回值
27.手写代码,冒泡排序,时间复杂度,优化,,快速排序,时间复杂度
28.手写代码,从一篇英文文档中找到频率最高的前十个单词
29.十万行的内容的文件,每行都有不定数量的Ip, 输出所有ip数目,将倒数第二行Ip地址去重
30.如何设计一个算法,使得数字在前字母在后,并且相对顺序不变,
31.***一个是关于链表反转
32.一个是关于两幅图片的相似度比较
33.写ip去重和计数算法(当时采用的是优先队列)
34.三面写ip出现次数最多的前100个
35.字符串比较的函数(C语言写),指针的作用(一道程序题分析)
36.用python写一个程序,去掉A字符串里面与B相等的所有字串。
37.写代码找出倒数第K个节点
38.找到无序数组中两值之和为key的所有组合(还会引申到3个数之和,4个数之和,回答hash存储两个数之和),
39.找到无序数组中第K大的数(问能想到哪几种方法,回答快排,堆排)
40.字符串匹配(本来打算写KMP算法,可是不会,只好用了最笨的方法)
41.统计字符串中不重复的单词个数
42.写代码 两个栈实现队列
43.写代码 数组的最大连续子集(和最大的连续子集)
44.建一个数组循环左移N位,最好不要用辅助空间(我最后还是用了= =)
45.写代码 复杂指针的复制
46.写代码 压缩驼峰字符串
47.手写算法:树的遍历、链表倒数第k个节点,根据自己的程序写测试case
48.手写算法:给了一个类似于文档,让输出想要的内容(python切片
49.查找数组中超过一半的数字
50.单例模式
51.统计出现次数最多的数字,次多的数字,第三多的数字
52.手写代码,100个数据,有些数字出现多次,有些数字出现1次,统计出现一次的? 时间复杂度,能否优化
53.给定一个字符串,判断是否是括号匹配的?
54.算法题 一个数组,两个数组之间的差是-1(如何优化)
55.算法题,全排列算法实现,如何优化?
#面经##秋招##测试工程师#