正文前面先一个碎碎念,放在后面的话可能就没人看了233。
我本科非科班,秋招找非技术岗工作失败(无法通过群面)于是转码了。谁又能想到形势严峻比秋招还严峻….
我太难了我太难了!!!!
2月末开始投简历,3月份开始面了tplink、字节、、广立微电子这四家公司,然后这边最近结束,受了牛油们的很多帮助!感谢!所以来发下自己整理的一些知识点来回馈牛油,或许明年有人能用上?
我投的岗位都是测开/测试,测试涉及的东西太多啦反正你最好啥都懂呗,面试常见题以及我被问到过的题都加进去了,Python和操作系统部分比较详细,还有计算机网络也比较重点,然后添了些小姐妹理出来的测试基础和Linux常用操作!数据库、数据结构、C、就一点点没来得及理了先上岸了2333。
内容的话大部分来自和谷歌,有些口语化的地方是我写的但是我想主要就是整理(东抄抄西抄抄),应该不会涉及什么版权问题吧233
字节和的面试我写了挺有趣的大家可以去看,tp我觉得这面试没什么参考价值主要就是靠学校和成绩单保命所以没发。
整个内容两万多字,全背下来应付面试抱佛脚扯扯没什么问题。
但骗到offer之后还是要补一下学的更全面点不能光会说呀2333。
另外有些小伙伴私信问我有些什么学习资料,那我补充一下。我主要就是刷和《》,然后资料来源谷歌...有些东西就没有系统学,面试的时候有点憨憨。再来一次的话肯定是应该更早安排更系统的去学。
会的东西当然是越多越好,但是一定要保证有一门是比较 深入的了解的,不能太浅尝辄止走马观花哈~
这个东西我觉得还是挺重要的,我要是当时这方面能力更强的话薪资水平应该能不止白菜。但当时一是没有时间准备二是也没有资源,现在这边正好有套课程!!这个课我最近听了听感觉就挺好,思路清晰老师也挺好玩的,现在这个时间段我觉得同学们一定要抓住机会好好学习呀!
然后是用我这的优惠码:AQDLDbj 或者直接在下面的链接买,就能优惠140元!
其实我觉得要是能帮助找到更好的工作这买课多少钱优惠多少钱都是小钱啦,但主要是希望大家买了的课能好好学,收藏了我的帖子的话也要能好好看。别放在收藏夹里吃灰呀!!
新一届秋招又快来了,大家加油呀!!
祝大家都能拿到自己满意的offer呀!!
要是有什么错误我先对不起(跪),一定要联系我改掉啊不能误导人!!
Python为什么是解释型语言
顺序执行的 没有静态检查 没有编译链接过程 可以交互式运行
c语言类型不对是编译抛的错误,python类型不对是运行抛的错误
也就是python是一条条运行的,c需要整个编译过了才能运行
面向对象和面向过程的区别
面向对象是把构成问题的事务分解成各个对象,建立对象来描述某个事务在解决问题的步骤中的行为;
面向过程是分析出解决问题所需要的步骤,然后用一些函数把这些步骤一步步实现,使用的时候依次调用函数就行了。
解释型,语法简单易懂,可读性强
有很多库可以用,可以让我们站在巨人的肩膀上简单的实现想要的功能
可扩展,和其他编程语言或其他软件有可连接的接口
自动内存管理,让程序员可以专注于代码的实现
他的可解释特征使其运行速度变慢
动态语言的特点可能会增加运行时错误。
装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,它接受一个函数作为参数,并返回一个函数,利用python的@语法来放置
功能:中cn为顶级域名,为中国国家域名,edu为教育科研部门域名,email为服务器名。
域名解析时,优先查找匹配的子域名,如果子域名存在,则从子域名的配置文件查询解析结果,如果子域名不存在,就从上一级的配置文件查询结果
响应时间、吞吐量、并发用户数…
测试多用户同时访问,访问量的缓慢增加/迅速增加…
大量相同类型访问,大量不同类型的访问
服务器角度,能够承受多大的压力(?),客户端角度,数据能否成功得到需要的信息,响应时间怎么样
实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息
一方面保证数据不丢失、一方面保证性能
TCP连接三次握手的过程
y:x+1)回应。此时服务器状态由LISTEN(服务器socket处于监听状态,可以接受连接)变为SYN_RECV,表示收到SYN报文
1. 客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。客户端FIN_WAIT_1。表示主动关闭连接,向对方发送了FIN,进入FIN_WAIT_1,等待对方的确认
2. 服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。客户端FIN_WAIT_2,表示半连接,而服务器可能还有数据要发,这边稍后关闭。服务器CLOSE_WAIT。
3. 服务器B关闭与客户端A的连接,发送一个FIN给客户端A。服务器LAST_ACK,等待对面的ACK报文
客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。客户端进入TIME_WAIT,表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。
防止服务器在处于LAST_ACK状态下未收到ACK报文而重发FIN报文,这个TIME_WAIT 状态的作用就是用来重发可能丢失的ACK报文。
TCP面向连接,UDP无连接
TCP可靠,保证安全,UDP尽最大努力交付,不保证安全
TCP是点对点的,UDP可以一对一 一对多 多对多 多对一
TCP面向字节流,UDP无拥塞控制
TCP开销较大,UDP开销小
UDP使用场景 DNS协议(因为用UDP快),看视频、发语音、QQ聊天、多媒体教室屏幕广播
TCP使用场景 HTTP协议,QQ传文件,邮件,登陆
TCP怎么实现可靠传输
确认和重传机制:建立连接、发送包时的确认,运输过程中校验失败、丢包或延时发送端重传
数据:把数据分成很多包,按顺序进行传输
流量控制:滑动窗口和计时器
拥塞控制:慢启动、拥塞避免、快速重传、快速恢复
作用于接收方,控制发送者的发送速度从而使接收者来得及接收,防止分组丢失的。
TCP进行流量控制的方式,接收方通过告诉对方自己的窗口大小,从而控制发送方的发送速度,以防止由于发送方发送速度过快而导致自己被淹没的现象
发送端收到为0的窗口后开启一个计时器,时间到了之后发包询问现在的滑动窗口,防止死锁(接收端发回的不为0的窗口的包丢失,双方相互等待)
作用于网络,防止过多的数据注入到网络中,避免出现网络负载过大的情况。
拥塞:对网络中某一资源的需求超过了该资源所能提供的可用部分,影响到网络性能
拥塞控制:防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。
发送方使用的流量控制,另外考虑到接受方的接收能力,发送窗口可能小于拥塞窗口。
慢启动:不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小。
拥塞窗口一开始设为1 ,每收到一次确认,就让拥塞窗口变为原来的两倍,当窗口值为16时(慢启动门限),改为加法增大,每次+1,直到网络拥塞。拥塞时让新的慢启动门限设为拥塞时的一半,并把拥塞窗口置为1,再让他重复,这时一瞬间会将网络数据量大量降低。
拥塞避免:拥塞避免让拥塞窗口缓慢增长,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。
快重传:接收方每收到一个失序的报文段(收完2后就收到了4说明3丢了)就立即发出包2的重复确认,这样可以让发送方尽早知道丢包了。
发送端连续收到三个重复确认就立即重传3
快恢复:发送方收到3个连续确认时,把慢开始门限减半,把拥塞窗口的值置为慢开始门限的一半,实行拥塞避免,每次确认收到后+1
控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以提供给用户和其他软件方便的接口和环境的程序集合。
为用户提供服务,使用户能在计算机上使用各种应用程序来操作计算机资源
是用户和计算机硬件系统之间的接口
计算机系统中存储程序和数据,并按照程序规定的步骤执行指令的部件。包括中央处理器、主存储器、I/O接口,处理器+外围设备(鼠标键盘之类)构成完整的操作系统
程序是描述处理机完成某项任务的指令序列。
指令则是处理机能直接解释、执行的信息单位。
是一块超大规模的集成电路,是一台计算机的运算核心和控制核心。它的功能主要是解释计算机指令以及处理计算机软件中的数据。
操作系统的最基本部分、核心,决定一个程序在什么时候对某部分硬件操作多长时间
提供操作系统的最基本的功能,是操作系统工作的基础,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性
并发:同一段时间内多个程序执行(与并行区分,并行指的是同一时刻有多个事件,多处理器系统可以使程序并行执行)
共享:系统中的资源可以被内存中多个并发执行的进线程共同使用
虚拟:通过分时复用(如分时系统)以及空分复用(如虚拟内存)技术把一个物理实体虚拟为多个
异步:系统进程用一种走走停停的方式执行,(并不是一下子走完),进程什么时候以怎样的速度向前推进是不可预知的
处理机的运行以进程(或线程)为基本单位,对处理机的管理可归结为对进程的管理。
管理进程的资源共享:进程控制、进程同步、进程通信、死锁处理、处理机调度
给多道程序的运行提供良好环境,方便用户使用+提高内存利用率
内存分配、地址映射、内存保护与共享、内存扩充
计算机中的信息以文件形式存在。
文件存储空间管理、目录管理、文件读写管理和保护
完成用户的I/O请求,方便用户使用各种设备,并提高设备利用率
缓冲管理、设备分配、设备处理、虚拟设备
进程是操作系统进行资源分配和调度的最小单位,多个进程之间相互独立,如果一个进程崩溃,不会影响其他进程;
线程是CPU进行分配和调度的最小单位(或者说是进程的最小单位,进程的一部分),一个进程下可以有很多个线程共享该进程的所有资源,如果一个线程崩溃,整个进程就会崩溃。
进程是操作系统进行资源分配和调度的最小单位,每个进程有自己的一部分独立的资源,如果一个进程崩溃,不会影响其他进程;线程是CPU进行分配和调度的最小单位,一个进程下可以有很多个线程共享该进程的所有资源,如果一个线程崩溃,整个进程就会崩溃。
线程一般是共享资源,在创建、或是进行调度的时候开销比进程小很多,通信同步也比较方便
通信方面进程间通讯需要同步或互斥手段的辅助,来保证数据的一致性,线程间可以直接读/写进程数据段(如全局变量)来进行通信。
线程间通讯和进程间通讯的方法
线程间:互斥锁、信号量、临界区…
互斥量(全局变量):采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。
信号量:它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。
临界区:是一个访问共用资源的程序片段,而这些共用资源又无法同时被多个线程访问的特性。当有线程进入临界区段时,其他线程或是进程必须等待,有一些同步的机制必须在临界区段的进入点与离开点实现,以确保这些共用资源是被互斥获得使用。
进程间:共享内存、信号量、管道、消息队列…
共享内存就是映射一段能被其它进程访问的内存,这段共享内存由一个进程创建,但是多个进程可以访问。读写操作时需要用同步互斥的工具,保证在一个进程对这段内存进行访问的时候其他进程不能同时来
信号量是一个计数器,用来控制多个进程对资源的访问,它通常作为一种锁机制。
管道是一种半双工的通信方式,数据只能单项流动,并且只能在具有亲缘关系的进程间流动,进程的亲缘关系通常是父子进程。Pipe(管道),FIFO(有名管道)。调用管道,在内核里开辟一块缓冲区(一个共享文件)来进行进程间通信,有一个读端和一个写端(单向通信)
消息队列是消息的,存放在内核中并由消息队列标识符标识。
目的:对多个相关进程在执行顺序上进行协调,使并发执行的进程可以有效的共享资源和相互合作,保证程序执行的可再现性。
多个并发的进程中,如果每个进程都持有某种资源由等待其他进程释放它现在保持的资源,这些资源都只允许一个进程占用,结果两个进程都不能继续执行,也不会释放自己占有的资源,所以这种双方循环等待的现象回无限期持续,发生死锁。
互斥条件:资源不能共享,只能一个进程用
请求与保持条件:已经得到资源的进程可以再次申请新的资源
非剥夺条件:已经分配的资源不能从相应进程中强制剥夺
循环等待条件:系统中若干进程形成环路,环路中的每个进程都在等待相邻进程正占用的资源
预防:破环四个原因中的一个或多个,但会影响到资源利用率及吞吐量
避免:在资源的动态分配中防止系统进入不安全状态
检测:死锁发生后,用一定的进行检测,并确定相关死锁相关的资源和进程,采取方法清楚死锁。
解除:对死锁相关进程,通过撤销或挂起的方式,释放一些资源
先来先服务调度:按进程到达的先后顺序依次调度
短作业优先调度:选择队列中估计时间较短的先进行处理
优先权调度:为不同队列设不同的优先级,等待时间长的适当提高优先级
时间片轮转:按进程到达的先后顺序放入队列,给队首进程分配CPU时间片,用完后计时器发出中断,暂停当前进程并将其放到队伍尾部,循环。
创建:new Thread(r)创建,有了相应的内存空间和其他资源,但还未开始执行
就绪:start()方法启动,进入线程队列排队,等待CPU服务
阻塞:需要进行耗时的输入输出操作时,要等阻塞清除才能进入队列排队
进程三态的转化(也有说5态的,和线程差不多)
运行状态:进程正在处理机上运行。在单处理机环境下,每一时刻最多只有一个进程处于运行状态。
就绪状态:进程已处于准备运行的状态,即进程获得了除处理机之外的一切所需资源,一旦得到处理机即可运行。(只缺处理机这个资源)
阻塞状态,又称等待状态:进程正在等待某一事件而暂停运行,如等待某资源为可用(不包括处理机)或等待输入/输出完成。即使处理机空闲,该进程也不能运行。(缺除了处理机之外的其他资源)
僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程。
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
栈区:编译器自动分配,存放函数的参数值、局部变量的值,系统自动回收用完的内存
堆区:一般由程序员分配(malloc申请内存和free释放内存),如果不释放内存容易因引起内存泄漏
全局区(静态区):静态变量和全局变量,内存被分配后直到程序结束之后才释放
常量区:(只读)存一些字符串常量、数组名等
代码区:(只读)存一些CPU执行的一些机器指令
栈:先进后出,生长方向向下,系统自动分配回收,高效快速;但有限制,数据不灵活。申请内存时,只要栈的剩余空间大于所申请的空间,系统将为程序员提供内存,否则报栈溢出。
堆:向上生长,需要程序员自己申请并指明大小。堆里分布的内存是不连续的。操作系统应该有记录空闲内存地址的,申请内存时遍历,找第一个空间大于申请空间的堆节点,分配内存…
把数据存到栈里比堆更快,因为系统会自动分配内存,堆需要自己分配和释放内存;另外访问堆的一个具体单元需要两次访问内存,一次获得指针,第二次才是真正的数据,而栈只要一次。
又称缓存。在内存空间中预留一定的存储空间,用来缓冲输入输出的数据。
原因:CPU直接从磁盘读数据速度慢,增加读写次数对磁盘性能会有影响;使用缓冲区减小读写次数,CPU对缓冲区的操作速度也远大于磁盘的操作速度,增加计算机的运行速度。
计算机向缓冲区填充数据的时候超出了缓冲区本身的容量,溢出的数据覆盖在合法数据上。导致程序崩溃、趁这个机会获取程序乃至系统的控制权。
相当于从逻辑上扩充内存容量,在程序装入的时候,只把程序的一部分装入内存,就启动程序执行,执行过程中,访问的信息不在内存里时,操作系统将需要的部分调入内存,并把暂时不适用的内容换到外存上,腾出内存空间。让应用程序认为他用了一个比实际内存大得多的存储器。
虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。
多次性、对换性、虚拟性
程序没有释放已经不再使用的内存,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,因此这段内存一直被占用,无法释放,造成空间的浪费。
1. 用封装的malloc函数,写代码时在malloc外封装一层,封装函数内打印一下malloc地址,free也是,然后运行时收集打印信息,可以用另外的脚本来分析内存的申请和释放是否一一对应。
2. dmalloc库,第三个方案是valgrind工具 提一下常用的用法就行。
要求分配的内存超过了系统能给我的,系统不能满足需求。内存泄漏的堆积如果不及时处理最终会导致内存溢出
把主存空间划分为大小相等且固定的块,作为主存的基本单位,每个进程也以块为单位进行划分,进程执行时,以块为单位逐个申请主存中的块空间。用页表记录分散的内存分布情况。
用来记录逻辑地址和实际存储地址之间的映射关系,以实现从页号到物理块号的映射。
访问分页系统中内存数据需要两次内存访问,一次从内存中访问页表,找到实际物理地址,第二次根据得到的物理地址访问内存
访问内存数据的时候先在快表里查询,如果查到了就可以直接读取相应的物理块号,如果每找到再访问页表,得到物理地址并访问,同时把该页表中的该映射项添加到块表中
分段管理:每个段内部连续内存分配,但段与段之间是离散的,因此会用到段表,记录每段在内存中的起始地址和该段长度。
段表可以放在内存或寄存器中。
页是信息的物理单位,是出于系统内存利用率的角度提出的离散分配机制;
段是信息的逻辑单位,每个段含有一组意义完整的信息,是出于用户角度提出的内存管理机制
页的大小是固定的,由系统决定;
段的大小是不确定的,由用户决定
地址映射的过程中,如果页面中发现要访问的页面不在内存中,会产生缺页中断。此时操作系统必须在内存里选择一个页面把他移出内存,为即将调入的页面让出空间。选择淘汰哪一页的规则就是页面置换
最佳置换(理想):将当前页面中在未来最长时间内不会被访问的页置换出去
先进先出:淘汰最早调入的页面
最近最久未使用 LRU:每个页面有一个t来记录上次页面被访问直到现在,每次置换时置换t值最大的页面(用寄存器或栈实现)
时钟clock(也被称为最近未使用NRU):页面设置访问为,将页面链接为一个环形列表,页面被访问的时候访问位设为1。页面置换的时候,如果当前指针的访问位为0,置换,否则将这个值置为0,循环直到遇到访问位为0的页面。
改进型Clock:在clock的基础上添加一个修改位,优先替换访问位和修改位都是0的页面,其次替换访问位为0修改位为1的页面。
最少使用LFU:设置寄存器记录页面被访问次数,每次置换当前访问次数最少的
内核态:cpu可以访问内存的所有数据,包括外围设备,例如硬盘,网卡,cpu也可以将自己从一个程序切换到另一个程序。
用户态:只能受限的访问内存,且不允许访问外围设备,占用cpu的能力被剥夺,cpu资源可以被其他程序获取。
最大的区别就是权限不同,在运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。
需要限制不同的程序之间的访问能力,防止他们获取别的程序的内存数据,或者获取外围设备的数据,并发送到网络,CPU划分出两个权限等级 -- 用户态和内核态。
用户进程主动发起的。用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如fork()就是执行一个创建新进程的系统调用
用户程序使用系统调用,系统调用会转换为内核态并调用操作系统
会从当前运行进程切换到处理次此异常的内核相关程序中
所有程序都运行在用户态,但在从硬盘读取数据、或从键盘输入时,这些事情只有操作系统能做,程序需要向操作系统请求以程序的名义来执行这些操作。这个时候用户态程序切换到内核态。
用户接口程序(GUI或shell)
处于用户态中,位于用户态的最底层,允许用户运行其他程序
(而操作系统运行在内核态中
|
|
|
|
|
|
|
|
|
|
|
|
|
查看所有进程,通过管道找到相应的进程包名
|
|
|
|
|
|
|
|
|
|
|
|
|
在根目录下面查找txt文件
|
|
显示pin.log文件末尾内容
|
|
|
如果没有就创建,有就不理它
|
|
|
|
Linux是一个以开发者为中心的操作系统,而windows是以消费者为中心的操作系统
Linux是免费的、开源的,更容易得到他的源代码,也就更容易实现个性化定制
Linux的命令行功能强大,windows的命令行没这么厉害…
Linux基于网络,只要有相应权限,就能远程操控相应的服务器
管道符,就是把符号左边命令本来要打印到终端上的信息当做右边命令的操作对象
Linux命令 如何杀死占用指定端口的进程
先查端口对应的进程,然后kill进程号
grep怎么输出文本中包含某个关键字的行,不包含的呢
其他方式还有yum、rpm
找到共用80端口的线程
shell脚本:统计一个文件中重复的行和重复次数
linux 如何将文件从一台服务器转移到另一台服务器
如何查找出现频率最高的100个ip地址
深度优先搜素、宽度优先搜索
static,静态:1. 将函数或变量对其他源文件隐藏,只能被本地模块引用,即局部有效。2. 静态局部变量,在函数体内用static修饰变量,将本来要被存在栈中的局部变量保存在了静态空间中,函数退出时他仍然存在,延长了该变量的生命周期。
const,只读:被const修饰的量为常量,表示禁止这个量被修改;同时向阅读代码的人传递信息表示:这一块的内容不要区改他,只读的,同样也能保护代码。
在存储器中储存字节的顺序,分大端和小端两种。大端:高位字节在前,低位字节在后,是人类的读写方式;小端反过来,是计算机的读写方式
从sourse字符串的第一位开始往后赋值,直到遇到”\0”
内存地址的大小和指针指向无关,只和操作系统位数有关。
函数传参不能传数组,编译器会自动把数组转换成指针形式
程序读取变量时一般是向寄存器里读值而不是在内存读值(编译器的优化),Volatile告诉程序这个值随时都能变化,需要保证每次执行的时候都从内存里取值。
a+1数组下一个值首地址,&a表示数组地址,&a+1为下一个数组首地址
宏名要大写,每个变量都要加括号
事务的特性:原子性、一致性、隔离性、持久性。
复合主键:多个主键联合形成一个主键组合。(成绩表中的学号、课程标号)
数据库的备份是如何实现的
sql:三表查询、两表查询
白盒测试也称为结构测试或逻辑驱动测试,是针对被测单元内部是如何进行工作的测试。检查程序内部逻辑结构,对所有的逻辑路径进行测试,是一种穷举路径的测试方法,
常见的白盒测试的方法有:语句覆盖,条件覆盖,判定覆盖,条件组合覆盖,基本路径覆盖等等。
优点:可以检测代码的每条分支和路径;可以揭示隐藏在代码中的错误;对代码的测试比较彻底。
缺点:耗费比较大;不能检测到代码中遗漏的逻辑;不能直接验证需求的正确性
黑盒测试也称功能测试或数据驱动测试,它不看代码内部的逻辑,只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数锯而产生正确的输出信息,并且保持外部信息(如数据库或文件)的完整性。
常见方法有等价类划分法;边界值分析法;因果图法;场景法;正交实验设计法;判定表驱动分析法;错误推测法;功能图分析法。
优点:容易实施,不需要关注内部实现;贴近用户需求。
缺点:覆盖率比较低,因为不知道内部逻辑
单元测试:软件组成单元进行测试,其目的是检验软件基本组成单位的正确性,通常情况下是白盒的,能够尽早的发现错误,降低修改成本。
指标:响应时间(RT)、每秒能完成的响应数(TPS)、CPU利用率、内存占用、网络(带宽使用率)、手机app的话还考虑耗电量……
考虑负载加大时,各项指标如何变化,联网的考虑各种不同的网络环境(正常网、超快网、网速慢、断网)时指标的变化
并发用户数和在线用户数的区别
在线用户数:用户同时在一定时间段的在线数量
并发用户数:某一时刻同时向服务器发送请求的用户数
(在线用户只要在线就好了,并发用户计算的是和服务器有交流的用户,一般比例5%-20%)
测试应该尽早进行。越早就可以花越少的消耗得到越大的回报。
单元测试是对软件组成单元进行测试,其目的是检验软件基本组成单位的正确性,测试的对象是软件设计的最小单位:函数、或者类。
项目中的测试类就是测试接口类的,属于单元测试,一般由开发人员测试。
集成测试也称综合测试、组装测试、联合测试,将程序模块采用适当的集成策略组装起来,对系统的接口及集成后的功能进行正确性检测的测试工作。其主要目的是检查软件单位之间的接口是否正确,集成测试的对象是已经经过单元测试的模块。
系统测试是对整个系统的测试,将硬件、软件、操作人员看作一个整体,检验它是否有不符合系统说明书的地方,主要包括功能测试、界面测试、可靠性测试、易用性测试、性能测试。 功能测试主要针对包括功能可用性、功能实现程度(功能流程&业务流程、数据处理&业务数据处理)方面测试。在集成测试之后。
集成测试和系统测试之间的比较:
1、测试内容:集成测试是测试各个单元模块之间的接口,系统测试是测试整个系统的功能和性能;
2、测试角度:集成测试偏重于技术的角度进行测试,系统测试是偏重于业务的角度进行测试。
也称交付测试,是针对用户需求、业务流程进行的正式的测试,以确定系统是否满足验收标准,由用户、客户或其他授权机构决定是否接受系统。
验收测试包括alpha测试和beta测试,alpha测试是由开发者进行的软件测试,beta测试是由用户在脱离开发环境下进行的软件测试。
功能测试:关注功能正常(包含兼容性测试),除了下面分类都测;
性能测试:关注(比如前端性能、后端性能);
安全测试:关注传输、存储等安全;
特性测试:特性指平台差异(即部分兼容性测试),如PC端鼠标,键盘操作特性(Tab键等);如手机触屏操作,横竖屏,中断恢复(来电)等
QPS:每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准
用来衡量服务器的机器性能。
TPS:Transactions Per Second(每秒传输的事物处理个数),即服务器每秒处理的事务数。TPS包括一条消息入和一条消息出,加上一次用户数据库访问。
是软件测试结果的测量单位。
测试周期是指从测试项目计划建立到BUG提交的整个测试过程。
包括软件项目测试计划,测试需求分析,测试用例设计,测试用例执行,BUG提交五个阶段。 软件测试周期并行与软件生命周期,存在于软件生命周期的各个阶段。
软件生命周期是指软件的产生直到报废的生命周期。
包括问题的定义及规划,需求分析,软件设计(概要,详细),软件编码,软件测试(单元测试,集成测试,系统测试,验收测试),运行维护
黑盒测试包括:等价类划分、边界值分析、因果图、场景法、正交实验设计法、判定表、驱动分析法、错误推测法、功能图分析法,依据是用户需求规格说明书、详细涉及说明书
白盒测试包括:语句覆盖、判断覆盖、条件覆盖、路径覆盖、条件组合覆盖,依据是代码结构和逻辑
等价类划分:把可能的数据输入集合分为若干子集,每个子集中的子集内的元素对于揭露程序中的错误都是等效的,在每个等价类中取的数据用来测试,比较有代表性。 先划分等价类,“有效等价类”和“无效等价类”,根据划分的等价类编写测试。
边界值分析:选取指定数据集中的边界值进行测试。上点,内点,离点。
对bug的描述尽量简短但要求清晰,对bug出现的条件进行详细的描述,包括输入的测试用例、使用的环境、有没有和其他软件同时运行,以及需要写清bug出现的位置,帮助开发更好定位。
按照用户体验(bug是否很严重的影响用户体验)、影响系统的程度进行评级。
(3)测试条件(系统配置信息、环境、软件版本、浏览器版本…)
(4)预期结果和实际结果的对比,相关的分析
(5)如何重现这个bug的步骤
(6)这个bug的严重性(会多大程度的影响系统或用户使用)
(7)bug发生的位置
把软件开发模型分为好几个阶段,包括软件计划、需求分析、设计、实现、软件测试、软件运行维护。
具有一种比较明显的分层,每一阶段的结果文档会作为下一阶段的输入,强调文档,整个周期完成的差不多了才能看到结果;
没有迭代和反馈,只能一步一步来,流程没有回头路。不能适应客户不断变化的需求,后期需要改动时成本也比较大
测试比较晚,基本上是在软件完成之后进行的测试
按一个短的迭代周期工作,强调“快”,每次迭代交付一些成果,(或者说先做出一个不完美但能实现一定的功能的版本);让客户参与进来,有新需求就,快速响应变化,迭代产生新版本,缩短软件版本的周期。
强调开发软件而不是文档。
特点:让客户参与进来,客户需求的变动和软件有些不符合需求的地方可以第一时间进行了解和改动; 缩短版本周期; 每隔一段时间(一个迭代周期),团队可以在工作方面进行反省和改进,调整自己的行为; 强调开发软件而不是文档,提高编程人员的积极性。
以用户需求为中心,在每一个迭代周期都需要进行测试,
基于自动化测试->速度快、敏捷
更强调测试的速度和适应性,侧重计划的不断调整以适应需求的变化
强调面对面的沟通、协作,强调团队的责任,不太关注对缺陷的记录与跟踪。缺陷修复的成本也较低
V模型:把测试过程作为在需求分析、系统设计及编码之后的一个阶段,忽视了测试对需求分析,系统设计的验证,需求的满足情况一直到后期的验收测试才被验证。(应该比较多包括系统测试和验收测试)
W模型:测试的活动与软件开发同步进行,测试的对象不仅仅是程序,还包括需求和设计。因为在需求阶段测试就已经介入了,后面每一阶段的开发都需要经过测试,能够尽早发现软件的缺陷,降低debug的成本
首先是web和app的区别:web是b/s架构的,基于浏览器;app是c/s架构的,必须要有客户端。Web测试中只要更新了服务器,客户端就会同步更新,保证每个用户用的客户端一样;app就不能保证完全一致,因为app客户端需要用户主动更新,如果app测试中修改了服务器,就意味着客户端用户使用的所有核心版本都要进行回归测试
3. 兼容方面:web基于浏览器,主要看电脑硬件、电脑系统;app依赖于手机或平板,关注的系统主要是安卓和ios,还要关心分辨率、屏幕尺寸
4. App比web测试多一些专项测试:弱网测试,安装、卸载、更新,界面操作、触摸手势等
需求分析;制定测试计划(在研发计划制定时就应该定好测试计划);设计测试用例;执行测试(包括单元测试、集成测试、系统测试、回归测试、验收测试);测试评估(出报告,确认是否可以上线);面向用户
测试一款产品/一个功能
性能:响应速度、CPU占用,联网的话考虑多用户并发/弱网环境,app的话考虑耗电量
兼容性:多平台/多系统/多版本
安全:用户名密码有没有保存功能,数据往服务器传是不是加密的,有没有防止一些脚本或者SQL注入攻击
UI:符合大众期望,有无错别字,排版和颜色搭配
稳定性:压力测试、极端条件测试
(查看产品的使用说明书)
软件质量模型的6大特性:
功能性,可靠性,易用性,效率,维护性,可移植性
以搜索为例,设计测试方案
从以下几个角度进行测试
输入搜索信息,点击搜索按钮是否能获取搜索结果,跳到结果界面;
搜索结果界面弹出的信息是不是符合我输入的信息
没有输入信息,按搜索看会有什么结果
对输入框能输入的最大字符数进行边界测试,(假设限制是30个字符),那么分别输入20,30,31个字符的文本进行测试,测试超出输入限制会出现的结果
测试输入敏感词时的搜索结果
输入不同国家语言的搜索结果
查询不到搜索结果的情况显示的结果
从搜索结果界面返回的按钮能不能正常返回
点击的标签能不能跳到相关的热搜界面
测试的图片搜索能不能正常使用
图片拖曳和上传的功能是否均能实现,粘贴图片网址能不能用
如果粘贴的图片网址不存在是否能给出正确的提示反馈
输入特别大的图会发生什么现象
测试搜索时的响应时间能否符合需求
网速慢的条件下还能不能正常搜索
多用户同时访问,或者一个时间点访问量突然增大的情况,对这些特殊情况进行模拟,测试还能不能进行正常搜索
使用操作是否简单,是不是输入查询信息之后点击搜索按钮就行了;
在输入框输入搜索词的过程中下拉框能否弹出相关的搜索(你可能要搜)
输入框有没有保存最近搜索的信息的记录
除了点击搜索按钮进行搜索,测试按回车进行检索的功能
多种系统下的多种不同的浏览器下是否能正常显示、正常使用;
在不同的手机浏览器中打开是否能正常显示、正常使用;
各种语言平台下是否都能正常使用
能不能防止搜索时对数据库的恶意攻击的情况,如SQL注入
界面设计是否简介,是否符合用户审美
图标能不能正常显示,界面有无错别字
测试用例:微信扫码点餐
如何测试网站的高并发性(不是很会…)
测试多用户同时访问,访问量的缓慢增加/迅速增加。。。
大量相同类型访问,大量不同类型的访问
服务器角度,能够承受多大的压力(?),客户端角度,数据能否成功得到需要的信息,响应时间怎么样
实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息
一方面保证数据不丢失、一方面保证性能
测试一个前端页面,button按钮不好使,原因,不获取源码的前提下,如何解决(提示接口测试)
因为这是个前端界面,可以按F12打开开发者工具,在network里按钮点击时请求有没有发出去,看状态码,有没有生成新文件之类的,确定是不是连接的问题。
postman模拟发包过去测试也行。
selenium流程、获取元素方法
先import,然后webdriver模拟打开一个浏览器(初始化),获取特定的网址,然后通过获取元素模拟鼠标点击页面上的按钮(或者其他动作,比如在特定的文本框输入特定的内容),(最后quit()一下)
app登录和网页登录的区别
估计外卖一天内的全国订单量
淘宝页面价格显示不出来,该怎么测
如果有一部分用户反馈APP的视频加载不出来,你会从哪里方面去定位问题
在一个产品的周期中,你会怎么安排测试工作
为什么做测试而不是去做开发
你认为测试人员需要具备哪些素质