中高级测试工程师面试题(不断补充中)

中高级测试工程师面试题(不断补充中)

一、软性热身题

这种题目,考的就是你的软性能力,比如表达能力,理解能力,协调能力,一个词概括就是套路。这类题目会在面试开始热身的时候,问一道两题,不会多,但是如果你能回答的有条不紊,清晰达意,那么就会给面试官留下非常好的印象,大致的题目如下:

  1. 自我介绍
  2. 介绍下你负责的公司项目
  3. 你有什么优点和缺点?
  4. 在同一个项目组内,你认为你怎么做会比另外一名测试更加优秀?
1.工作积累经验和此份工作的契合度;
2.硬实力:列举专业技能
3.软实力:协作能力、规划能力等
4.自己对面试岗位的理解和自己未来能给他们带来什么
5.你的测试技能能否发掘出更多问题
6.你的测试技能是否能提高效能
7.是否会主动推进问题,让上级领导省心
8.你是否可以让程序更容易接受你的观点
  1. 你为什么离开上家公司?离职原因(这个会在最后问)

二、测试理论基础题

这类题目就是考测试工程师的基本能力了,比如测试计划,测试流程,如何bug,你做过哪些测试,一般我们认为这些能力做的再好都是应该的,不会有加分,但是只要做的不好,那就是个不合格的测试工程师了。这种题目也不会问的太多,大概题目如下:

  1. 请描述下你上个公司的测试流程?
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.redis的基本数据类型:

字符串、列表、集合、有序集合、哈希

redis的基础数据类型与python有雷同,字符串、列表、集合

三、测试管理题

这类题目就是考验你作为测试leader或者测试负责人的管理能力了。

  1. 如果项目周期很短,测试人力匮乏,你是怎么协调的?
1.依据代码review的结果和影响范围,对测试内容进行适当的裁剪。
2.借助自动化工具的支持,提高测试案例的执行效率。
3.调整组内任务的优先级,进行人力协调,优先投入最紧要的项目。
4.必要的情况下加班
  1. 描述下你团队的测试分工
1.测试技术组和业务测试组。
2.测试技术组主要进行工具考研、工具开发和工具维护,为业务测试效率提升和基础建设做支撑。
3.业务测试组主要进行具体业务测试和工具的落地使用,具体测试内容覆盖功能、性能、兼容、稳定性、接口等。
  1. 对于团队成员,你是如何打kpi的?
1.一方面制定KPI的时候根据团队成员的职级和能力进行区分,制定合理且细化明确的指标,指标包含测试质量保证、测试效率提升、自动化事务、培训分享。
2.进行KPI考核的时候一方面依据KPI的指标达成度、达成时效打分,另一方面不在 KPI内的创新型事务会作为加分项。

四、移动测试相关

如今是移动互联网的天下,谁家没有个应用,所以这一块基本都会问到,同时也会看你的简历,如果你没有做过,基本也不会问的太深,如果你是专门做这一块的,那么要好好准备了。

概念题

  1. 描述下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. 你是如何做应用的兼容性测试的?
1.硬件兼容:机型、分辨率、系统、版本、网络
2.软件兼容:输入法键盘、相机、安全清理工具类
3.数据兼容:低升高、高降低的用户信息和数据的兼容,还有跨平台的数据兼容
  1. 请讲诉移动应用的灰度是怎么做的?
内部二维码下载
白名单用户方式
国内小市场先上,国外用 Google Play的 β版,默认开放5%
后台控制的方式,开放给一定比例的用户

实践题

  1. 应用的闪退通常是什么原因造成的?如果应用闪退,Android 和 iOS 上是分别怎么抓取日志的?
代码异常如除以零、未对返回的列表做判空、数组越界、空指针异常及其他运行时异常
  1. 如何测试一个应用的登录场景?
1.账号密码验证:
   1.输入正确的用户名和密码验证是否成功
   2.输入错误的用户名和密码验证时是否成功
   3.输入正确的用户名和错误的密码验证是否成功
   4.输入错误的用户名和正确的密码验证时否成功
2.输入框验证:输入框效验,为空  特殊字符  长度效验  边界值效验  用户名和密码大小写验证 
3.验证码的验证:必填性  错误  过期   无网络获取验证码    输入正确的验证码后修改手机号注册
4.密码的安全性验证:明文显示  /密码缺少明暗文切换按钮
5.第三方登录的验证,主要关注第三方账号授权时的信息正确性,未安装第三方APP登录时的系统反应
6.单点登录验证:多台设备同时登录
7.第三方登录的验证:主要关注第三方账号授权时的信息正确性,未安装第三方APP登录时的系统反应
8.逆向思维:已注册账号注册    未注册账号登录  未注册账号忘记密码

五、服务端测试相关

什么都离不开服务端,所以这是你逃不开的,一般来说服务端会问接口测试,性能测试,更深一点,埋点监控止血也会有。

  1. 请问你们公司是如何做接口测试的?
swagger 、 接口自动化脚本
Jemeter

接口测试质量评估标准是什么?

接口表现与接口文档的一致性

请求参数:必选和非必选、长度、字符类型、为空、缺失、组合、重复

返回数据:正常和异常

性能,1000以内并发时小于3s

请问你们公司是如何做性能测试的?请讲诉性能测试的相关指标?

压力测试和负载测试的区别

压力测试是在高负载情况下对系统的稳定性进行测试。是在高负载(大数据量、大量并发用户等)下的测试,观察系统在峰值使用情况下的表现,从而发现系统的功能隐患。

负载测试:多用户,用户数渐增,持续同时发同一业务请求,产出最大TPS

压力测试:多用户,资源使用饱和,持续同时发同一业务请求,产出系统瓶颈或使用极限

服务器中一般要监控哪些数据,如何监控的,怎么从监控数据中发现问题?

基础监控和应用监控。基础监控包括机器是否死机,cpu,内存,磁盘使用率等

应用监控包括日志监控、端口监控、进程数监控等。

  1. 接口测试质量评估标准是什么?
1.接口表现与接口文档的一致性
2.请求参数:必选和非必选、长度、字符类型、为空、缺失、组合、重复
3.返回数据:正常和异常
  1. 请问你们公司是如何做性能测试的?请讲诉性能测试的相关指标?
1.做性能需求分析,挑选了用户使用最频繁的功能来做性能测试,比如:登陆,搜索,提交订单,确定性能指标,比如:事务通过率为100%,90%的事务响应时间不超过5秒,并发用户为1000人,CPU和内存的使用率为70%以下
2.性能测试计划,明确测试时间(通常在功能稳定后,如第一轮测试后进行)和测试环境和测试工具的选择
3.编写性能测试用例
4.搭建性能测试环境,准备好性能测试数据
5.通过性能测试用例,编写性能测试脚本
6.性能测试脚本进行调优,设置检查点、参数化、关联、集合点、事务,调整思考时间,删除冗余的脚本等
7.设计性能测试场景,使用nmon工具监控服务器,运行测试场景
8.分析性能测试结果,如果有问题(性能瓶颈),收集相关的日志提单给开发修改
9.开发修改好后,回归性能测试
10.编写性能测试报告
相关指标:响应时间、并发数、吞吐率、资源利用率、TPS
  1. 压力测试和负载测试的区别
1.负载测试是模拟实际软件系统所承受的负载条件的系统负荷,
2.通过不断加载(如逐渐增加模拟用户的数量)或其它加载方式来观察不同负载下系统的响应时间和数据吞吐量、系统占用的资源(如CPU、内存)等,
3.以检验系统的行为和特性,以发现系统可能存在的性能瓶颈、内存泄漏、不能实时同步等问题
4.压力测试是在高负载情况下对系统的稳定性进行测试。
5.是在高负载(大数据量、大量并发用户等)下的测试,观察系统在峰值使用情况下的表现,
从而发现系统的功能隐患
6.负载测试:多用户,用户数渐增,持续同时发同一业务请求,产出最大TPS
7.压力测试:多用户,资源使用饱和,持续同时发同一业务请求,产出系统瓶颈或使用极限
  1. 服务器中一般要监控哪些数据,如何监控的,怎么从监控数据中发现问题?
1.基础监控和应用监控。
2.基础监控包括机器是否死机,cpu,内存,磁盘使用率等;应用监控包括日志监控、端口监控、进程数监控等。
  1. 假设系统A调用系统B,我把B的接口都mock了,进行性能测试,这样有什么好处和坏处?
1.好处:防止系统B出错引起测试错误;不会因系统B的开发进度影响测试;mock后可以快速返回结果,提高测试效率
2.坏处:很多情况下无法完全模拟出服务器的所有可能的返回情况,另外,mock掉了关联方之后,整个环境的连通性可能测试的不到位。
  1. 有一天早上打车高峰,滴滴服务端挂了大概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

算法:

  1. 请写出冒泡排序

    public static int[] buddleSort(int[] arr){
        for(int i=1;i<arr.length;i++){
            for(int j=0; j<arr.length-i; j++){
                if(arr[j] < arr[j+1]){
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        return arr;
    }
  2. 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)))

  3. 从一个数组中找出前4个最大的数,用最优解。

  4. 写一段程序,删除字符串a中包含的字符串b,举例 输入a = "asdw",b = "sd" 返回 字符串 “aw”,并且测试这个程序。

  5. 写一个方法,把字符串转为数字,比如 str="1234",变成 int 1234。并且测试这个程序。

编程:

  1. 什么是面向对象编程?

    面向对象程序设计作为一种新方法,是一种计算机编程架构,其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。面向对象编程主要有三大特性,分别为:封装、继承、多态。”
  2. 讲下Java多线程的使用

    1.继承Thread类,
    2.重写run函数;实现Runnable接口,重写run函数;
    3.实现Callable接口,重写call函数
  3. 有三个线程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(&quot;T1线程执行&quot;);
    		
    		
    	}
    	
    }
    
    class T2 extends Thread{
    	
    	@Override
    	public void run() {
    		
    		//T3线程中要处理的东西
    		System.out.println(&quot;T2线程执行&quot;);
    		t.new T1().start();
    		
    		
    	}
    	
    }
    
    class T3 extends Thread{
    	
    	@Override
    	public void run() {
    		
    		//T3线程中要处理的东西
    		System.out.println(&quot;T3线程执行&quot;);
    		t.new T2().start();
    		
    		
    	}
    	
    	
    }
    
    
    public static void main(String[] args) {
    	
    	t.new T3().start();
    
    }

    }

  4. Thread 类中的start() 和 run() 方法有什么区别?

    1.start()方法来启动线程,真正实现了多线程运行,这时无需等待。run方法体代码执行完毕而直接继续执行下面的代码: 通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有运行。 然后...
    2.run()方法当作普通方法的方式调用,程序还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码: 而如果直接用run方法,这只是调用一个方法而已,程序中依然只有主线程–这一个线程,其程序执行路径还是只有...
    3.调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。
  5. 请写一个线程安全的单例模型

    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:

  1. 说下左连接和右连接

    左边表中所有和右边表中所有
  2. 介绍下什么是索引

    索引是一种与表有关的数据库结构,它可以使对应于表的 SQL 语句执行得更快。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。 
    对于数据库来说,索引是一个必选项,但对于现在的各种大型数据库来说,索引可以大大提高数据库的性能,以至于它变成了数据库不可缺少的一部分。
  3. 使用sql生产10万条数据

  4. 给你一张表,根据要求写sql,这个题目比较多,自己百度吧。

Linux:

  1. 你常用的命令是什么?

  2. 用什么查看log?

    tail -f log文件
  3. 如何查找一个文件大小超过5M的文件

    find / -size +5M
  4. 如何查看进程?

    ps
  5. 大仙出品必属精品!!!
  • 4
    点赞
  • 116
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值