作为一个已经工作有10年经验的测试工程师,其间也辗转了几个大的互联网公司,虽然确实缺少了一些稳定性,但同时也积累了一些面试的经验,不才分享一些给大家。那么主要是针对测试工程师的一些总结,对于其他的工种,我可能会在别的文章中去总结一些面试技巧,本文会着重于测试工程师的面经。
测试的面试重点分为两大部分:技术,项目
扩充一下:技术的一些注意点,项目上的一些处理方式(有些还会有一些沟通上的小技巧),可能不会写的特别详细,但点我都会点到,后续会再继续补充(近3万字的长文预警,希望能帮助到技术友)
那么直接上货,希望能帮助到各位同行都可以找到满意的工作,共勉之!
一、黑盒测试方法(可能会问等价类的分类,等价类和边界值是最重要的)
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能收到自己的信息),四次握手又浪费了效率
六、DNS(运行在UDP协议上,端口53)
概念:dns是一个域名系统,是万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串
七、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自动化相通的)
特点:
1.跨平台,native hybrid webview(H5)
2.跨设备,android iOS
3.跨app,可以在多个app之间交互
4.不依赖APP开源代码(保留意见,android Uiautomator对H5的支持需要代码支持,这里不细说)
5.支持Selenium WebDriver / Selenium Grid
6.跨语言,java python ruby nodejs
7.Open Source 原理: Android
九、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\targetstr_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:删除重复之后进行排序(次数的)
十、Mysql(乱七八糟语句不写了,写点我被问到的)
- 授权语句
grant select, insert, update, delete on testdb.* to common_user@'%'
- SQL 常见查询语句编写(此处仅举例常见的查询语句,如有更多坑,希望补充)
查询所有学生的数学成绩,显示学生姓名 name, 分数, 由高到低。
SELECT a.name, b.score FROM student a, grade b WHERE a.id = b.id AND kemu = '数学' ORDER BY score DESC;
统计每个学生的总成绩(由于学生可能有重复名字),显示字段:学生 id,姓名,总成绩。
SELECT a.id, a.name, c.sum_score from student a, (SELECT b.id, sum(b.score) as sum_score FROM grade b GROUP BY id) c WHERE a.id = c.id ORDER BY sum_score DESC;
- 慢查询是什么意思?
开启慢查询日志,可以让 MySQL 记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能。
- 导致数据库性能差的可能原因有哪些?
硬件环境问题,如磁盘IO
查询语句问题,如join、子查询、没建索引
索引失效,建了索引,查询的时候没用上
查询关联了太多的join
服务器关联缓存,线程数等
表中存在冗余字段,在生成笛卡尔积时耗费多余的时间
11、你们公司是不是敏捷开发?介绍一下敏捷开发?
- 是,敏捷快速迭代、多版本同时迭代
- 敏捷开发属于增量式开发,对于需求范围不明确、需求变更较多的项目而言可以很大程度上响应和拥抱变化、主张简单、拥抱变化、可持续性、递增的变化、高质量的工作、快速反馈、软件是你的主要目标
12、测试用例设计
登陆模块
- 功能用例
- 兼容性(app版本,操作系统版本,不同移动设备分辨率)
- 性能上(单用户的响应时间,高并发,长时间多用户登陆)
- 安全性(加密,SQL注入(通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令),脚本攻击,多设备登陆的互斥)
- 弱网(android 在fiddler下,ios通过自身的status ,下一章写)
- UI测试
- 可用性,易用性(全键盘输入,enter,tab)
- 本地化(多语言)
还有很多,测试纸杯,电梯,购物车,支付功能(这都是我面试遇到过的)很多别的也可以考虑这些方面,反正都凭自身经验吧~~
13、弱网测试
- 弱网测试的思路
弱网功能测试:2G/3G/4G、高延时、高丢包
无网状态测试:断网功能测试、本地数据存储
用户体验关注:响应时间、页面呈现&超时文案&超时重连、安全及大流量风险
网络切换测试:Wifi>>4G/3G/2G>>无网多状态切换
- 如何模拟弱网测试?
fiddler和charles都可以模拟弱网测试,平常说的模拟丢包,也是模拟弱网测试
- 网络切换测试
这部分主要是进行几个不同网络场景的切换,包括:
1.wifi-2G/3G/4G
2.wifi-无网
3.2G/3G/4G-wifi
4.2G/3G/4G-无网
5.无网-2G/3G/4G
6.无网-wifi等
主要关注页面的显示与交互,尤其是弱网到wifi,wifi到弱网的情况,是否会有页面的crash以及显示的错乱、session是否一致、请求堆积处理等。
- 用户体验关注
1.页面响应时间是否可以接受,关注包括热启动、冷启动时间、页面切换、前后台切换、首字时间,首屏时间等
2.页面呈现是否完成一致
3.超时文案是否符合定义,异常信息是否显示正常
4.是否有超时重连
5.全角度:是否会发生dns劫持、登陆ip更换频繁、单点登陆异常等
6.大流量事件风险:是否会在弱网下进行更新apk包、下载文件等大流量动作
14、Fiddler
打断点和AutoResponder的区别,注意修改数据后请求超时导致客户端不做请求
1、打断点,是阻塞了请求,一直没有结果返回,请求将在线程中一直存在,直到超时被踢出来。
2、AutoResponder返回404/502,这种情况是有结果返回的,代表请求也结束了,不会在线程中一直存在
fiddler抓https包
(1)原理同charles,首先:给fiddler安装certmaker插件(然后重启)
(2)Tools->Fiddler Options->HTTPS ,Actions-> Trust Root Certificate,弹框后安装CA证书
安装成功后可以通过Actions—>open windows certificate Manager 查看安装的证书
(3) 手机安装Fiddler证书,打开手机浏览器,在浏览器地址输入代理服务器IP和端口。点击之后安装证书即可
15、APP crash
- crash常见的原因(空指针,内存泄漏,数组越界,调用高版本API)
设备碎片化:由于设备极具多样性,App在不同的设备上可能有表现不同。
带宽限制:带宽不佳的网络对App所需的快速响应时间可能不够。
网络的变化:不同网络间的切换可能会影响App的稳定性。
内存管理:可用内存过低,或非授权的内存位置的使用可能会导致App失败。
用户过多:连接数量过多可能会导致App崩溃。
代码错误:没有经过测试的新功能,可能会导致App在生产环境中失败。
(可能是java的UnChecked异常发生时,由于没有相应的try…catch处理该异常对象,所以Java运行环境将会终止,程序将退出)
第三方服务:广告或弹出屏幕可能会导致App崩溃。
- App崩溃的测试用例设计
验证在有不同的屏幕分辨率,操作系统和运营商的多个设备上的App行为。
用新发布的操作系统版本验证App的行为。
验证在如隧道,电梯等网络质量突然改变的环境中的App行为。
通过手动网络从蜂窝更改到Wi-Fi ,或反过来,验证App行为。
验证在没有网络的环境中的App行为。
验证来电/短信和设备特定的警报(如警报和通知)时的App行为。
通过改变设备的方向,以不同的视图模式,验证App行为。
验证设备内存不足时的App行为。
通过用测试工具施加载荷验证App行为。
16、Git(命令为主)
git clone 拷贝一个Git仓库到本地
git status 查看仓库状态
git diff * 查看X文件修改了那些内容
git log 查看历史记录
git reset –hard HEAD^ 回退到上一个版本
git reset --hard HEAD~第几个 如果想回退到第3个版本,使用git reset –hard HEAD~3
git branch 查看本地所有的分支
git branch -a 查看远程所有的分支
git branch name 创建分支
git branch –d dev 删除dev分支
git checkout –b dev 创建dev分支 并切换到dev分支上
git merge dev 在当前分支上合并dev分支代
提交代码三部曲哈哈哈:
git add * 把x文件添加到暂存区去
git commit –m "*" 提交文件 –m 后面的是注释
git push
17、Monkey(命令用到查就行了这个,要知道-p是指定包)
1.Monkey程序由Android系统自带,使用Java语言写成,在Android文件系统中的存放路径是:/sdk/sdk/tools/lib/monkey.jar
2.Monkey.jar程序是由一个名为“monkey”的Shell脚本来启动执行,shell脚本在Android文件系统中的存放路径是:/sdk/sdk/tools/bin/monkey
- adb shell monkey {+命令参数} Monkey 测试出现错误后,一般的分析步骤(我以前被问到过,当时一脸懵逼(´⊙ω⊙`)) 看Monkey的日志 (注意第一个swith以及异常信息等)
- 程序无响应的问题: 在日志中搜索 “ANR”
- 崩溃问题:在日志中搜索 “Exception” (如果出现空指针, NullPointerException) 肯定是有bug
18、Android和IOS测试区别
- Android长按home键呼出应用列表和切换应用,然后右滑则终止应用;
- 多分辨率测试,Android端20多种,ios较少;
- 手机操作系统,Android较多,ios较少且不能降级,只能单向升级;新的ios系统中的资源库不能完全兼容低版本中的ios系统中的应用,低版本ios系统中的应用调用了新的资源库,会直接导致闪退(Crash);
- 操作习惯:Android,Back键是否被重写,测试点击Back键后的反馈是否正确;应用数据从内存移动到SD卡后能否正常运行等;
- push测试:Android:点击home键,程序后台运行时,此时接收到push,点击后唤醒应用,此时是否可以正确跳转;ios,点击home键关闭程序和屏幕锁屏的情况(红点的显示);
- 安装卸载测试:Android的下载和安装的平台和工具和渠道比较多,ios主要有app store,iTunes和testflight下载;
- 升级测试:可以被升级的必要条件:新旧版本具有相同的签名;新旧版本具有相同的包名;有一个标示符区分新旧版本(如版本号),对于Android若有内置的应用需检查升级之后内置文件是否匹配(如内置的输入法)
19、IOS和android日志抓取
iOS:
- 通过iTunes Connect(Manage Your Applications - View Details - Crash Reports)获取用户的crash日志
- 通过Xcode从你的设备上获得崩溃日志
- 自己在程序中添加崩溃捕捉代码,如果应用集成第三方SDK,如百度统计
Android:
- 通过集成第三方SDK,如百度统计、友盟统计等
- 发版时使用加固工具,他们也会收集错误日志,如360加固
- 在程序中添加程序异常崩溃的捕捉代码,保存到本地文件中
20、SQL注入(想了半天,这个得列一下,安全虽然我们不做,但问基本都是问这东西,看懂这段就够了,要是问怎么防止就说对用户输入进行校验,不要动态拼接SQL)
select * from users where username='' or 1=1#' and password=md5('')
等价于
select * from users where username='' or 1=1
SQL注入采用的' OR 1=1 # 是什么意思呢?
最后一个#号有什么意义呢?
SELECT * FROM test WHERE name='' OR 1=1 #' AND age='20'
这后面写的 #' 是什么意思呢?
解释:可以注释掉后面的一行SQL代码
相当于去掉了一个where条件
MySQL 注释, 过滤掉后面的SQL语句,使其不起作用
因为1=1永远是都是成立的,即where子句总是为真,将该sql进一步简化之后,等价于如下select语句:
select * from users 没错,该sql语句的作用是检索users表中的所有字段
马上就要到金九银十得面试旺季,大家都希望趁着这个机会找到一个心仪的工作,但是不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊~
最后感谢每一个认真阅读我文章的人,作为一位过来人也是希望大家少走一些弯路,在这里我给大家分享一些自动化测试的学习资源,如果你用得到的话可以直接拿走,希望能给你前进的路上带来帮助。
(包括Python编程、WEB自动化测试、app自动化测试、接口自动化测试、测试框架、持续集成、自动化测试开发、性能测试、安全测试、大厂面试真题、简历模板等等、当然还有一些测试基础、工具、app测试、接口测试、linux、mysql数据库等基础知识),相信能使你更好的进步!