经典测试工程师面试题(一)
经典测试工程师面试题(一)
白盒和黑盒的区别,你是怎么运用的?
黑盒测试:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。利用其检查功能是否符合需求说明书,能够正常使用,
白盒测试:已知产品的内部工作过程,可以进行测试证明每种内部操作是否符合设计规格要求,所有内部成分是否经过检查
利用其检查程序模块的内部逻辑走向,主要覆盖程序内的逻辑。
如何设计测试用例?什么样子的测试用例是好用例?
掌握边界值分析、等价类划分、错误推测等方法来设计测试用例
是一个完备的集合,它能够覆盖所有等价类以及各种边界值;需要从软件功能需求出发,全面地,无遗漏地识别出测试需求;最好是代码覆盖测试也全面的测试
功能测试在 beta 版本对外的上线标准是什么?
测试用例全部跑完并且bug都已经关闭,然后业务验收后可以上线
请描述下你公司的测试流程?
需求分析讨论-确定测试策略-设计测试用例-测试用例评审-beta测试-uat测试-测试报告
请描述下bug的几个要素?
1.没有实现需求说明书列出的功能
2.出现了需要说明书提到不应出现的事情
3.实现了需求说明书未提到的功能
4.没有实现说明书中没有提到但应该实现的功能
5.难于使用,运转速度很慢,用户认为没有达到预期
请问你们公司是如何做接口测试的?
swagger 、 接口自动化脚本
接口测试质量评估标准是什么?
接口表现与接口文档的一致性
请求参数:必选和非必选、长度、字符类型、为空、缺失、组合、重复
返回数据:正常和异常
请问你们公司是如何做性能测试的?请讲诉性能测试的相关指标?
1.做性能需求分析,挑选了用户使用最频繁的功能来做性能测试,比如:登陆,搜索,提交订单,确定性能指标,比如:事务通过率为100%,90%的事务响应时间不超过5秒,并发用户为1000人,CPU和内存的使用率为70%以下
2.性能测试计划,明确测试时间(通常在功能稳定后,如第一轮测试后进行)和测试环境和测试工具的选择
3.编写性能测试用例
4.搭建性能测试环境,准备好性能测试数据
5.通过性能测试用例,编写性能测试脚本
6.性能测试脚本进行调优,设置检查点、参数化、关联、集合点、事务,调整思考时间,删除冗余的脚本等
7.设计性能测试场景,使用nmon工具监控服务器,运行测试场景
8.分析性能测试结果,如果有问题(性能瓶颈),收集相关的日志提单给开发修改
9.开发修改好后,回归性能测试
10.编写性能测试报告
相关指标:响应时间、并发数、吞吐率、资源利用率、TPS
压力测试和负载测试的区别
负载测试是模拟实际软件系统所承受的负载条件的系统负荷,通过不断加载(如逐渐增加模拟用户的数量)或其它加载方式来观察不同负载下系统的响应时间和数据吞吐量、系统占用的资源(如CPU、内存)等,以检验系统的行为和特性,以发现系统可能存在的性能瓶颈、内存泄漏、不能实时同步等问题
压力测试是在高负载情况下对系统的稳定性进行测试。是在高负载(大数据量、大量并发用户等)下的测试,观察系统在峰值使用情况下的表现,从而发现系统的功能隐患
负载测试:多用户,用户数渐增,持续同时发同一业务请求,产出最大TPS
压力测试:多用户,资源使用饱和,持续同时发同一业务请求,产出系统瓶颈或使用极限
服务器中一般要监控哪些数据,如何监控的,怎么从监控数据中发现问题?
基础监控和应用监控。
基础监控包括机器是否死机,cpu,内存,磁盘使用率等;应用监控包括日志监控、端口监控、进程数监控等。
假设系统A调用系统B,我把B的接口都mock了,进行性能测试,这样有什么好处和坏处?
好处:防止系统B出错引起测试错误;不会因系统B的开发进度影响测试;mock后可以快速返回结果,提高测试效率
坏处:很多情况下无法完全模拟出服务器的所有可能的返回情况,另外,mock掉了关联方之后,整个环境的连通性可能测试的不到位。
有一天早上打车高峰,滴滴服务端挂了大概30分钟,工程师抢修之后,马上上线,之后又挂了,请问有哪些原因会造成这个情况?
服务器内存不够、服务器超出负载、并发量太大、遇到恶意攻击
如何看待自动化和手动测试?怎样的一个比例才是健康的?
自动化适合做为回归测试的主要方式,新上线的功能一般都是用手动测试方式,一些极端和用户习惯操作还是手动测试比较方便。尽可能线上稳定的功能模块都做成自动化,提供效率
你们公司的自动化投入产出比怎样?效益怎样?
自动化主要作为回归测试,减少测试时间。UI自动化么有弄,基本找不到bug 。
完整运行一次自动化用例需要多久时间?
主要跑的是业务流,所以跑一次需要半个小时左右
什么是分层自动化?
金字塔结构, 最底层UnitTest,往上接口API/集成起来的service, 最上面UI自动化
你的测试数据是怎么准备的?
提前准备好,在代码里的yaml文件
测试脚本的维护成本是怎么样的?
业务不变的情况下,一般脚本都是不坏不动的
请写出冒泡排序。
1 #冒泡排序:n*n 2 def bubbleSort(array): 3 maxindex = len(array)-1 4 maxValue = array[maxindex] 5 k=0 6 while maxindex: 7 for i in range(1,maxindex): 8 if array[i-1]>array[i]: 9 temp = array[i] 10 array[i] = array[i-1] 11 array[i-1] = temp 12 k+=1 13 maxindex -=1 14 print(k) 15 return array
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个最大的数,用最优解。
#快速排序:最快的n*logN def qiuckSort(list): if len(list)<2: return list mid = list[0] left = [i for i in list[1:] if i <= mid] right = [i for i in list[1:] if i > mid] finallyList = qiuckSort(left)+[mid] + qiuckSort(right) return finallyList array = [3, 0, 1, 832,23,45, 5, 5, 6,46, 9, 56, 897] print(qiuckSort(array)[-4:])
写一段程序,删除字符串a中包含的字符串b,举例 输入a = "asdw",b = "sd" 返回 字符串 “aw”,并且测试这个程序。
def delBString(a,b): if not isinstance(a,str): raise TypeError("a is not str") if not isinstance(b,str): raise TypeError("b is not str") if len(a) < len(b): raise Exception('a length must large to b length') result = [] flag = False i=0 la = len(a) lb = len(b) while i <la: j = 0 while j < lb: if i+j < la and a[i+j] == b[j]: j += 1 else : j += 1 flag = False break flag = True if flag: i += lb else: result.append(a[i]) i += 1 return "".join(result)
测试用例:
class TestdelInnerStringFunctions(): def setUp(self): pass def tearDown(self): pass def test_nomorl1(self): assert delBString('asdqwe','we') == 'asdq' def test_nomorl2(self): assert delBString('asdqwe','0') == 'asdqwe' def test_nomorl3(self): assert delBString('测试asdqwe','we') == '测试asdq' def test_nomorl4(self): assert delBString('测试asdqwe','测试') == 'asdqwe' def test_nomorl5(self): assert delBString('asdqwe','') == 'asdqwe' def test_nomorl6(self): with pytest.raises(TypeError): delBString('', 0) def test_nomorl7(self): with pytest.raises(TypeError): delBString(0, 'as') def test_nomorl8(self): with pytest.raises(TypeError): delBString(True) def test_nomorl9(self): with pytest.raises(Exception) as excinfo: delBString('acd','acde') assert "a length must large to b length" in str(excinfo.value) assert excinfo.type == Exception
写一个方法,把字符串转为数字,比如 str="1234",变成 int 1234。并且测试这个程序。
def StrToInt(a): res ,mult,flag = 0,1,1 if not isinstance(a,str): raise TypeError("a is not str") if a[0] =='-' or a[0] == '+': if a[0] == '-': flag = -1 a = a[1:] for i in range(len(a)-1,-1,-1): if '9' >=a[i] >= '0': res +=(ord(a[i]) -48) * mult mult = mult *10 else : return 0 return res * flag def test_strToInt2(self): with pytest.raises(TypeError): StrToInt(34)
测试用例:
def test_strToInt3(self): assert StrToInt('测试赛') == 0 def test_strToInt4(self): assert StrToInt('+2147689') == 2147689 def test_strToInt5(self): assert StrToInt('45') == 45 def test_strToInt6(self): assert StrToInt('1a33') == 0 def test_strToInt7(self): assert StrToInt('-5') == -5
什么是面向对象编程?
面向对象编程 就是把具有共性的事务抽象成属性和方法来进行编程
Thread 类中的start() 和 run() 方法有什么区别?
start()方法可以用来启动线程,调用该方法,会创建一个新的线程,然后内部执行run()方法;不能多次调用,否则会抛异常
直接调用run()方法,不会创建新的线程;可以进行多次调用
说下左连接和右连接
比如有两张表 A,B。左连接是把符合条件的所有A表的内容列出来,B表如果没有内容匹配用NULL代替。
右连接是符合条件的所有B表的内容列出来,A表如果没有内容匹配用NULL代替
介绍下什么是索引
索引是由表或者视图中的一列或多列生成的键,可以加快在表或者视图中检索行的速度
【转】龚十一