德玛作为一个已经工作有10年经验的测试工程师,其间也辗转了几个大的互联网公司,虽然确实缺少了一些稳定性,但同时也积累了一些面试的经验,不才分享一些给大家。那么主要是针对测试工程师的一些总结,对于其他的工种,我可能会在别的文章中去总结一些面试技巧,本文会着重于测试工程师的面经。
测试的面试重点分为两大部分:技术,项目
扩充一下:技术的一些注意点,项目上的一些处理方式(有些还会有一些沟通上的小技巧),可能不会写的特别详细,但点我都会点到,后续会再继续补充(希望能帮助到各位互联网的孩子们)
那么直接上货,希望能帮助到各位同行,或者不是同行却也能激发起你们的灵感的伙伴们~
一.黑盒测试方法(可能会问等价类的分类,等价类和边界值是最重要的:
1、等价类划分:
(有效等价类:对于程序规格说明来说,是合理的,有意义的输入数据构成的集合)
(无效等价类:对于程序规格说明来说,是不合理的,无意义的输入数据构成的集合)
2、边界值分析方法
3、因果图方法
4、正交实验设计方法
5、功能图分析方法
6、错误推测法
7、需求文档转化法
8、随机测试
9、对象属性分析法
二.白盒测试方法(可以选择性记忆....不知道会不会问):
1.语句覆盖:就是设计若干个测试用例,运行被测程序,使得每一可执行语句至少执行一次。
2.判定覆盖:使设计的测试用例保证程序中每个判断的每个取值分支至少经历一次。
3.条件覆盖:条件覆盖是指选择足够的测试用例,使得运行这些测试用例时,判定中每个条件的所有可能结果至少出现一次,但未必能覆盖全部分支
4.判定条件覆盖:判定-条件覆盖就是设计足够的测试用例,使得判断中每个条件的所有可能取值至少执行一次,同时每个判断的所有可能判断结果至少执行,即要求各个判断的所有可能的条件取值组合至少执行一次。
5.条件组合覆盖:在白盒测试法中,选择足够的测试用例,使所有判定中各条件判断结果的所有组合至少出现一次,满足这种覆盖标准成为条件组合覆盖。
6.路径覆盖:是每条可能执行到的路径至少执行一次。
补充:
(1)语句覆盖在所有的测试方法中是一种最弱的覆盖。
(2)判定覆盖和条件覆盖比语句覆盖强,满足判定/条件覆盖标准的测试用例一定也满足判定覆盖、条件覆盖和语句覆盖
(3)路径覆盖也是一种比较强的覆盖,但未必考虑判定条件结果的组合,并不能代替条件覆盖和条件组合覆盖。
三.TCP/IP分层协议(每层的协议要注意):
1.链路层(数据链路层/网络接口层):包括操作系统中的设备驱动程序、计算机中对应的网络接口卡
2.网络层(互联网层):处理分组在网络中的活动,比如分组的选路。
3.运输层:主要为两台主机上的应用提供端到端的通信。
4.应用层:负责处理特定的应用程序细节。
TCP和UDP的区别(网络上的知识点):
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
四.TCP/IP三次握手,四次挥手(常问项)
三次握手:
第一次握手(SYN=1,seq=x):
客户端发送一个TCP的SYN标志位置1的包,指明客户端打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字段里。
第二次握手(SYN=1,ACK=1,seq=y,ACKnum=x+1):
服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1。服务器端选择自己的ISN序列号,放在seq域里,同时将确认序号(Acknowledgement Number)设置为客户的ISN加1,即X+1。发送完毕后,服务器端进入SYN_RCVD状态。
第三次握手(ACK=1,ACKnum=y+1):
客户端再次发送确认包(ACK),SYN标志位为0,ACK标志位为1,并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方,并且在数据段放写ISN的+1。
发送完毕后,客户端进入ESTABLISHED状态,当服务器端收到这个包时,也进入ESTABLISHED状态,TCP握手结束,TCP连接建立完成
我的理解....:
A问B:你听到了么,发确认信息
B回答A:听到了,告诉A它能接收到A的消息
A再回B:我能接收到你的消息,再发一次确认 ,然后建立连接
四次挥手:
第一次挥手(FIN=1,seq=x):
假设客户端想要关闭连接,客户端发送一个FIN标志位置为1的包,表示自己已经没有数据可以发送了,但是仍然可以接收数据。
发送完毕之后,客户端进入FIN_WAIT_1状态。
第二次挥手(ACK=1,ACKnum=x+1):
服务器端确认客户端的FIN包,发送一个确认包,表明自己接收到了客户端关闭连接的请求,但还没有准备好关闭连接。
发送完毕后,服务器端进入CLOSE_WAIT状态,客户端接收到这个确认包之后进入FIN_WAIT_2状态,等待服务器端关闭连接。
第三次挥手(FIN=1,seq=y):
服务器端准备好关闭连接时,向客户端发送结束连接请求,FIN置为1。
发送完毕后,服务器端进入LAST_ACK状态,等待来自客户端的最后一个ACK
第四次挥手(ACK=1,ACKnum=y+1):
客户端接收到来自服务器的端的关闭请求,发送一个确认包,并进入TIME_WAIT状态,等待可能出现的要重传的ACK包。
服务器端接收到这个确认包之后,关闭连接,进入CLOSED状态。
客户端等待了某个固定时间(两个最大段生命周期,2MSL,2Maximum Segment Lifetime)之后,没有收到服务器端的ACK,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入CLOSED状态。
为什么是三次,不是两次或者四次(这个问题真的可能会被问到)
两次握手并不能保证可靠性(B不确定A能收到自己的信息),四次握手又浪费了效率
五.OSI七层模型(记一记应用层,传输层,网络层我觉得就可以了....)
六. DNS(运行在UDP协议上,端口53)
概念:dns是一个域名系统,是万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串
七:http协议(
https://www.cnblogs.com/ranyonsue/p/5984001.html细致的大家可以阅读这一篇)
restful接口:
1.URI资源 2.表现:XML,HTML等格式 3.状态转移:get,post等
HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少
HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
HTTP和HTTPS区别:(这个还挺重要的,端口号稍微记一下)
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
HTTP协议特点:
1.支持客户/服务器模式。
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type(Content-Type是HTTP包中用来表示内容类型的标识)加以标记。
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
HTTP原理:
1、客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。
2、发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
3、服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
4、释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
5、客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
GET和POST请求的区别(个人感觉这个是要了解的):
1.GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中.
2.GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
3.GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
4.GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.
状态码:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
常见状态码:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
八:TestNG(这个我自己用过,感兴趣也可以看看) testng传参方式(parameter在testng.xml 或者通过dataprovider)
运行方式:1.Run as 2.testng.xml
按顺序执行:preserve-order=true
忽略测试:@Test(enable=false)
分组测试:@Test(groups=..)
依赖测试:@Test(dependsonmethods=...)
结果在oup-put,日志级别是verbose
并发运行用例:parallel=methods
九:appium(可以稍稍了解,和selenium异曲同工,有些点我觉得是UI自动化想通的)
特点(为什么流行我觉得):
·跨平台,native hybrid webview(H5)
· 跨设备,an droid iOS
· 跨app,可以在多个app之间交互
· 不依赖APP开源代码(保留意见,an droid Uiautomator对H5的支持需要代码支持,这里不细说)
· 支持Selenium WebDriver / Selenium Grid
· 跨语言,java python ruby nodejs
· Open Source 原理: Android 编辑
1.左边的WebDriver script是我们的selenium测试脚本(其实就是测试代码)
2.中间是起的Appium的服务,Appium在这边起了一个Server(4723端口),跟selenium
Webdriver测试框架类似,Appium?支持标准的WebDriver JSONWireProtocol 。在这里提供了一套web服务,Appium Server接收web driver 标准请求,解析请求内容,调?用对应的框架响应操作。
如:脚本发送一个点击按钮的请求给appium server,
appium server会把请求转发给中间件Bootstrap.jar ,它是用java写的,安装在手机上. Bootstrap 接收appium 的命令(4724端口),最终通过调用UiAutomator的命令来实现。4.最后执?行的结果由Bootstrap返回给appium server 5.另外,appium还用到了Chromedriver来?支持基于H5(webview)的测试。IOS: 编辑
1.左边的WebDriver script是selenium测试脚本
2.中间是起的Appium的服务,Appium在这边起了?一个Server(4723端口),跟selenium
Webdriver测试框架类似,Appium?支持标准的WebDriver JSONWireProtocol 。在这里提供了一套web服务,Appium Server接收web driver 标准请求,解析请求内容,调?用对应的框架响应操作。
如:脚本发送一个点击按钮的请求给appium server,
appium server调用instruments.js 启动?一个socket server,同时分出?一个?子进程运?行instruments.app,将bootstrap.js(一个UIAutomation脚本)注?入到device?用于和外界进?行交互。4.对于H5的操作,运?用了 iOS webkit debug proxy来实现 Android和IOS的区别我觉得就是bootstrap.jar和bootstrap.js去分别驱动uiautomator和uiautomation,新版本的Appium已经支持uiautomator2了,IOS支持XCUItest 定位元素方法(By后面那些东西,ID可以唯一定位): webdriver提供的用 By 定位元素 find_element(By.ID,"kw") find_element(By.NAME,"wd") find_element(By.CLASS_NAME,"s_ipt") find_element(By.TAG_NAME,"input") find_element(By.LINK_TEXT,u"新闻") find_element(By.PARTIAL_LINK_TEXT,u"新") find_element(By.XPATH,"//*[@class=”bg s_btn”]") find_element(By.CSS_SELECTOR,"span.bg s_btn_wr>input#su") find_element()方法只用于定位元素。它需要两个参数,第一个参数是定位方式,这个由 By 提供;另第二个参数是定位的值。
十. linux常用命令(我觉得比较可能问的多的)
Cd:切换目录
当前目录和上层目录:./ ../
主目录:~/
查看当前路径:pwd
清屏:clear
退出当前命令:ctrl+c 彻底退出
软链接:ln -s slink source
查找自己所在的终端信息:who am i
查看当前谁在使用该主机:who
ls -l (也可以直接 ll ) :列出长数据串,包含文件的属性与权限数据等
ls -a :列出全部的文件,连同隐藏文件(开头为.的文件)一起列出来(常用)
find -name 文件名 :找匹配的文件名
mkdir :创建指定的名称的目录
cp -a file1 file2 :连同文件的所有特性把文件file1复制成文件file2
cp file1 file2 file3 dir :把文件file1、file2、file3复制到目录dir中
mv file1 file2 file3 dir : 把文件file1、file2、file3移动到目录dir中
mv file1 file2 : 把文件file1重命名为file2
rm -fr dir : 强制删除目录dir中的所有文件
ps -ef|grep java :找出所有java进程
kill -9 进程号 :彻底杀死某个进程
chmod 改变文件的权限
语法:chmod [options] mode files
多数用三位八进制数字的形式来表示权限,第一位指定属主的权限,第二位指定组权限,第三位指定其他用户的权限,每位通过4(读)、2(写)、1(执行)三种数值的和来确定权限。如6(4+2)代表有读写权,7(4+2+1)有读、写和执行的权限
chmod u+x file :给file的属主增加执行权限
vi :文件名 #编辑方式查看,可修改
cat :文件名 #显示全部文件内容
more :文件名 #分页显示文件内容
less :文件名 #与 more 相似,更好的是可以往前翻页
head :文件名 #仅查看头部,还可以指定行数
tail -f 20160921.logs :查看正在改变的日志文件
tail -3000 catalina.out:查看倒数前3000行的数据
history:查看用过的命令列表
df -hl:查看磁盘使用空间
which :只能查可执行文件
whereis :只能查二进制文件、说明文档,源文件等
du :显示目录或文件的大小
df :显示每个<文件>所在的文件系统的信息,默认是显示所有文件系统
df 命令获得真正的文件系统数据,而 du 命令只查看文件系统的部分情况
bash shell 的内置命令let 可以进行整型数的数学运算
free:显示系统当前内存的使用情况,包括已用内存、可用内存和交换内存的情况
top:显示当前系统中占用资源最多的一些进程
netstat -anp|grep port:查看某端口是否被占用
chown -R:更改某个文件或目录的属主和属组
Shift + PageUp:翻页
清空文件:echo "" > filename 或者cat /dev/null > a.txt 或者>a.txt
Linux统计文件中出现的次数:
(1) 单个字符串:grep -o targetstr filename | wc -l
多个字符串:grep -o “targetstr_1 argetstr_2”filename | wc -l
(2) awk ”{s+=gsub(/targetStr/,"&")}END{print s}” filename
Linux查找某个文件中的某个词:
grep ‘test’a,b,c 在文件a,b,c中寻找test这个词
grep -r ”test” . #在当前目录中找test这个词
grep -r ”test” example #在example目录中找test这个词
wc -l filename: 查看文件里有多少行
uniq testfile: 删除一个文件中重复都是行
sort testfile1 | uniq:删除重复之后进行排序(次数的)