中高级测试工程师面试题(不断补充中)
一、软性热身题
这种题目,考的就是你的软性能力,比如表达能力,理解能力,协调能力,一个词概括就是套路。这类题目会在面试开始热身的时候,问一道两题,不会多,但是如果你能回答的有条不紊,清晰达意,那么就会给面试官留下非常好的印象,大致的题目如下:
- 自我介绍
- 介绍下你负责的公司项目
- 你有什么优点和缺点?
- 在同一个项目组内,你认为你怎么做会比另外一名测试更加优秀?
1.工作积累经验和此份工作的契合度;
2.硬实力:列举专业技能
3.软实力:协作能力、规划能力等
4.自己对面试岗位的理解和自己未来能给他们带来什么
5.你的测试技能能否发掘出更多问题
6.你的测试技能是否能提高效能
7.是否会主动推进问题,让上级领导省心
8.你是否可以让程序更容易接受你的观点
- 你为什么离开上家公司?离职原因(这个会在最后问)
二、测试理论基础题
这类题目就是考测试工程师的基本能力了,比如测试计划,测试流程,如何bug,你做过哪些测试,一般我们认为这些能力做的再好都是应该的,不会有加分,但是只要做的不好,那就是个不合格的测试工程师了。这种题目也不会问的太多,大概题目如下:
- 请描述下你上个公司的测试流程?
1.需求分析-测试计划-测试方案-测试用例-测试执行-测试报告
2.请描述下bug的几个要素?
1.没有实现需求说明书列出的功能
2.出现了需要说明书提到不应出现的事情
3.实现了需求说明书未提到的功能
4.没有实现说明书中没有提到但应该实现的功能
5.难于使用,运转速度很慢,用户认为没有达到预期
3.白盒和黑盒的区别,你是怎么运用的?
1.黑盒测试:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。利用其检查功能是否符合需求说明书,能够正常使用,
2.白盒测试:已知产品的内部工作过程,可以进行测试证明每种内部操作是否符合设计规格要求,所有内部成分是否经过检查利用其检查程序模块的内部逻辑走向,主要覆盖程序内的逻辑。
4.你是如何做测试分析?
1.掌握边界值分析、等价类划分、错误推测等方法来设计测试用例是一个完备的集合,它能够覆盖所有等价类以及各种边界值;
2.需要从软件功能需求出发,全面地,无遗漏地识别出测试需求;
3.最好是代码覆盖测试也全面的测试
5.功能测试在 beta 版本对外的上线标准是什么?
1.测试用例全部跑完并且bug都已经关闭,然后业务验收后可以上线
6.cookies和session的区别:
1、数据存放位置不同:
cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、安全程度不同:
cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。
3、性能使用程度不同:
session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
4、数据存储大小不同:
单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie,而session则存储与服务端,浏览器对其没有限制
7.索引的优缺点:
1.优点:
通过创建唯一性索引,可以保证数据库表中的每一行数据的唯一性。
可以加快数据的检索速度
可以加速表与表之间的连接
在使用分组和排序进行检索的时候,可以减少查询中分组和排序的时间
2.缺点:
创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
索引需要占用物理空间,数据量越大,占用空间越大
会降低表的增删改的效率,因为每次增删改索引,都需要进行动态维护
8.纸杯测试:
功能度:用水杯装水看漏不漏;水能不能被喝到
安全性:杯子有没有毒或细菌
可靠性:杯子从不同高度落下的损坏程度
可移植性:杯子在不同的地方、温度等环境下是否都可以正常使用
兼容性:杯子是否能够容纳果汁、白水、酒精、汽油等
易用性:杯子是否烫手、是否有防滑措施、是否方便饮用
用户文档:使用手册是否对杯子的用法、限制、使用条件等有详细描述
疲劳测试:将杯子盛上水(案例一)放24小时检查泄漏时间和情况;盛上汽油(案例二)放24小时检查泄漏时间和情况等
压力测试:用根针并在针上面不断加重量,看压强多大时会穿透
9.Python基本数据类型:
数字、字符串、列表、元组、字典、集合
10.列表和元组的区别:
列表是动态的,长度可变,可以随意地增删改元素。列表的存储空间略大于元组,性能略逊于元组。
元组是静态的,长度大小固定,不可以对元组元素进行增删改操作。元组对于列表更加轻量级,性能稍优
11.linux常用命令:
查看服务器动态内存free 磁盘df -h 查看端口号netstart
cd ls mv mkdir find rm touch cp vi pwd
12.装饰器和迭代器:
装饰器的作用在于,对已有函数,在不改变它内在封装上扩展它的功能
迭代器是访问集合元素的一种方式
如果一个对象拥有__iter_方法,其是可迭代对象;如果一个对象拥有__next__方法,其就是迭代器
13.app专项测试包括哪些
流量、电量、若网、cpu使用率、内存使用率、稳定性、兼容性、安全性、ui页面打开时间
14.软件上线标准:
严重影响主流程和用户信息安全资金安全100%解决,
需求文档上的功能已满足,
优化的bug不超过15%
15.
三、测试管理题
这类题目就是考验你作为测试leader或者测试负责人的管理能力了。
- 如果项目周期很短,测试人力匮乏,你是怎么协调的?
1.依据代码review的结果和影响范围,对测试内容进行适当的裁剪。
2.借助自动化工具的支持,提高测试案例的执行效率。
3.调整组内任务的优先级,进行人力协调,优先投入最紧要的项目。
4.必要的情况下加班
- 描述下你团队的测试分工
1.测试技术组和业务测试组。
2.测试技术组主要进行工具考研、工具开发和工具维护,为业务测试效率提升和基础建设做支撑。
3.业务测试组主要进行具体业务测试和工具的落地使用,具体测试内容覆盖功能、性能、兼容、稳定性、接口等。
- 对于团队成员,你是如何打kpi的?
1.一方面制定KPI的时候根据团队成员的职级和能力进行区分,制定合理且细化明确的指标,指标包含测试质量保证、测试效率提升、自动化事务、培训分享。
2.进行KPI考核的时候一方面依据KPI的指标达成度、达成时效打分,另一方面不在 KPI内的创新型事务会作为加分项。
四、移动测试相关
如今是移动互联网的天下,谁家没有个应用,所以这一块基本都会问到,同时也会看你的简历,如果你没有做过,基本也不会问的太深,如果你是专门做这一块的,那么要好好准备了。
概念题
- 描述下web测试和移动应用测试的相同点和区别?
1、系统结构方面:
web项目,b/s架构,基于浏览器的;web测试只要更新了服务器端,客户端就会同步会更新
app项目,c/s结构的,必须要有客户端;app 修改了服务端,则客户端用户所有核心版本都需要进行回归测试一遍
2、性能方面:
web项目 需监测 响应时间、CPU、Memory
app项目 除了监测 响应时间、CPU、Memory外,还需监测流量、电量等
3、兼容方面:
web项目:
1. 浏览器(火狐、谷歌、IE等)
2. 操作系统(Windows7、Windows10、Linux等)
app项目:
1. 设备系统: iOS(ipad、iphone)、Android(三星、华为、联想等) 、Windows(Win7、Win8)、OSX(Mac)
2. 手机设备可根据 手机型号、分辨率不同
4、相对于 Wed 项目,APP有专项测试:
1. 干扰测试:中断,来电,短信,关机,重启等
2. 弱网络测试(模拟2g、3g、4g,wifi网络状态以及丢包情况);网络切换测试(网络断开后重连、3g切换到4g/wifi 等)
3. 安装、更新、卸载
安装:需考虑安装时的中断、弱网、安装后删除安装文件等情况
卸载:需考虑 卸载后是否删除app相关的文件
更新:分强制更新、非强制更新、增量包更新、断点续传、弱网状态下更新
5、测试工具方面:
自动化工具:APP 一般使用 Appium; Web 一般使用 Selenium
性能测试工具:APP 一般使用 JMeter; Web 一般使用 LR、JMeter
6. 界面操作:
关于手机端测试,需注意手势,横竖屏切换,多点触控,前后台切换
7. 安全测试:
安装包是否可反编译代码、安装包是否签名、权限设置,例如访问通讯录等
8. 边界测试:
可用存储空间少、没有SD卡/双SD卡、飞行模式、系统时间有误、第三方依赖(QQ、微信登录)等
9. 权限测试:
设置某个App是否可以获取该权限,例如是否可访问通讯录、相册、照相机等
15.测试用例编写的方法:
边界值 、等价类、场景法、判定表、因果图、正交排列法、状态转换图法
- 你是如何做应用的兼容性测试的?
1.硬件兼容:机型、分辨率、系统、版本、网络
2.软件兼容:输入法键盘、相机、安全清理工具类
3.数据兼容:低升高、高降低的用户信息和数据的兼容,还有跨平台的数据兼容
- 请讲诉移动应用的灰度是怎么做的?
内部二维码下载
白名单用户方式
国内小市场先上,国外用 Google Play的 β版,默认开放5%
后台控制的方式,开放给一定比例的用户
实践题
- 应用的闪退通常是什么原因造成的?如果应用闪退,Android 和 iOS 上是分别怎么抓取日志的?
代码异常如除以零、未对返回的列表做判空、数组越界、空指针异常及其他运行时异常
- 如何测试一个应用的登录场景?
1.账号密码验证:
1.输入正确的用户名和密码验证是否成功
2.输入错误的用户名和密码验证时是否成功
3.输入正确的用户名和错误的密码验证是否成功
4.输入错误的用户名和正确的密码验证时否成功
2.输入框验证:输入框效验,为空 特殊字符 长度效验 边界值效验 用户名和密码大小写验证
3.验证码的验证:必填性 错误 过期 无网络获取验证码 输入正确的验证码后修改手机号注册
4.密码的安全性验证:明文显示 /密码缺少明暗文切换按钮
5.第三方登录的验证,主要关注第三方账号授权时的信息正确性,未安装第三方APP登录时的系统反应
6.单点登录验证:多台设备同时登录
7.第三方登录的验证:主要关注第三方账号授权时的信息正确性,未安装第三方APP登录时的系统反应
8.逆向思维:已注册账号注册 未注册账号登录 未注册账号忘记密码
五、服务端测试相关
什么都离不开服务端,所以这是你逃不开的,一般来说服务端会问接口测试,性能测试,更深一点,埋点监控止血也会有。
- 请问你们公司是如何做接口测试的?
swagger 、 接口自动化脚本 Jemeter
接口测试质量评估标准是什么?
接口表现与接口文档的一致性
请求参数:必选和非必选、长度、字符类型、为空、缺失、组合、重复
返回数据:正常和异常
性能,1000以内并发时小于3s
请问你们公司是如何做性能测试的?请讲诉性能测试的相关指标?
压力测试和负载测试的区别
压力测试是在高负载情况下对系统的稳定性进行测试。是在高负载(大数据量、大量并发用户等)下的测试,观察系统在峰值使用情况下的表现,从而发现系统的功能隐患。
负载测试:多用户,用户数渐增,持续同时发同一业务请求,产出最大TPS
压力测试:多用户,资源使用饱和,持续同时发同一业务请求,产出系统瓶颈或使用极限
服务器中一般要监控哪些数据,如何监控的,怎么从监控数据中发现问题?
基础监控和应用监控。基础监控包括机器是否死机,cpu,内存,磁盘使用率等
应用监控包括日志监控、端口监控、进程数监控等。
- 接口测试质量评估标准是什么?
1.接口表现与接口文档的一致性
2.请求参数:必选和非必选、长度、字符类型、为空、缺失、组合、重复
3.返回数据:正常和异常
- 请问你们公司是如何做性能测试的?请讲诉性能测试的相关指标?
1.做性能需求分析,挑选了用户使用最频繁的功能来做性能测试,比如:登陆,搜索,提交订单,确定性能指标,比如:事务通过率为100%,90%的事务响应时间不超过5秒,并发用户为1000人,CPU和内存的使用率为70%以下
2.性能测试计划,明确测试时间(通常在功能稳定后,如第一轮测试后进行)和测试环境和测试工具的选择
3.编写性能测试用例
4.搭建性能测试环境,准备好性能测试数据
5.通过性能测试用例,编写性能测试脚本
6.性能测试脚本进行调优,设置检查点、参数化、关联、集合点、事务,调整思考时间,删除冗余的脚本等
7.设计性能测试场景,使用nmon工具监控服务器,运行测试场景
8.分析性能测试结果,如果有问题(性能瓶颈),收集相关的日志提单给开发修改
9.开发修改好后,回归性能测试
10.编写性能测试报告
相关指标:响应时间、并发数、吞吐率、资源利用率、TPS
- 压力测试和负载测试的区别
1.负载测试是模拟实际软件系统所承受的负载条件的系统负荷,
2.通过不断加载(如逐渐增加模拟用户的数量)或其它加载方式来观察不同负载下系统的响应时间和数据吞吐量、系统占用的资源(如CPU、内存)等,
3.以检验系统的行为和特性,以发现系统可能存在的性能瓶颈、内存泄漏、不能实时同步等问题
4.压力测试是在高负载情况下对系统的稳定性进行测试。
5.是在高负载(大数据量、大量并发用户等)下的测试,观察系统在峰值使用情况下的表现,
从而发现系统的功能隐患
6.负载测试:多用户,用户数渐增,持续同时发同一业务请求,产出最大TPS
7.压力测试:多用户,资源使用饱和,持续同时发同一业务请求,产出系统瓶颈或使用极限
- 服务器中一般要监控哪些数据,如何监控的,怎么从监控数据中发现问题?
1.基础监控和应用监控。
2.基础监控包括机器是否死机,cpu,内存,磁盘使用率等;应用监控包括日志监控、端口监控、进程数监控等。
- 假设系统A调用系统B,我把B的接口都mock了,进行性能测试,这样有什么好处和坏处?
1.好处:防止系统B出错引起测试错误;不会因系统B的开发进度影响测试;mock后可以快速返回结果,提高测试效率
2.坏处:很多情况下无法完全模拟出服务器的所有可能的返回情况,另外,mock掉了关联方之后,整个环境的连通性可能测试的不到位。
- 有一天早上打车高峰,滴滴服务端挂了大概30分钟,工程师抢修之后,马上上线,之后又挂了,请问有哪些原因会造成这个情况?
1.服务器内存不够、服务器超出负载、并发量太大、遇到恶意攻击
六、python和java相关
自动化永远是避不开的,反正你入职的岗位要不要用自动化,你必须得会一点,加分项。这一块包括,自动化一些理念和自动化的工具使用。
理念和概念:
1.什么是分层自动化?
1.金字塔结构, 最底层UnitTest,往上接口API/集成起来的service, 最上面UI自动化
2.你的测试数据是怎么准备的?
1.提前准备好,在代码里的yaml文件
3.测试脚本的维护成本是怎么样的?
1.业务不变的情况下,一般脚本都是不坏不动的
4.java面向对象的特征:
封装、继承、多态
5.Java中的基本数据类型:
bate、short、int、long、float、double、char、boolean
6.方法的重载和重写:
1.方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。
2.重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;
3.重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求
7.List , Set, Map:
都是接口,前两个继承至Collection接口(Collection接口下还有个Queue接口,有PriorityQueue类),Map为独立接口,
(1)List下有ArrayList,Vector,LinkedList
(2)Set下有HashSet,LinkedHashSet,TreeSet
(2)Map下有Hashtable,LinkedHashMap,HashMap,TreeMap
8.强制等待、显示等待、隐式等待的区别:
1、强行等待 设置固定的线程休眠时间
2、显示等待 是单独针对某个元素,设置一个等待时间如10秒,每隔0.5秒检查一次是否出现,如果在5秒之前任何时候出现,则继续向下,超过5秒尚未出现则抛异常。
3、隐式等待是全局的是针对所有元素,设置等待时间如10秒,如果10秒内出现,则继续向下,否则抛异常。可以理解为在10秒以内,不停刷新看元素是否加载出来
9.你所知道的微服务技术栈?
维度(springcloud)
服务开发:springboot spring springmvc
服务配置与管理:Netfix公司的Archaiusm ,阿里的Diamond
服务注册与发现:Eureka,Zookeeper
服务调用:Rest RPC gRpc
服务熔断器:Hystrix
服务负载均衡:Ribbon Nginx
服务接口调用:Fegin
消息队列:Kafka Rabbitmq activemq
服务配置中心管理:SpringCloudConfig
服务路由(API网关)Zuul
事件消息总线:SpringCloud Bus
七、硬 题
所谓硬题就是答案一般都是固定或者标准的,答案也不会模棱两可,包括:算法,编程,sql,linux
算法:
请写出冒泡排序
public static int[] buddleSort(int[] arr){ for(int i=1;i
1~9999数列中数字3出现的次数。用递推方法解出。
def count_digit(number): return len(str(number))
def countThree(digit):
if not isinstance(digit,int):
raise TypeError('number is not int')
# digit = len(str(number))
if(digit <=0):
return 0
if(digit ==1):
return 1
return 10*countThree(digit-1) + 10 **(digit-1)print(countThree(count_digit(9999)))
从一个数组中找出前4个最大的数,用最优解。
写一段程序,删除字符串a中包含的字符串b,举例 输入a = "asdw",b = "sd" 返回 字符串 “aw”,并且测试这个程序。
写一个方法,把字符串转为数字,比如 str="1234",变成 int 1234。并且测试这个程序。
编程:
什么是面向对象编程?
面向对象程序设计作为一种新方法,是一种计算机编程架构,其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。面向对象编程主要有三大特性,分别为:封装、继承、多态。”
讲下Java多线程的使用
1.继承Thread类, 2.重写run函数;实现Runnable接口,重写run函数; 3.实现Callable接口,重写call函数
有三个线程T1,T2,T3,怎么确保它们按顺序执行?
先启动最后一个(T3调用T2,T2调用T1) package com.te;
public class Testt {
static Testt t=new Testt();
class T1 extends Thread{@Override public void run() { //T3线程中要处理的东西 System.out.println("T1线程执行"); } } class T2 extends Thread{ @Override public void run() { //T3线程中要处理的东西 System.out.println("T2线程执行"); t.new T1().start(); } } class T3 extends Thread{ @Override public void run() { //T3线程中要处理的东西 System.out.println("T3线程执行"); t.new T2().start(); } } public static void main(String[] args) { t.new T3().start(); }
}
Thread 类中的start() 和 run() 方法有什么区别?
1.start()方法来启动线程,真正实现了多线程运行,这时无需等待。run方法体代码执行完毕而直接继续执行下面的代码: 通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有运行。 然后... 2.run()方法当作普通方法的方式调用,程序还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码: 而如果直接用run方法,这只是调用一个方法而已,程序中依然只有主线程–这一个线程,其程序执行路径还是只有... 3.调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。
请写一个线程安全的单例模型
public class SingleInstance { private volatile static SingleInstance uniqueInstance = null; public static SingleInstance getInstance() { if (uniqueInstance == null) { synchronized (SingleInstance.class) { if (uniqueInstance == null) { uniqueInstance = new SingleInstance(); } } } return uniqueInstance; } }
SQL:
说下左连接和右连接
左边表中所有和右边表中所有
介绍下什么是索引
索引是一种与表有关的数据库结构,它可以使对应于表的 SQL 语句执行得更快。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。 对于数据库来说,索引是一个必选项,但对于现在的各种大型数据库来说,索引可以大大提高数据库的性能,以至于它变成了数据库不可缺少的一部分。
使用sql生产10万条数据
给你一张表,根据要求写sql,这个题目比较多,自己百度吧。
Linux:
你常用的命令是什么?
用什么查看log?
tail -f log文件
如何查找一个文件大小超过5M的文件
find / -size +5M
如何查看进程?
ps
- 大仙出品必属精品!!!