面试题
基础知识
1、测试用例的设计方法有哪些?
等价类划分法
将测试的范围划分成几个互不相交的子集,他们的并集是全集,从每个子集选出若干个有代表性的值作为测试用例。然后从每个子集选出若干个有代表性的值:
边界值分析法
长期的测试工作经验告诉我们,大量的错误是发生在输入或输出范围的边界上,而不是发生在输入输出范围的内部。测试用例可以记为min,min+,max,max-。
错误推测法
错误推测法是指:依靠的是经验和直觉,很多时候,我们都会不知不觉的使用到。
判定表法
通过穷举条件获得结果,对结果再进行优化合并,会得到一个判断清晰的策略表。
2、web测试和app测试,测试用例设计思路及考虑面有哪些不同,并简要说明
总的来说测试类型都基本相似。需要注意的就是web和app不同的地方:
比如:安装测试,web端一般没有客户端层面的安装测试,而app存在。所以需要做不同的考虑(包含升级)
交叉事件测试:app使用过程中可能会出现来电,电量不足等外部事件
app操作类型还是触屏、弱网等
3、请描述tcp/ip建立连接的过程
三次握手:首先客户端发送请求报文SYN,服务器接收到请求后回复ACK报文,并为本次连接分配资源,客户端接收到服务器应答后同样发送ACK报文,并分配资源。

四次挥手:断开连接可以由客户端或服务端任意一方断开。假如客户端发起断开连接FIN,服务器收到请求后,发送ACk报文告诉客户端已收到请求,等待后续处理。服务器一段时间内没有数据传输后,在发送FIN包给客户端,此时客户端知道可以关闭连接后,发送ACK包给服务器,我真的关闭连接了。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭。

4、为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
5、进程与线程的区别
进程资源不共享,线程资源共享
6、请写出在linux中,下面操作命令
a、解压一个tar文件,copy到/usr/local下(非root账户)
sudo tar -xzvf /usr/soft/Python-3.7.2.tgz -C /usr/local
b、查看superuser的运行日志,在/var/log/superuser.log
cat /var/log/superuser.log
c、查看占用8080端口的进程
netstat -anp |grep 8080
7、索引的作用?和他的优点是什么
索引能够加快查询速度(缺点增加数据库尺寸)
8、有3个表:s(sno,sname,sex,age,department)学生表 c(cno,cname)课程表 sc(sno,cno,score)选课表
1、查询‘周星驰’同学选修的课程名字
SELECT c.cname FROM s,c,sc where s.sno=sc.sno and sc.cno=c.cno and s.sname='周星驰'
2、查看所有学生的课程表,已课程来分组(存在未选课的学生)
SELECT c.cname,count(*) FROM s,c,sc where s.sno=sc.sno and sc.cno=c.cno group by c.cname
9、编程:数组[1,21,2,5,6,8,9,32,23,78,90,3,5,1,21,9,2,5,1,23]。升序输出出现频次最高的前三位
a=[1,21,2,5,6,8,9,32,23,78,90,3,5,1,21,9,2,5,1,23]
listkey=[]
listvalue=[]
dict = {}
ll = 0
for i in set(a):
listkey.append(i)
listvalue.append(a.count(i))
length=len(listvalue)
while ll<length:
dit={listvalue[ll]:listkey[ll]}
dict.update(dit)
ll+=1
items=dict.items()
backitems=[[v[0],v[1]] for v in items]
backitems.sort(reverse=True)
print(backitems[:3])
10、在 PC 浏览器的地址栏输入一串 URL,然后按 Enter 键这个页面渲染出来,这个过程中都发生了什么事?

GET 和 POST 的区别
1、get传输时有字符长度限制,post没有
2、GET 产生一个 TCP 数据包;POST 产生两个 TCP 数据包。

cookies 机制和 session 机制的区别
1、cookies和session都是一个文件,只是前者存在客户端,后者存在服务器
2、cookies减轻服务器压力,但是不安全,容易存在cookie欺骗
3、session安全,但是占用服务器资源
HTTP 状态码 2xx,3xx,4xx,5xx 分别是什么意思?
200:成功
301:地址重定向
304:上次请求后,没有改变,服务器不会返回资源
400:参数错误
401:未授权
403:请求不允许
404:资源找不到
500:服务器内部错误
http 协议有哪几种请求方式?
get、post、delete、patch、put等
http 和 https 区别?
1、https比http协议更加安全,因为他多了加密和解密的过程
2、https需要ssl证书
HTTP 请求报文与响应报文格式
1、请求报文包含三部分:请求行(http版本信息)、请求头、请求实体
2、响应报文包含三部分:响应状态码,响应头,响应实体
常见的 POST 提交数据方式
application/json、text/xml
什么是 DNS?
域名解析服务,将域名解析成ip地址
什么是 Http 协议无状态协议?怎么解决 Http 协议无状态协议?
1、表示对事务的处理没有记忆能力
2、keep-live,通过cookie,session保存
你平常做接口测试的过程中发现过哪些 bug?
1、bug更多的是错误处理方面不完整
平常你是怎么测试接口的?
1、熟悉接口文档
2、单一接口验证(业务规定场景、异常场景)
3、组合场景验证

没有接口文档如何做接口测试
1、跟开发沟通,自己整理接口文档
2、如果接口是写好了的,直接抓包获取参数,不懂的问开发
在手工接口测试或者自动化接口测试的过程中,上下游接口有数据依赖如何处理?
用一个全局变量来处理依赖的数据,比如登录后返回 token,其它接口都需要这个 token,那就用全局变量来传 token 参数
依赖于第三方数据的接口如何进行测试?
mock
当一个接口出现异常时候,你是如何分析异常的?
1.抓包,用 fiddler 工具抓包,或者浏览器上 f12,app 上的话,那就用 fiddler 设置代理,去看请求报文和返回报文了
2.查看后端日志,xhell 连上服务器,查看日志
如何分析一个 bug 是前端还是后端的?
参照接口文档,看前端的请求报文和参数,有问题就是前端发的数据不对
反之,请求报文没问题,那就看返回报文,返回的数据不对,那就是后端开发的问题
接口自动化
1. json 和字典 dict 的区别?
虽然都是通过key:value表示,但json是一种返回数据的格式。而dict是python的一种数据类型
如:import json
# a 是字典 dict
a = {"a": 1, "b": 2, "c": True}
# b 是 json
b = '{"a": 1, "b": 2, "c": true}'
print(type(a)) print(json.dumps(a))
运行结果
<class 'dict'>
{"a": 1, "b": 2, "c": true}
<class 'str'>
{'a': 1, 'b': 2, 'c': True}
2、测试的数据你放在哪?
1、全局的参数,如账号密码、邮箱配置、数据库连接、都可以写在配置文件里面
2、一次性消耗的数据可以随机函数生成
3、对于反复使用的数据可以放到数据库,每次使用时记得恢复环境
4、多组测试数据可以使用参数化,或者放在json文件里面
3、什么是数据驱动,如何参数化?
1、从字面理解就是数据驱动程序,变的只是数据,程序步骤大致不变
2、可以使用ddt,和parameterized库。在步骤函数前面定义数据参数
4、下个接口请求参数依赖上个接口的返回数据
不同的接口封装成不同的函数或方法,需要的数据 return 出来, 用一个中间变量 a 去接受,后面的接口传 a 就可以了
5、依赖于登录的接口如何处理
登录接口依赖 token 的,可以先登录后,token 存到一个 yaml 或者 json,或者ini 的配置文件里面,后面所有的请求去拿这个数据就可以全局使用了
6、什么是 mock
模拟对象的行为,比如我们常依赖的第三方支付接口,测试过程中不可能真实的支付,而这个时候我们则需要通过mock模拟对象替换系统的部分,并对它们进行断言。
7、mock 能做什么
- 1.前后端联调,如果你是一个前端页面开发,现在需要开发一个功能: 下一个订单,支付页面的接口,根据支付结果,支付成功,展示支付成功页,支付失败,展示支付失败页。
要完成此功能,你需要调用后端的接口,根据返回给你的结果,来展示不同的页面。此时后端接口还没开发好,作为一个前端开发总不能等别人开发好了,你再开发,那你只有加班的命了。
为了同步开发完成任务,此时,你可以根据接口文档的规定,把接口的地址和入参传过去,然后自己 mock 接口的不同返回界面,来完成前端的开发任务
- 2.单元测试,单元测试的目的是测试某个小小单元的功能,但现实中开发的函数或方法都是有依赖关系的,比如 b 函数的参数,需要调用 a 函数的返回结果,但是我前面已经测试 a 函数了
这种情况下,就不需要再测一次 a 函数了,此时就可以用 mock 模块来模拟调用这部分内容,并给出返回结果
- 3.第三方接口依赖,在做接口自动化的时候,有时候需要调用第三方的接口,但是别人公司的接口服务不受你的控制,有可能别人提供的测试环境今天服务给你开着,别人就关掉了,
给自动化接口测试带来很多的麻烦,此时就可以自己写一个 mock-server 来模拟接口的返回数据
seleniumUI自动化
1、如何操作隐藏元素
使用js,如:js='document.getElementById("ele").click()' dr.execute_script(js);
2、如何判断一个页面上元素是否存在?
可以使用WebDriverWait和expected_conditions
如:ele=WebDriverWait(dr,5,0.5).until(EC.element_to_be_clickable((By.ID,'kw'))) ele.send_keys('selenium')
3、如何提高脚本的稳定性
少使用sleep,可以使用隐式等待
定位元素尽量使用相对路径
使用po设计模式,元素操作和元素定位分离,提高脚本实用性
4、如何定位动态元素
可以通过定位父元素,或使用其他不变的属性
5、如何通过子元素定位父元素
定位后直接.parent(不过只能定位,不能获取属性也不能操作)。还可以通过 xpath 的语法直接定位:.//*[@name="heo"]/.. 两个点..就是代表父级元素了
6、平常遇到过哪些问题?如何解决的
主要是元素定位不够深、还有表单问题无法定位。还有就是前端代码的坑
7、一个元素明明定位到了,点击无效(也没报错),如果解决?
使用js
app
1、什么是 activity
Activity 是 Android 的四大组件之一,也是平时我们用到最多的一个组件,可以用来显示 View。
同时它提供屏幕进行交互。每个 Activity 都会获得一个用于绘制其用户界面的窗口。
2. Activity 生命周期?
运行、暂停、停止、系统回收
3、 Android 四大组件
Activity、BroadcastReceiver 广播接收器、ContentProvider 内容提供者、Service 服务。
4、 app 测试和 web 测试有什么区别?
从流程上来说,没有区别。都需要经历测试计划方案,用例设计,测试执行,缺陷管理,测试报告等相关活动。
从技术上来说,WEB 测试和 APP 测试其测试类型也基本相似,都需要进行功能测试、性能测试、安全性测试、GUI 测试等测试类型。
他们的主要区别在于具体测试的细节和方法有区别,比如:性能测试,在 WEB 测试只需要测试响应时间这个要素,在 App 测试中还需要考虑流量测试和耗电量测试。
安装测试:WEB 测试基本上没有客户端层面的安装测试,但是 App 测试是存在客户端层面的安装测试,那么就具备相关的测试点。
还有,App 测试基于手机设备,还有一些手机设备的专项测试。如交叉事件测试, 操作类型测试,网络测试(弱网测试,网络切换)
交叉事件测试:就是在操作某个软件的时候,来电话、来短信,电量不足提示等外部事件。
操作类型测试:如横屏测试,手势测试
还有升级测试:升级测试的提醒机制,升级取消是否会影响原有功能的使用,升级后用户数据是否被清除了
5、android 和 ios 测试区别?
系统版本:Android 较多,ios 较少且不能降级,只能单向升级;新的 ios 系统中的资源库不能完全兼容低版本中的 ios 系统中的应用,低版本 ios 系统中的应用调用了新的资源库,会直接导致闪退(Crash)
分辨率:分辨率测试,Android 端 20 多种,ios 较少;
安装卸载测试:Android 的下载和安装的平台和工具和渠道比较多,ios 主要有 app store,iTunes 和 testflight 下 载
6、app 出现 ANR,是什么原因导致的?
1.耗时的网络访问
2.大量的数据读写
3.service忙导致超时无响应
4.其他线程持有锁,导致主线程等待超时
5.其它线程终止或崩溃导致主线程一直等待
7. App 出现 crash 原因有哪些?
1.内存管理错误:可能是可用内存过低,app 所需的内存超过设备的限制,app 跑不起来导致 App crash。或是内存泄露,程序运行的时间越长,
所占用的内存越大,最终用尽全部内存, 导致整个系统崩溃。亦或非授权的内存位置的使用也可能会导致 App crash。
2.程序逻辑错误:数组越界、堆栈溢出、并发操作、逻辑错误。
e.g. app 新添加一个未经测试的新功能,调用了一个已释放的指针,运行的时候就会 crash。
3.设备兼容:由于设备多样性,app 在不同的设备上可能会有不同的表现。
4.网络因素:可能是网速欠佳,无法达到 app 所需的快速响应时间,导致 app crash。或者是不同网络的切换也可能会影响 app 的稳定性。
8、app 对于不稳定偶然出现 anr 和 crash 时候你是怎么处理的?方法一:app 开发保存错误日志到本地
一般 app 开发在 debug 版本,出现 anr 和 crash 的时候会自动把日志保存到本地实际的 sd 卡上,去对应的 app 目录取出来就可以了
方法二:实时抓取
当出现偶然的 crash 时候,这时候可以把手机拉到你们 app 开发那,手机连上他的开发代码的环境,有 ddms 会抓日志,这时候出现 crash 就会记录下来日志。尽量重复操作让 bug 复现就可以了
9、你平常会看日志吗, 一般会出现哪些异常(Exception)NullPointerException - 空指针引用异常
ClassCastException - 类型强制转换异常。
IllegalArgumentException - 传递非法参数异常。
ArithmeticException - 算术运算异常
ArrayStoreException - 向数组中存放与声明类型不兼容对象异常
IndexOutOfBoundsException - 下标越界异常
10、 app 的日志如何抓取?
app 本身的日志,可以用 logcat 抓取
ubantu安装:
https://blog.csdn.net/xiaohua0877/article/details/78507631
http://releases.ubuntu.com/bionic/
http://www.testclass.net/docker/02-install/
https://www.cnblogs.com/fnng/p/8358326.html
https://blog.csdn.net/colin_lisicong/article/details/70193539
https://www.cnblogs.com/fnng/archive/2013/05/29/3106515.html
https://www.cnblogs.com/fnng/p/8439359.html
https://www.cnblogs.com/fnng/p/8358326.html
分析需求-查看接口文档-接口参数化(如连接数据库或读取CSV文件)-设计测试用例-发送请求(前置处理)-返回结果(后置处理)-断言-输出测试报告
7.测试手机app和支付需要注意什么?看xmind
13.如何开展接口测试:
分析需求-查看接口文档-接口参数化(如连接数据库或读取CSV文件)-设计测试用例-发送请求(前置处理)-返回结果(后置处理)-断言-输出测试报告
18:如何设计用户注册的测试用例?
功能上:数据和参数正常:用户名、密码正确且未被使用;数据或参数异常:用户名、密码参数异常、数据异常;非法字符校验(业务上);用户名密码参数正确但已经被使用;
19.常见app性能测试指标
响应时间、内存、CPU、每秒点击数、电量、流量、滑动速度、页面切换、与服务器的交互网速;
一、内存:使用adb shell脚本进行测试,查看log数据,adb shell dump meminfo
二、CPU:使用adb shell脚本进行测试,查看log数据,adb shell top
系统持续运行及操作过程中,内存不能一直增加,不然系统会自动kill掉该进程;
三、流量监控:可以借用网易的开源工具:Emmagee
四、电量监控:和竞品做对比测试,同一机型的测试机在不同时间,不同网络条件,不同功能使用下,分别测试电量使用情况;
掌握测试相关的理论知识,能够根据需求文档、用例故事或者界面设计等资料设计出合理的测试用例;
熟悉loadrunner,jmeter或其它性能测试工具、接口测试工具,熟悉抓包工具fiddler、Charles至少一种,有客户端和web端测试经验,客户端为主,熟练使用bug管理工具,提交和跟踪缺陷
selenium工作原理:
selenium
appium工作原理:
appium 在android端工作流
-
client端也就是我们 test script是我们的webdriver测试脚本。
-
中间是起的Appium的服务,Appium在服务端起了一个Server(4723端口),跟selenium Webdriver测试框架类似, Appium⽀持标准的WebDriver JSONWireProtocol。在这里提供它提供了一套REST的接口,Appium Server接收web driver client标准rest请求,解析请求内容,调⽤用对应的框架响应操作。
-
appium server会把请求转发给中间件Bootstrap.jar ,它是用java写的,安装在手机上.Bootstrap监听4724端口并接收appium 的命令,最终通过调⽤用UiAutomator的命令来实现。
-
最后Bootstrap将执行的结果返回给appium server。
-
appium server再将结果返回给 appium client

浙公网安备 33010602011771号