这种题目,考的就是你的软性能力,比如表达能力,理解能力,协调能力,一个词概括就是套路。这类题目会在面试开始热身的时候,问一道两题,不会多,但是如果你能回答的有条不紊,清晰达意,那么就会给面试官留下非常好的印象,大致的题目如下:
自我介绍
我叫XXX,毕业于XXX,从事测试行业已经XX年,我擅长接口测试自动化,测试框架,巴拉巴拉,我共服务过X个公司分别有Y个成就,江湖人称666.总之,尽量用简介的语言突出自己的优点,要保持humble,就像我介绍的这样,嗯:)
介绍下你负责的公司项目
我主导了XXX,协助了YYY,参与了ZZZ。这个回答你要记清楚,后续的面试肯定还有项目细节,甚至技术实现细节。同类的项目说一个足以,重点突出不同技术栈或者有管理,对外沟通的项目
你有什么优点和缺点?
实际情况作答,比如优点是长的好看,缺点是太好看之类的,总之,要谦虚,不要傲。
在同一个项目组内,你认为你怎么做会比另外一名测试更加优秀?
我个人认为这个题目很有迷惑性,如果你只追求比别人优秀,肯定很难跟别人合作,如果你没有别人优秀,那么我为什么要用你?要我答的话,我重点会放在如何一点一滴积累技术实力,及用这些实力解决项目组存在的问题上,这实际上也是很多优秀测试人员的必备素质
你为什么离开上家公司?离职原因(这个会在最后问)
二、测试理论基础题这类题目就是考测试工程师的基本能力了,比如测试计划,测试流程,如何bug,你做过哪些测试,一般我们认为这些能力做的再好都是应该的,不会有加分,但是只要做的不好,那就是个不合格的测试工程师了。这种题目也不会问的太多,大概
题目如下:请描述下你上个公司的测试流程?
请描述下bug的几个要素?
ID,Summary,reproducesteps,Priority,Assignto,Sprintinfo,fixversion(duedata)等等。这道题我好想回答一句,jira里都有,你自己不会看呀:)
白盒和黑盒的区别,你是怎么运用的?
你是如何做测试分析?
这题是考察测试思维,一个应用/功能如何测试的问题,我的原则是确定需求,先定性后定量。具体来说,定性,哪些是显性需求?那些是隐性需求?功能在scope吗?性能?可靠性?安全性?兼容mobile平台吗?定量就是,功能要测,那么有哪些功能,每个功能点是什么,入口是什么,出口是什么,precondition是什么,数据哪里构造等等。重复上述操作直到分析完成
如何设计测试用例?什么样子的测试用例是好用例?
功能测试在beta版本对外的上线标准是什么?
貌似业界对beta的定义不太统一,有人说这个是A/B测试的一种,但一般认为专业测试人员完成后,有部分用户参与的一轮测试即beta测试。一般测试环境为用户实际应用环境,目标在于要求用户使用发现不合理,不符合实际情况的问题,然后改进。功能上线标准每个公司不一样,大致如下:1.所有功能点(需求)都被用例覆盖到了2.所有用例执行过至少一遍3.所有发现的bug被修复并验证,做过regression了。4.不能修复的记录了/关闭了/knownissue了。5.bug曲线区域平稳了
本人认为此类问题属于淘汰题,一个问题回答不上来或者深度不够,直接闲聊然后结束面试。
三、测试管理题这类题目就是考验你作为测试leader或者测试负责人的管理能力了。如果项目周期很短,测试人力匮乏,你是怎么协调的?
范围不变,赶工/增加人手,快速跟进/并行开始任务。范围能变,砍低优先级用例,缩小测试范围。
描述下你团队的测试分工
实话实说,比如:干活是不可能干活的,这辈子都不可能干活的,做管理又不会做,就是颜值这种东西,才能维持得了团队这样子。
对于团队成员,你是如何打kpi的?
没钱没颜你速去,童颜巨你快来这样子。我一般看三点:1.出活2.持续出活3.持续精彩的出活
你是如何做应用的兼容性测试的?
请讲出客户端下3个常用的性能指标的名称与具体含义?
iOS应用和Android应用测试有什么侧重点?
请讲诉移动应用的灰度是怎么做的?
实践题应用的闪退通常是什么原因造成的?如果应用闪退,Android和iOS上是分别怎么抓取日志的?
一般闪退原因如下:1.内存超载2.后端服务或动态链接库未找到3.应用初始化时无法正确读取到用户数据。4.系统兼容问题。日志抓取的话,iOS:1.通过iTunesConnect(ManageYourApplications-ViewDetails-CrashReports)获取用户的crash日志2.通过Xcode从你的设备上获得崩溃日志3.自己在程序中添加崩溃捕捉代码,如果应用集成第三方SDK,如百度统计Android:1.通过集成第三方SDK,如百度统计、友盟统计等2、发版时使用加固工具,他们也会收集错误日志,如360加固3、在程序中添加程序异常崩溃的捕捉代码,保存到本地文件中
请简述移动应用在升级安装时候应该考虑的场景?
实际上跟CS架构的升级没什么两样:1.APP有新版本时,打开APP是否有更新提示。2.当版本为非强制升级版时,用户可以取消更新,老版本能正常使用。用户在下次启动app时,仍能出现更新提示。3.当版本为强制升级版时,当给出强制更新后用户没有做更新时,退出APP。下次启动app时,仍出现强制升级提示。4.不删除APP直接更新,检查是否能正常更新,更新后能否正常工作。5.删除老的APP,重新下载APP,能不能正常工作。6.不删除APP直接更新,检查更新后的APP和新安装的APP提供的功能一样。7.检查在线跨版本升级能否成功,版本过老是否提示用户重装。8.更新成功后,用户数据有没有丢失,各个配置项是否还原。
给你一个应用,请简述你会从哪些方面去测试?
一般答分类,分类如下:安装/卸载测试,UI,功能,性能,安全,兼容,易用,可移植性。切忌东答一下,西答一下。
先假设一个需求,征得面试官同意,在这个既定需求下说你的用例,还是那个思想,定性,定量分类,不展开了,测试用例设计算基本功吧,考察的无非是功能的全面性,边界/异常条件下的处理,性能/安全。主要是有测试思维/结构化思维,设计的用例要系统,不能想起那个说那个。
如果让你来测试扫码支付,你会考虑哪些场景?
同上,不赘述
对中高级测试而言,实践题也是淘汰题,一项卡壳没有后续,但如果在细节上有疏忽,可以网开一面,进入下个环节
请问你们公司是如何做接口测试的?
累死我了,题要做吐了。接口测试实际跟一般测试不同就是测试用例的设计部分。1.接口规范拿到。2.设计接口测试功能用例(主要从用户角度出发看接口能否实现业务需求,用例设计就是黑盒用例那一套)。3.各种入参验证(正常情况,异常情况包括输入参数个数不对,类型不对,可选/必选,还有考虑参数有互斥或关联的情况)。4.接口返回值各种验证(符合接口文档需求)5.了解接口实现逻辑,实现逻辑覆盖(语句/条件/分支/判定/。。。。。)6.接口能并发执行吗6.采用工具或者自写代码来验证,HTTP接口一般SoapUI,Jmeter,Fiddler,Postman等都能验证,自己写更好。webservice接口一般要写代码来调用。根据测试用例自动化。7.发现问题跟功能测试一样,该报bug报bug,该跟踪状态跟踪状态
接口测试质量评估标准是什么?
压力测试和负载测试的区别
一个(压力测试)把最后一根稻草仍你身上,一个(负载测试)就剩最后一根稻草没仍,或者仍给你指定数目稻草。
服务器中一般要监控哪些数据,如何监控的,怎么从监控数据中发现问题?
假设系统A调用系统B,我把B的接口都mock了,进行性能测试,这样有什么好处和坏处?
好处是去掉的依赖,可以在B没有好之前测试A,并且B的任何改动/错误/失效不会影响我测试A坏处是真实性能要比测出来的性能差,性能指标不准确。因为Mock的服务再真也不能代替真实服务
有一天早上打车高峰,滴滴服务端挂了大概30分钟,工程师抢修之后,马上上线,之后又挂了,请问有哪些原因会造成这个情况?
还是考测试思维,一定记得先确认需求,再定性,定量。一般都要反问,服务器是哪个服务器?后端应用服务器?数据服务器?缓存系统服务器?中间件服务器?文件系统服务器?然后面试官说个,不说就自己假定一个,然后第一次挂第二次挂分开说,先问有没有错误码,日志有吗,有就看日志,没有就猜是应用服务器挂了啊,是不是高峰期顶不住这么大并发访问啊?是数据库服务器啊,是不是频繁读写受不了啊,读写有分开吗?同步还是异步啊,把喇叭里。第二次挂,可能更多了,是不是代码弄错了,改坏了,或者把喇叭里。总之套路就是性能测试中可能预见的问题及原因,这个你们google下吧,自己分类总结下。
见仁见智,一切能提高软件质量的方法都应该尝试。兵无常形,符合自己项目实际情况是最好的。当然你要面试自动化测试,肯定是一切稳定了的功能最好全部自动化掉。:)
你们公司的自动化投入产出比怎样?效益怎样?
实话实说,UI自动化测试发现新bug的效益很低,主要用在回归测试上,减少测试工作量。接口测试可就不一样了,可以小步快跑,也可以集团作战。
自动化测试用例的覆盖率多少?
有个50%了不得了吧,一般核心业务里的最高优先级用例100%覆盖,这些用例也是用来跑冒烟的。另外的看项目资源了。
Google说它们分钟级或者秒级别,为毛我们都是小时级别:(
什么是分层自动化?
金字塔结构,最底层UnitTest,往上接口API/集成起来的service,最上面UI自动化
你的测试数据是怎么准备的?
当然是提前准备的了:)写在脚本里/外部文件(excel,XML)/数据库,逼格逐级提升
测试脚本的维护成本是怎么样的?
两个原则:1.不坏就不要修2.终身追责,谁污染谁治理
啊啊啊,已经两个小时了,要抓狂了。ID,Clas,CSS,XPath,jquery脚本,总之能不麻烦开发就不麻烦开发。
请问如何实现用例失败或者异常时候需要截图?
框架自带,python+webdriver里是get_screenshot_as_file,一般写一个装饰器,放在要执行的类上,try,catch下。
请问如何分布式执行webdriver用例?
两种策略:1.利用Jenkins等,部署部分代码到多个机器上执行2.RemoteWebDriver
如何在脚本中执行JavaScript代码?
使用Appium-Python-Client情况下,除了以下常规八种定位方式外:driver.find_element_by_id()–元素的resrouce-id属性driver.find_element_by_AccessibilityId()–content-desc属性,替代以前的name。driver.find_element_by_xpath()–比css定位慢driver.find_element_by_class_name()–元素的class属性driver.find_element_by_css_selector()driver.find_element_by_link_text()–链接元素的全部显示文字driver.find_element_by_tag_name()–元素的标签名driver.find_element_by_partial_link_text()–链接元素的部分显示文字
iOS和Android上还有独特的定位方法:
请简述Appium的原理
真想跟面试官说,您能帮忙打开官网吗?Appium对iOS和Anroid的实现原理不尽相同,并且对同一个平台不同操作系统版本的实现原理也不相同。
我倾向大家往简单了说:1.Appium是C/S架构的,更像是一个proxy,连接其被测移动平台和测试脚本。2.appium是基于webdriver协议添加对移动设备自化api扩展而成的。网上有个很清晰的图,截图如下:
iOS和Android的UI自动化的原理是什么?
上面已经答了,如下:iOS9.3andabove:Apple’sXCUITestiOS9.3andlower:Apple’sUIAutomationAndroid4.2+:Google’sUiAutomator/UiAutomator2Android2.3+:Google’sInstrumentation.(Instrumentationsupportisprovidedbybundlingaseparateproject,Selendroid)
当定位策略都失败的时候,你该怎么做?
80%是你元素定位的不对,那么多定位方法,一个不行换另外一个,直接不能定位,先定位父元素,再循环找子元素。一般来说XPATH都能定位到,无非是可阅读性不强。真的全部失效,请求开发帮你改个元素属性好了。这题其实还是”测试sense”问题,扩大点变成了怎么解决工作中困难。反正别认怂,最好甭废话,直接开干。
请问Monkey测试的优缺点?
没接触过,此题不会
如果使用monkey发现了一个毕现闪退,请问怎么使用monkey重现它?
同上
Jmeter你用jmeter做什么测试?
接口,性能。
———-最后,来点硬题,嚯嚯嚯!———-七、硬题所谓硬题就是答案一般都是固定或者标准的,答案也不会模棱两可,包括:算法,编程,sql,linux算法:请写出冒泡排序
1
2
3
4
5
6
7
8
9
本来以为很简单,写了一下,2位数能算出来结果,3位数会报递归次数太多,觉得蹊跷,仔细一查,尼玛这题大有来历,我跪的心服口服。经过查找资料,解答如下:
1位数:0~9
个位数为3:3,共1次。
故0~9之间,3的个数为1
2位数:10~99
个位数是3:13,23,33...93,共9个。
十位数是3:30,31,....39.共10个。
故0~99之间,3的个数为1+9+10=20个
3位数:100~999
个位数是3:
103,113,....193共10个。
203,213,....293共10个。
。
903,913,....993共10个。
一共9×10=90次。
十位数是3:
130,132....139共10个。
230,232....239共10个。
930,931,....939共10个。
百位数是3:300,301,....399共100个。
故0~999之间,3的个数为20+90+90+100=300次
也可以这样考虑:
0~999之间:十位个位共有10个0~99(解释0~99,100~199,。。。900~999),故有10*20=200次,而百位为1的有100次,共200+100=300次
300=10*20+100
4位数:0~9999
1003,1013,1023,。。。1093共10个
1103,1113,1123,。。。1193共10个
1203.....共10个
1903....共10个
共9个10,我们记为A
还有2003~2903,3003~3903.。。9003~9903还有9个一样的A。
所有一共有10个(A),是10×9×10=900
1030,1031,。。。。。。1039,共10个。
1131~1139,
1231~1239.
。。。
1931~1939,共有10×10个=100个。我们记为B
还有千位数是2开头的,到9开头的,加起来共有9个(B)9×10*10=900个。
百位数是3:
1300,1301,。。。。1399共100个。
2300
.。
9300
共10×100=1000个。
千位数是3:3000,3001,3999共1000次。
故0~9999之间,3的个数为300+900*900*900+1000=4000
0~9999之间:百位十位个位共有10个0~999(0~999,1000~1999,。。9000~9999),故有10*300=3000次,而千位为1的有1000次,共3000+1000=4000次
4000=10*300+1000
规律:
0~9:1
0~99:20=10*1+10
0~999:300=10*20+100
0~9999:4000=10*300+1000
0~99999:50000=10*4000+10000
0~999999:600000=10*50000+100000
f(1)=1
f(2)=10*f(1)+10**1
f(3)=10*f(2)+10**2
f(4)=10*f(3)+10**3
..
f(n)=10*f(n-1)+10*(n-1)
代码如下:
defcount_n_times(digit_number):#传入的是位数
ifdigit_number==1:
return1
ifdigit_number<=0:
return0
return10*count_n_times(digit_number-1)+10**(digit_number-1)
defcount_digit_number(number):#给定是一个数
returnlen(str(number))
print(count_n_times(count_digit_number(999)))
我们再来假设下,如果给你的不是9999而是2345呢?即对于任意给定的数n,怎样能快速得到0~n之间3的个数呢(这就是google的原题了(原题是算1),这题太硬了,我啃了几个小时了,不啃了..)
从一个数组中找出前4个最大的数,用最优解。
这个就是排序问题了吧,我想法先排好序,在取前4个,那么多排序,冒泡啊,选择啊,快排啊。。这里面快排最快,用大O算法O(n*logn)。
思想:
少于2个元素的数组不需要排序
找一个元素作为基数
小于基数的放一个数组
大于基数的放一个数组
针对小于基数的数组做快速排序,暂且叫low
针对大于基数的数组做快速排序,暂且叫high
最终排序后的low+【基数】+high,就是排好序的数组
defquicksort(l):low=[]high=[]iflen(l)<2:returnlelse:base=l[0]foriinrange(1,len(l)):ifbase print(sorted([2,2,1,8,5,7,6])[:4]) (据说python里sorted实现也是快排,没有经过求证。) 哈哈,这样,面试官会不会鄙视我:) 写一段程序,删除字符串a中包含的字符串b,举例输入a=“asdw”,b=“sd”返回字符串“aw”,并且测试这个程序。 把一切看成对象,三大特性继承,封装,多态 讲下Java多线程的使用 有三个线程T1,T2,T3,怎么确保它们按顺序执行? 在主线程中,每一个线程start()后立即join() Thread类中的start()和run()方法有什么区别? 个人理解start()会启动线程,然后调用run(),run()方法一般要重写。网上资料:调用start()后,线程会被放到等待队列,等待CPU调度,并不一定要马上开始执行,只是将这个线程置于可动行状态。然后通过JVM,线程Thread会调用run()方法,执行本线程的线程体。先调用start后调用run,这么麻烦,为了不直接调用run?就是为了实现多线程的优点,没这个start不行。 1.start()方法来启动线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码;通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有运行。然后通过此Thread类调用方法run()来完成其运行操作的,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程终止。然后CPU再调度其它线程 2.run()方法当作普通方法的方式调用。程序还是要顺序执行,要等待run方法体执行完毕后,才可继续执行下面的代码;程序中只有主线程——这一个线程,其程序执行路径还是只有一条,这样就没有达到写线程的目的。记住:多线程就是分时利用CPU,宏观上让所有线程一起执行,也叫并发 请写一个线程安全的单例模型 网上搜下吧,java不太熟 SQL: 说下左连接和右连接 比如有两张表A和B。A表B表都有ID列,select*fromAleftjoinBwhereA.ID=B.ID.会把A表所有记录显示,B表里没有和A表ID对应的,会显示NULL。左连接是把符合条件的所有的A表的内容列出来,B表里如果没有内容匹配就用NULL代替。右连接是符合条件的B表的内容全显示出来,A表里没有匹配就用NULL代替。介绍下什么是索引 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 平常没接触过这么大数据量,分批次吧,每次插入1w条,应该没什么压力 给你一张表,根据要求写sql,这个题目比较多,自己百度吧。Linux:你常用的命令是什么? ls,mkdir,cat,vi,pstouch 用什么查看log? watch,tail、cat、tac、head、echo 如何查找一个文件大小超过5M的文件 find.-typef-size+800M常用的参数有:-type:类型。POSIX支持——b:块设备文档、d:目录、c:字符设备文档、P:管道文档、l:符号链接文档、f:普通文档-name:按文件名查找。支持*模糊匹配-size:文件大小。+表示大于,-表示小于。支持k,M,G单位