背景
为了扩展家里领导的测试知识水平和专业知识能力提升,以及为以后更好的面试做基础,特意从众多测试相关题型整理出来,其中的答案仅供参考。
白盒和黑盒的区别,你是怎么运用的?
黑盒测试:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。利用其检查功能是否符合需求说明书,能够正常使用,
白盒测试:已知产品的内部工作过程,可以进行测试证明每种内部操作是否符合设计规格要求,所有内部成分是否经过检查
利用其检查程序模块的内部逻辑走向,主要覆盖程序内的逻辑。
如何设计测试用例?什么样子的测试用例是好用例?
掌握边界值分析、等价类划分、错误推测等方法来设计测试用例
是一个完备的集合,它能够覆盖所有等价类以及各种边界值;需要从软件功能需求出发,全面地,无遗漏地识别出测试需求;最好是代码覆盖测试也全面的测试
功能测试在 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文件
测试脚本的维护成本是怎么样的?
业务不变的情况下,一般脚本都是不坏不动的
请写出冒泡排序。
#冒泡排序:n*n
def bubbleSort(array):
maxindex = len(array)-1
maxValue = array[maxindex]
k=0
while maxindex:
for i in range(1,maxindex):
if array[i-1]>array[i]:
temp = array[i]
array[i] = array[i-1]
array[i-1] = temp
k+=1
maxindex -=1
print(k)
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代替
介绍下什么是索引
索引是由表或者视图中的一列或多列生成的键,可以加快在表或者视图中检索行的速度