测试宝典
测试宝典
经典用例设计(纸杯、购物车、电梯、登录框、多部电梯具有联动性、视频播放器测试点,三角形的测试设计点、朋友圈点赞的测试用例的设计点、视频播放器测试点、微信发红包)
如何测试一个杯子
功能测试
- 能否装水,
- 除了装水, 能否装其他液体。比如可乐,酒精
- 能装多少ML的水
- 杯子是否有刻度表
- 杯子能否泡茶,跑咖啡
- 杯子是否能放冰箱,做冰块
- 杯子的材质是什么(玻璃,塑料,黄金做的)
界面测试
- 外观好不好看。
- 什么颜色
- 杯子的形状是怎么样的。
- 杯子的重量是多少
- 杯子是否有异味
- 杯子的图案是否合理
性能测试
- 能否装100度的开水
- 能否装0度冰水
- 装满水,放几天后,是否会漏水
- 杯子内壁上的涂料是否容易脱落。
- 杯子上的颜色是否容易褪色或者脱落
- 被一个大人压下,是否会碎
安全性测试
- 制作杯子的材料,是否有毒
- 放微波炉里转的时候,是否会爆炸, 或者杯子是否会熔化。
- 从桌子上掉到水泥地上是否会摔碎。
- 杯子是否容易长细菌
- 杯子是否有缺口,会划坏嘴巴
- 杯子内壁上的材料,是否会溶解到水中
- 杯子破碎后,是否会对使用者造成伤害
可用性测试
- 杯子是否容易烫手
- 杯子是否好端,好拿
- 杯子的水是否容易喝到
- 杯子是否有防滑措施
一个身份证号码输入框,怎么设计用例?
校验身份证号规则的有效性(包括地址码、生日期码、顺序码和校验码校验15位身份证号和18位身份正好都是可用的校验末位是X的情况校验不足15位、16-17位和大于18位的情况如果是必输项,校验不输入的时候会不会有正确的提示如果不是必输项,则要校验不输入的时候流程能否正常进行校验输入非数字的情况,是否会有正确提示信息(包括大小写字母、汉字、特殊字符和标点符号)校验输入全角的数字的时候,系统是否会识别(这个得根据需求确定是否可以使用全角的数字)
登录功能怎么设计测试用例?
具体需求:
有一个登录页面,有一个账号和一个密码输入框,一个提交按钮。
功能测试
1、输入正确的账号和密码,点击提交按钮,验证是否能正确登录。(正常输入)
2、输入错误的账号或者密码,验证登录会失败,并且提示相应的错误信息。(错误校验)
3、登录成功后能否跳转到正确的页面(低)
4、账号和密码,如果太短或者太长,应该怎么处理(安全性,密码太短时是否有提示)
5、账号和密码,中有特殊字符(比如空格),和其他非英文的情况(是否做了过滤)
6、记住账号的功能
7、登录失败后,不能记录密码的功能
8、账号和密码前后有空格的处理
9、密码是否加密显示(星号圆点等)
10、牵扯到验证码的,还要考虑文字是否扭曲过度导致辨认难度大,考虑颜色(色盲使用者),刷新或换一个按钮是否好用
11、登录页面中的注册、忘记密码,登出用另一帐号登录等链接是否正确
12、输入密码的时候,大写键盘开启的时候要有提示信息。
13、什么都不输入,点击提交按钮,看提示信息。(非空检查)
界面测试
1、布局是否合理,2个Testbox和一个按钮是否对齐
2、Testbox和按钮的长度,高度是否符合要求
3、界面的设计风格是否与Ul的设计风格统一
4、界面中的文字简洁易懂,没有错别字。
性能测试
1、打开登录页面,需要几秒
2、输入正确的账号和密码后,登录成功跳转到新页面,不超过5秒
安全性测试
1、登录成功后生成的Cookie是否有HttpOnly(降低脚本盗取风险)
2、账号和密码是否通过加密的方式,发送给Web服务器
3、账号和密码的验证,应该是用服务器端验证,而不能单单是在客户端用javaScript验证
4、账号和密码的输入框,应该屏蔽SQL注入攻击
5、账号和密码的输入框,应该禁止输入脚本(防止XSS攻击)
6、错误登录的次数限制(防止暴力破解)
7、考虑是否支持多用户在同一机器上登录
8、考虑一用户在多台机器上登录
可用性测试
1、是否可以全用键盘操作,是否有快捷键
2、输入账号,密码后按回车,是否可以登录
3、输入框是否可以以Tab键切换
兼容性测试
1、主流的浏览器下能否显示正常已经功能正常(IE6-11,FireFox.Chrome,Safari等)
2、不同的平台是否能正常工作,比如Windows,Mac
3、移动设备上是否正常工作,比如iPhone,Android
4、不同的分辨率
本地化测试
1、不同语言环境下,页面的显示是否正确。
测试一个电梯设计测试用例
界面测试
查看电梯外观,按钮位设计是否合理、大方、美观,是否有温馨提示的标语。
是否有检修标牌和紧急求助联系方式。
功能测试
1.测试电梯能否实现正常的上升和下降功能。
2.电梯的按钮是否都可以使用。
3.电梯门的打开,关闭是否正常。
4.报警装置是否可用。
5.与其他电梯之间是否协作良好。
6.通风状况如何。
7.突然停电时的情况。
8.上升途中的响应。
1)电梯本来在1楼,如果有人按18楼,那么电梯在上升到5楼的时候,有人按了10楼,这时候是否会在10楼先停下来;
2)电梯下降到10层时显示满员,此时若8层有人等待电梯,是否在8层停。
安全性
1.门关上的一刹那出现障碍物。
2.同时按关门和开门按钮。
3.点击当前楼层号码。
4.多次点击同一楼层的号码等等。
5.同时按上键和下键会怎样。
易用性
1.电梯的按钮的设计符合一般人使用的习惯吗
效率(性能方面、压力测试方面)
1.看电梯运行速度是否在符合需求(既快又安全)
2.看电梯的最大限度的承受重量.在负载过重时是否有提醒。
3.在一时间内不断的让电梯上升,下降。
4.最大负载下平稳运行的最长时间。
测试一个网上购物的购物车
界面测试:
打开页面后,页面的布局是否合理,显示是否完整;
.鼠标浮动在购物车按钮,迷你购物车界面显示是否正常;
不同卖家的商品在不同的table区域显示,区分明显;
.页面的tooltips能正常显示;
功能测试:
所有页面链接功能正常,可以点击到正确页面;
·页面关联本地软件阿里旺旺的icon点击后,能打开软件;
从商品信息页面添加的商品能显示在购物车中;
购物车页面打开的同时,在其他页面添加了商品,购物车页面刷新后,新的商品能显示;
若未登录,点击购物车,则提示用户输入用户名和密码,或者提示其他的非注册用户购物方式;
商品未勾选的状态下,结算按钮是灰色无法点击的;
勾选商品后,已选商品的总价会显示,结算按钮变高亮可点击工作;
勾选商品,点击结算按钮后,进入确认订单信息页面;
购物车页面中,可以对添加的商品信息做信息的修改,并自动保存成功;
卖家在线的时候,旺旺icon高亮,反之,灰色;
购物车有商品降价或者库存告急的,那么点击对应的tab,降价或者告急商品会归类后显示;
购物车能添加的商品种类是有数量上限的;
不要的商品,可以删除;
(其他特有的功能不做赘述,只讨论常见通用功能)
若商品已经失效,购物车的商品是否可以继续结算
已进入支付界面但支付未成功,重新进入购物车,又重新添加了一些物品,则原有的物品是否能正确保留;
(感觉这个还挺关键,经常是没完成支付,又添加了一些物品,最后再一起支付)
性能测试
打开购物车页面要多久;
可用性测试:
快捷键功能是否支持
兼容测试:
不同浏览器上的测试功能是否正常;
app上测试
多部电梯具有联动性的测试用例
功能测试:
测试电梯能否实现正常的上升和下降功能,每层是否都可以停靠。
每层停靠楼层是否与所按的楼层一致
电梯按键在按下时是否点亮按键灯
电梯在每个楼层的上行和下行的申请是否可以有效
电梯满负载的时候,是否会忽略其他楼层外部的上行和下行申请
电梯的两边按钮是否都可以使用,三列按钮。
电梯的楼层选择是否可以取消
电梯门的打开,关闭是否正常关闭(自动关闭)。
报警装置是否可用。(满载)
超重时是否能强制关门
超重时重新挪动一下人员是否可以上下行
与另外一部电梯之间是否协作良好。(算法)
电梯的灯光是否满足看书的要求
联系外界的电话是否可用
通风状况如何,人多的时候是否会很热,通风不畅(排气扇)
电梯里面的摄像头是否可用,拍摄是否清晰
门不夹人
伸手的话,应该不会强制关门
管理员可以和内部人通话
在各种场合下,可以强制开门
运行中时,不能按开门键,不会强制开门
在不同情况下(如:有人挡着、马上关门的时候、停电的时候、没有请求的时候…),一直按开门键和关门键
从电梯外部可以强制开门
不同温度下的测试
进入电梯,拨打手机,是否有信号
进入电梯喊话,外面是否能听到
楼层显示屏显示的楼层、以及电梯运行升降状态是否正确
两台电梯能否同时使用(或停用)
其中一台使用,另一台是否可以停用
A电梯按上行,B电梯按上行
A电梯按上行,B电梯按下行
A电梯按上行,B电梯按上下行
A电梯按上行,B电梯按下上行
A电梯按下行,B电梯按下行
A电梯按下行,B电梯按上下行
A电梯按下行,B电梯按下上行
A电梯按上下行,B电梯按上下行
A电梯按上下行,B电梯按下上行
电梯空时如何运转
电梯门开时不进电梯
进入电梯后不做任何操作
电梯门开的时间多长,超过时间后是否自动关门
电梯门开的时间超时后关门到最后2厘米,是否可以撬开门
电梯门关闭后还未上升时,电梯外按下上行(或下行)按钮,电梯门是否会打开
电梯最底层是否有下行按钮
电梯最顶层是否有上行按钮
停靠算法测试:
2部均空闲时,采取就近原则,离乘电梯人最近的电梯优先运行;
有1部运行时,以同行方向且顺路的电梯优先运行,否则安排空闲电梯;
2部均运行时,以方向通行且顺路的电梯优先运行;
每部电梯,在电梯内部每层在上升和下降过程中,再电梯内部均申请每层停靠
每部电梯,在电梯内部每层在上升和下降过程中,再内部没有任何申请的情况下,在电梯外部均申请每层停靠
每部电梯,在电梯内部每层在上升和下降过程中,再电梯内部均申请每层停靠,在电梯外部也申请每层停靠
电梯本来在1楼,如果有人按18楼,那么电梯在上升到5楼的时候,有人按了10楼,这时候是否会在10楼先停下来
电梯下降到10层时显示满员,此时若8层有人等待电梯,是否在8层停。
类似7、8测试步骤地随机测试,在电梯内部和外部均有不同组合申请的情况下,验证楼层停靠是否准确和合理。
电梯的平稳性,是否会上升过快或者下降过快,造成人体不适应反应
可靠性:
无任何申请的时候,可以长时间停留在某层,并且门是关闭的
门关上的一刹那出现障碍物。
长期有障碍物在门口堵住,电梯应该也不会关门或上升和下降
同时按关门和开门按钮。
快速交替按关门开门按钮
点击当前楼层号码。
快速点击不同楼层
上升到顶层后,电梯中的原有下楼请求均会被取消
下降到负楼层后,电梯中的原有上楼请求均会被取消
电梯外部同时按上键和下键会怎样。
长按打开按钮,电梯门是否持续打开
突然停电或超载时的情况,电梯(停靠、正在上升、正在下降)不会坠落,电梯门可以通过外力打开,并且紧急电话可用
电梯运行中,申请马上要经过的楼层停靠,电梯应该不会停靠。
在电梯里面蹦跳,电梯不会出现不稳定的情况。
电压不稳定的情况下的电梯运行情况
电梯不能正常工作的时候是否有监控系统自动报警
电梯不能正常工作的时候,是否有流程可以精确的指定到人进行所有故障解决的高效处理
易用性:
电梯的按钮的设计符合一般人使用的习惯吗.
按钮是否考虑残疾人和小孩儿
楼层显示屏是否处于电梯的上部,方便别人看到
可维护性
是否有方便维修和维护电梯的工作条件(竖井通道、统一断电等)
电梯的常用配件是否容易更换
电梯的维修成本如何
电梯的安装、维护、测试
超过维修年限,是否可以正常运
视频播放器测试点
功能测试
- 视频资源可以正常获取,不管是服务器返回还是后台添加等
- 视频的封面图、页面UI等正常
- 若一个视频中涉及到上一个视频、下一个视频时点击后都能正常切换到相应的视频,且视频正常播放
- 音量大小(如静音模式下播放时无声音)
- 视频最大化、最小化(如切换到最大化时视频全屏播放)
- 播放列表的播放顺序,单循环,多循环,顺序播放,随机播放(还需要考虑下视频若是后台上传的,若在后台将某视频进行增加,删除,修改操作,验证视频播放是否正常)
- 其他逻辑:
-
- 点击视频时,视频正常播放;再次点击时暂停播放资源;
- 播放视频时应用切换到后台---切换到后台后暂停播放,再次进入应用为暂停状态;
- 播放时杀掉程序进程---视频播放结束,不保留观看进度,再次进入到该视频,从头播放
- 播放视频A时切换到视频列表下的视频B----播放视频B;从进度B开始播放
- 播放视频A时切换到其他项目下的视频C---播放视频C;再次切换到视频A时从头播放
- 播放时上下滚动页面---视频播放器位置恒定,滚动不影响播放
兼容性测试
- 平台兼容性:如Android、IOS
- 系统兼容性:Android4.4-8.0;IOS8.0-12;谨记哦(低版本的机型问题还是蛮多的,如IOS8系统播放器问题较多,测试要引起注意)
- 播放器是否与其他类型播放器兼容(需要考虑播放过程中是否和音频等相冲突)
网络测试
- 网络切换测试:WiFi-移动网;移动网-WiFi;WiFi-无网;无网-WiFi;无网-移动网
- 弱网测试:弱网情况下,视频播放是否有卡顿、黑屏、闪退等情况
- 无网进入时是否有提示info;
- 移动网进行播放时是否有非WiFi弹框提示;
- 播放过程中断网时,播放完已加载的部分后停止播放且有相应提示;
- 播放过程中切换网络时有相应提示
- 踩过的坑:Android7.1.2版本切换4G网络查看视频时,出现黑屏,卡死,崩溃等情况
- 异常测试
半屏/全屏切换测试
- 视频右下角全屏按钮,点击全屏横屏播放视频;
- 点击收起按钮,全屏收起回到当前页半屏播放
- 两者切换播放回到当前页面时,页面展示正常(IOSXX项目曾出现页面导航错乱的问题)
横竖屏切换测试
- 旋转模式打开后,验证页面及视频播放是否正常;
- 横屏模式下播放完视频,自动切换回竖屏模式;
视频中断测试
- 播放中快进/后退进度,能正常播放本地资源,快进不卡顿,无延迟;
- 播放中切换到后台,切换到后台后暂停播放,再次进入视频为暂停状态;
- 视频播放时杀掉进程,则视频播放结束(是否保留观看进度具体看产品需求);
视频易用性测试
- 界面是否方便,整洁(如视频封面图,片头,片尾,视频图像等各个界面)
- 快捷键是否正确
- 菜单是否正确
- 图像是否清楚(在标清、高清,超清等模式下切换时视频播放正常,无卡顿黑屏闪退等问题,在切换过程中是否有加载loading的提示)
- 拖拽滚动条(拖、拽功能用起来是否友好)
- 是否具备播放记忆功能(即播放进度是否有记录)
- 能否自动保存以前的播放列表
朋友圈点赞的测试用例的设计点
微信发红包-测试用例
功能
1.在红包钱数,和红包个数的输入框中只能输入数字
2.红包里最多和最少可以输入的钱数 200 0.01
3.拼手气红包最多可以发多少个红包 100
3.1超过最大拼手气红包的个数是否有提醒
4.当红包钱数超过最大范围是不是有对应的提示
5.当发送的红包个数超过最大范围是不是有提示
6.当余额不足时,红包发送失败
7.在红包描述里是否可以输入汉字,英文,符号,表情,纯数字,汉字英语符号,
7.1是否可以输入它们的混合搭配
8.输入红包钱数是不是只能输入数字
9.红包描述里许多能有多少个字符 10个
10.红包描述,金额,红包个数框里是否支持复制粘贴操作
12.红包描述里的表情可以删除
13.发送的红包别人是否可以领取
13.1发的红包自己可不可以领取 2人
\14. 24小时内没有领取的红包是否可以退回到原来的账户
14.1 超过24小时没有领取的红包,是否还可以领取
15.用户是否可以多次抢一个红包
16.发红包的人是否还可以抢红包 多人
17.红包的金额里的小数位数是否有限制
18.可以按返回键,取消发红包
\19. 断网时,无法抢红包
20.可不可以自己选择支付方式
21.余额不足时,会不会自动匹配支付方式
22.在发红包界面能否看到以前的收发红包的记录
23.红包记录里的信息与实际收发红包记录是否匹配
24.支付时可以密码支付也可以指纹支付
25.如果直接输入小数点,那么小数点之前应该有个0
26.支付成功后,退回聊天界面
27.发红包金额和收到的红包金额应该匹配
28.是否可以连续多次发红包
29.输入钱数为0,"塞钱进红包"置灰
性能
1.弱网时抢红包,发红包时间
2.不同网速时抢红包,发红包的时间
3.发红包和收红包成功后的跳转时间
4.收发红包的耗电量
5.退款到账的时间
兼容
1.苹果,安卓是否都可以发送红包
2.电脑端可以抢微信红包
界面
1.发红包界面没有错别字
2.抢完红包界面没有错别字
3.发红包和收红包界面排版合理,
4.发红包和收到红包界面颜色搭配合理
安全
1.对方微信号异地登录,是否会有提醒 2人
2.红包被领取以后,发送红包人的金额会减少,收红包金额会增加
3.发送红包失败,余额和银行卡里的钱数不会少
4.红包发送成功,是否会收到微信支付的通知
易用性(有点重复)
1.红包描述,可以通过语音输入
2.可以指纹支付也可以密码支付
三角形测试用例设计
解题思路
我们可以设三角形的3条边分别为A,B,C。如果它们能够构成三角形的3条边,必须满足:
A B C均是正数且大于0,还需满足
-
A>0,B>0,C>0,且A+B>C,B+C>A,A+C>B。
-
如果是等腰的,还要判断A=B,或B=C,或A=C。
-
如果是等边的,则需判断是否A=B,且B=C,且A=C。
测试理论
B/S架构和C/S架构区别
- B/S架构需要重点考虑系统在不同的浏览器中的兼容性问题(浏览器的内核不同)
- C/S 架构需要考虑系统在不同平台的安装、卸载、升级
HTTP协议
超文本传输协议,应用层协议,由请求与响应组成。
常见的请求方式有POST/GET,常见的状态码200ok,301永久移动,302临时移动,404找不到资源,500服务器内部错误。
POST与GET区别
- get请求常用在获取数据,post常用于发送数据
- get请求速度比post稍快
- get请求的数据是跟随请求地址一起发送,而post是在请求体中单独发送。
Cookie和Session的区别与联系
cookie是存放在浏览器上而session是存放在服务器上的。
cookie不是很安全,涉及到用户隐私方面尽量存放在session中。
当访问量增多时,session会更加占用服务器资源。
测试的目的
发现软件的缺陷与漏洞,对软件的质量进行评估,提升软件质量。
软件测试原则
- 所有的软件测试都应追溯到用户需求。
- 尽早地和不断地进行软件测试
- 完全测试是不可能的,测试需要终止。
- 充分注意测试中的群集现象。
- 程序员应避免检查自己的程序。
- 尽量避免测试的随意性
软件测试分为哪几个阶段?
单元测试、集成测试、系统测试、验收测试
单元测试与集成测试的侧重点
单元测试是对程序最小可测试的模块进行测试
集成测试是把各个模块连接起来时,穿越模块接口的数据是否会丢失。
系统测试范围
功能测试、用户体验测试、性能测试、UI测试、兼容性测试、安装测试、文档测试、稳定性测试等
α测试与β测试的区别
a测试:公司组织的内部人员进行的测试
ß测试:公司组织的典型客户在实际生活中使用。
验收测试怎么做?
在UAT测试之前,我们会制定测试方案,选择基线用例,即级别高的用例,在UAT测试环境上进行测试,如果测试通过,验收测试就通过了。
白盒、黑盒和灰盒测试区别
白盒测试:对程序的内部结构与算法进行的测试
黑盒测试:不考虑程序的内部结果,只检查程序是否实现了需求的功能
灰盒测试:关注系统接口所实现的功能,是否和需求一致。
冒烟测试的目的
检查程序的基本功能是否正常
回归测试怎么做?
首先,把bug单对应的用例执行一遍,还要检查有数据交互的模块会不会受影响,有没有引入新的问题;项目上线前,还要把当前版本的重要功能以及冒烟测试的用例都回归一遍,确保重要功能上线后不出问题。
全部回归与部分回归的区别?
全量回归:对软件的新版本测试时,重复执行上一个版本测试时使用的测试用例,防止以前没有的问题现在出问题了
部分回归:当开发修复某个bug时,我们需要去检查该bug是否被修复,还需要检查与之相关联的模块是否受到影响。
需求分析的目的
澄清需求,提取测试点
测试计划的目的
规范软件测试内容、方法和过程
什么时候开始写测试计划
需求分析之后
由谁来编写测试计划
一般都是由测试经理或者测试组长来编写
测试计划的内容
测试项目的背景、测试范围和测试策略、测试环境、测试开始和结束条件、进度安排,测试组织,以及与测试有关的风险等方面的内容。
结束条件(项目上线的条件)
需求的覆盖率、用例的执行率和缺陷的遗留率达到质量目标。
通常来说:需求覆盖率和用例执行率需要达到100%
致命/严重的缺陷需要当天解决,轻微/一般遗留率不得超过30%
常见的测试风险
进度风险、质量风险和需求变更
测试用例的要素
用例编号,用例名称,级别,预置条件,测试步骤,期望结果
测试用例级别的划分
一般是依据用户使用该场景的频率,和该功能对系统的影响程度来确定
怎样保证覆盖用户需求?
项目开始前,我们会先熟悉需求,画好流程图,保证整个流程都覆盖全面,小组之间每个人都要根据各自的流程图,各个功能点有哪些限制条件,来讲解一下自己对测试点的理解,防止之后编写测试用例时出现遗漏;用例编写完之后,再进行用例的评审,看看测试点有没有用遗漏,对需求理解有没有错误,测试场景是否覆盖完全。
写好测试用例的关键 /写好用例要关注的维度
- 覆盖用户的需求;
- 从用户使用场景出发,考虑用户的各种正常和异常的使用场景;
- 用例的颗粒大小要均匀。通常,一个测试用例对应一个场景;
- 用例各个要素要齐全,步骤应该足够详细,容易被其它测试工程师读懂,并能顺利执行;
- 做好用例评审,及时更新测试用例。
测试用例的状态
| 英文 | 中文 |
|---|---|
| No Test | 未执行状态 |
| Pass | 通过状态 |
| Fail | 失败状态 |
| Block | 阻碍状态。 |
| Investigate | 观察中状态。 |
常见的测试用例设计方法
- 等价类
- 边界值
- 判定表
- 场景法
- 错误推测法
判定表用在哪些时候/哪些功能
- 判定法,是用在不同的输入组合,可能会产生不同的输出这种情况,比如,一个有多个查询条件的查询功能,输入不同的查询条件组合,输出的结果是不一样的,这样的功能就要用到判定表
什么时候用到场景法
- 使用场景法通常是在冒烟测试中或者 一些流程性比较强的软件/功能(比如安装,卸载等等)
测试环境怎么搭建的?
参考答案:搭建环境前,开发都会给到我们一份系统发布手册,我们会根据这个手册来搭建。比如,我这个xx系统,是搭建在Unix系统下的,web服务器用的是Tomcat8,MySQL版本是5.7,程序是JAVA编写的,首先我们向开发拿到编译好的安装包,然后用xshell(或CRT)远程连接上Unix系统,把tomcat服务器停掉,把程序包放到webapps目录下,然后再启动tomcat服务器就可以了。
偶然性问题的处理
- 发现bug之后,我们会先截图,如果确定是偶然性的问题,会将日志和截图一起提单给开发定位;
- 如果缺陷在当前版本无法复现,且缺陷的影响程度比较低,可以提交问题单进行跟踪,跟踪三个版本,如果后三个版本都无法复现,就可以关闭该缺陷;
- 如果是很严重的Bug,比如导致系统崩溃等,并且,实在没有再次出现,除了要及时反馈给上级之外,最后还要写到测试报告中,说明出现了什么现象,但无法再现!
当我们认为某个地方是bug,但开发认为不是bug,怎么处理?
- 先跟开发沟通,确认系统的实际结果是不是和需求有不一致的地方;有些地方可能需求没提及,但是用户体检不好,我们也可以认为是bug。
- 如果开发以不影响用户使用为理由,拒绝修改,我们可以和产品经理,测试经理等人员进行讨论,确定是否要修改,如果大家都一致认为不用改,就不改。
产品在上线后用户发现bug,这时测试人员应做哪些工作?
- 测试人员复现问题后,提交问题单进行跟踪;
- 评估该问题的严重程度,以及修复问题时的影响范围,回归测试需要测试哪些功能;
- 问题修复后,先在测试环境上回归,通过后再在生产环境上打补丁,然后再进行回归测试;
- 总结经验,分析问题发生的原因,避免下次出现同样问题。
二八定理
80%的缺陷出现在 20%的模块。
如何跟踪缺陷
当发现缺陷后,我们要在禅道上提交问题单给开发,并每隔一段时间(间隔一个小时,或两个小时都可以)去检查缺陷是否被处理,如果没及时处理,就要提示开发,让开发及时修复问题,问题修复后,要及时进行回归测试。
缺陷的状态
激活,确认,已解决,关闭
缺陷的等级
致命,严重,一般,轻微
缺陷单应该包含这些要素
缺陷标题,严重级别,问题所属模块,复现步骤,预期结果,实际结果,有关的日志和截图。
测试报告的主要内容
人力投入,用例统计,问题单分类统计,遗留bug情况,测试风险,测试对象评估,测试结论
如何定位bug:
- 检查测试环境配置是否有问题,测试数据是否有问题
- 用fiddler抓包,分析请求和响应数据是否存在问题
- 查看应用服务器的日志
- 然后再查看数据库的数据是否存在问题
开发没时间修复,如何推进bug的修复:
- 和开发说明该问题的严重性,会怎样影响产品的正常使用,如何还是坚持不改,就上报领导,让领导辅助推进;
- 确认问题的严重程度,如果影响不大,不是非要改的bug,并且修复风险比较大,和领导商量后,如果认为暂时可以不用修复,也可以不修复。
在项目中发现哪些经典bug?什么原因导致的?
- 注册信息中的错误提示信息:如手机信息栏应填入11位有效电话号码,但提示信息却为“13位电话号码”,这是因开发人员粗心大意造成的
- 接口bug:传的字段值为空,但是开发没给默认值设个0导致接收不到
- 数据用fiddler可以抓包拦截篡改数据
- 弱网环境下订单可以重复提交
- 验证码可以重复使用
- 跑性能测试的时候,当前账号下的订单跑到别的账户上去了每次重新登陆都提示重设支付密码,而且设置的密码不能和上次相同
- 在未登录的情况下添加商品到购物车跳转到登录页面,登录成功后购物车数量不会增加
- 第一次提现申请未审核,再继续第二次提现申请无法成功
- 前台发布出租房源,后台通过审核并且成功加入出租列表,前台搜索失败
一个项目完成时,有多个重要的缺陷没有被修复,但是项目负责人说可以不修改,你认为测试是不通过的,请简述你的理由。
测试是对软件的质量进行的把关,如果一个项目仍然有很多的缺陷未被修复,那么从质量的角度上我们会认为这个软件质量是不达标的,一般来说缺陷的遗留,是不允许严重、致命bug的遗留,轻微和一般的bug遗留率不超过30%。
在需求文档不太详细的情况下,如何开展测试?
- 首先,把需求文档中有异议的部分标识出来,再找产品和开发一起讨论,把需求明确下来;
- 提取测试点,然后再叫上产品和开发一起对测试点进行讨论,看有没有遗漏,是不是合理的,
然后再编写测试用例,再评审,评审通过后,再进行后续的测试。
如何尽快找到软件中的bug?
- 尽快熟悉公司的产品业务,只有熟悉了产品的业务流程、你才能迅速找出软件中存在的一些重要的缺陷;
- 把自己当成用户,把自己当成是用户去使用该系统
- 善于怀疑,不要过于相信开发人员的能力;
什么是bug?
- 软件未实现需求和规格要求的功能 ;
- 软件未实现需求和规格未明确提及但应该实现的内容 ;
- 软件难以理解,不易使用,运行缓慢,或者最终用户(估计会)认为不好;
- 测试用例执行中发现的与预期结果不符的现象
ATM机吞卡的吞卡现象是不是BUG?
不一定,看是什么情况下吞卡。如:输入三次密码错误吞卡是正常的,不属于BUG;若输入一次密码错误吞卡则是不正常的,属于BUG。
如何减少非问题单的提交?
- 熟悉项目需求,充分了解各个各个功能模块的功能、参数、约束条件,弄清存在数据交互的模块之间的数据来源、数据流向;
- 跟产品确认该问题是否属于非问题单。
有个程序,在windows上运行很慢,怎么判断是程序存在问题,还是软硬件系统存在问题?
将程序放在其他的windows上运行,如果运行的还是很慢则是程序的问题。
你们发现bug会怎么处理。
答:发现bug后,我们会先自己定位一下,比如,抓个包,看看是前端的问题,还是后端的问题,检查下数据库的数据是不是正确的,尽量把问题发生的原因或者产生的日志找出来,方便开发定位问题,然后就提单给开发,然后开发做出相应的处理,开发修复完后就进行回归测试,回归测试通过后就关闭这个bug,没有通过就继续给回开发修复。如果遇到开发认为这个不是bug的话,那么我们就要和开发沟通,然后我们要坚持自己的立场,通过讨论后一致认为是bug就给开发修复,不是就关闭这个bug。如果开发和我们意见一直不一致,那么就要将问题升级,召集开发经理和测试经理一起讨论,再做决定。
接口测试
举例说一下你的接口测试是怎么做的?
我以下单这个接口说下吧:下单这个接口用的是http协议,使用post请求方式,发送给服务器的参数有token,产品ID,购买数量,收货人地址等等,这些参数都是必传的参数。我们是使用Jmeter来做接口测试的,首先,要新建一个线程组,在线程组下面添加一个http的请求,然后填写好服务器地址,接口路径,请求方式,请求参数。由于下单的接口依赖于等于,所以我们会先调用登录接口,从中获取token值,在下单接口中使用${参数名}的方式引用,接下来还要对其他参数进行参数化,构造各种正常和异常的数据,我们先在本地创建一个txt文档,把参数填写到文档里面,在Jmeter中添加一个csv文件设置,填写好txt文档的路径,然后在请求参数中使用Json提取器把token值关联出来,然后在下单接口中使用${参数名}的方式引用;接下来添加断言,检查服务器返回的结果和预期结果是不是一致的。最后,添加查看结果树查看测试结果。
JMeter测试环境怎么搭建
- 因为JMeter是JAVA程序开发的,所以要先安装JDK;
- 配置JAVA环境变量,包括:JAVA_HOME,PATH,CLASSPATH;
- 双击jmeter的bin目录里面的jmeter.bat文件,就可以启动Jmeter。
什么时候会用到使用Fiddler
- 做安全测试,检测敏感信息是否加密,拦截篡改数据;
- 当测试时发现缺陷,用fiddler抓包,定位该问题是前端还是后台的问题;
- 模拟弱网环境;
- 统计单个功能的响应时间。
Fiddler怎么拦截篡改数据
- 就拿下单来说吧,点击下单之前,先启动Fiddler,按F11打断点,将请求拦截下来,
- 然后在fiddler中,对拦截下来的请求,修改其中的数据,比如将价格或者商品数量进行修改
- 修改完成后,关闭拦截,继续请求的发送即可。
Fiddler怎么模拟弱网测试
步骤:
- 点击规则-->自定义规则,打开fiddler的脚本编辑器,找到simulateModem
- 设置上传和下载的延时速度
- 点击规则-->性能,选模拟带宽
Fiddler如何模拟2g/3G的网络
2G一般上行/下行速率约为:2.7、9.6kbs,模拟设置为:uploaded 约 2962 ms,downloaded 约 833 ms;(弱网一般指2G网络)
3G一般上行/下行速率约为:384、2560kbs,设置为:uploaded 约 2.6 ms,downloaded 约 0.39 ms;
Fiddler怎么抓HTTPS的包
步骤:
- 安装安全证书;
- 点击fiddler的Tools-->options-->https
- 勾选上所有选项,更换证书,重启fiddler
Fiddler的抓包原理
在客户端和服务器之间建立一个代理,通过监听端口(默认是 8888),监听本机发出的请求和服务器返回的响应结果。
用jmeter做接口可以通过,但在手机上用到这接口时用不了,什么原因:
参考答案:抓包,查看从手机发出去的数据有没有问题。
接口测试的关注点(怎么验证接口是通过的)
- 发送给服务器的请求数据是否正确;
- 服务器返回给客户端的信息是否和预期结果一致;
- 进入数据库,检查接口是否实现的相应的功能;
- 接口的响应时间是否符合需求。
在进行接口的自动化测试,如果遇到token校验,你是怎么处理的?
首先需要获取token,获取token的整个思路为:
- 先进行登录
- 登录成功后
- 获取token
- 把获取的token当作下一个接口的请求参数
- 上面这个题目可以这样延伸:有一个接口A,发送给服务器的数据需要从接口B中获取,怎样对A接口进行测试?
参考答案:
- 在A接口前面添加接口B,在B接口中添加Json提取器,把A接口需要用到的数据关联出来,保存到参数中;
- 在A接口中使用${参数名}的方式进行引用。
Jmeter的断言怎么做?
参考答案:选中需要断言的请求,右键,选择响应断言,在响应断言输入框中添加要断言的值;如果这个接口有多个请求数据,针对每个请求数据服务器返回数据都不一样的,这时候,我们就要把断言的值进行参数化,步骤是:现在本地添加一个txt文档,把参数化的值写入文档里面,然后再在jmeter选中需要断言的请求,右键,添加CSV文件设置,把刚才编辑好的txt文档添加进来,在响应断言输入框中使用${字段名}的方式来引用参数的值。
接口自动化做了多久呢
参考答案:每个版本都会做接口测试,开发写好接口,我们拿到接口文档之后,我们就开始做着。
jenkins怎么做接口自动化?
设置定时任务去跑脚本
接口返回的数据格式有哪些?
JSON格式 和 文本格式,常用的是JSON格式
什么样的接口,是个好的接口
功能准确无误,响应速度快,支持多用户并发操作,安全性好
接口出错了怎么办?
首先,我会先检查一下请求参数啊,还有其他的填入的数据是否有问题,如果这些都没问题,我会ping一下网络,看网络通不通,如果网络也没问题的话,我会去看看系统服务器有没有启动,如果服务器也没问题的话,那可能就要发给开发定位一下了。
你一个项目做过哪些接口?
- 每个版本都会新增一些功能,对应的接口也要进行测试,一个项目的所有接口都要进行测试,比如,查询,下单,登陆,修改信息等等,开发写好一个接口后,给到我们接口文档我们就会去测试。
接口测试用例怎么写?
我们每个版本都会有四五个接口需求,有的是新增的接口,有的是原来的接口做了一些调整,我们会查看这些接口有哪些参数,每个参数有什么约束条件,加密方式是什么,正常和异常的响应信息有哪些,然后编写测试用例来覆盖这些需求,一个版本下来大概有五六十条接口测试用例。
接口有哪些参数?
比方说:下单接口,会有token,产品ID,购买数量,收货人地址,收件人电话等等;注册接口,会有手机号,密码,验证码这些参数;我们项目的接口有五六十个,每个接口实现的功能不一样,参数是不一样的。
接口的状态码有哪些
接口不一样,返回的状态码也不一样,我们接口的状态码是由开发统一定义的,比如,我们xxx这个项目,修改昵称这个接口,成功修改的状态码是0,30001表示token无效,30002表示用户不存在,还有30003等一些其他的状态码,具体意思记不太清楚了。
接口是一个一个做,还是系统做?
我们是将这个系统的所有接口,都放在Jmeter的一个线程组下一起执行。
接口测试遇到过什么问题,当时是怎么操作然后出现的问题,后来又是怎么分析处理的?
就比如最近做的这个项目,添加新商品这个接口,当库存量的值为空,接口报错了
原因是开发没有设定当库存量为空时,自动给一个0的默认值,导致后台接收不到数据。
你支付功能,付款的接口是怎么测试的呢?
付款的接口一般是由开发直接调试的,像支付宝、微信这些第三方支付,开发会直接调试好。
能说一下第三方支付接口的流程吗
首先用户下订单,网站后台就会生成一个支付请求发送到第三方支付平台;支付平台收到请求后会直接发送响应给用户,展示金额等,并且要求用户输入账号密码,用户输入信息直接发送到第三方平台;付款成功后第三方平台会返回支付结果给到网站后台和用户;后台收到付款成功信息后就会生成付款成功的订单信息发给用户;大概的流程就是这样。
Fiddler怎么抓手机app的包?
- 手机与fiddler所的电脑连接到同一网络;
- 在fiddler设置监听端口,并允许远程终端连接;
- 在手机上填写代理服务器的地址和端口。
为什么要做接口测试 / 接口测试的目的
- 尽早介入测试,早发现bug,降低修复成本
- UI界面测试无法发现底层问题
接口的加密如何处理
一般来说的话加密都是开发那边会给到加密的文档或者脚本给到我们,我们将参数进行加密后,然后再在Jmeter中填写
Jmeter的脚本怎么在Jenkins上运行的.(run_Jmeter.py)
当时我们老大写了一个run_jmeter的Python脚本用来执行,我们需要在里面设置好一些路径,比如Jmeter的路径,Jmeter的脚本和测试报告的路径。
性能测试
性能测试怎么做的?
参考答案:
- 做性能需求分析,挑选了用户使用最频繁的功能来做性能测试,比如:登陆,打开系统首页,搜索,提交订单,确定性能指标,比如:事务通过率为100%,90%的事务响应时间不超过3秒,CPU和内存的使用率为70%以下。
- 搭建性能测试环境,准备好性能测试数据。
- 使用Jmeter开发优化脚本,包括:参数化,断言,关联等。
- 设计性能测试场景,我们这个项目做了单用户单功能循环200次的基准测试,然后使用1500个用户,执行30分钟的负载测试,看系统有没有性能瓶颈;
- 我们搭建了分布式压力测试环境进行测试,每台压力机并发500个用户,并监控linux服务器的CPU,内存,IO。
- 分析性能测试结果,如果有性能瓶颈,收集相关的日志提单给开发修改。
- 开发修改好后,回归性能测试,然后输出性能测试报告。
如何确定系统能够承载的最大用户数?
通过负载测试,不断增加用户数,随着用户数的增加,各项性能指标也会相应产生变化,当出现了性能拐点,比如,当用户数达到某个数量级时,响应时间突然增长,那么这个拐点处对应的用户数就是系统能承载的最大用户数。
你们系统哪些地方(哪些功能)做了性能测试?
我们选用了用户使用最频繁的功能来做性能测试,比如:登陆,打开系统首页,搜索,提交订单。
你们性能测试在哪里做的?
我们会搭建一套独立的性能测试环境进行测试。
你们性能测试什么时间做?
功能测试之后,系统比较稳定的时候再做。
怎样分析性能测试结果?
- 查看聚合报告和服务器的资源使用图,检查响应时间,事务成功率,CPU,内存和IO使用率是否达到要求,如果出错率达到了总请求数的3%,我们会检查是什么原因导致的,修改好后,重新测试;
- 如果出现了性能瓶颈,比如响应时间,或者CPU使用率不达标,我们会从服务器上导出日志,分析是哪个地方导致响应时间过长,如果分析不出来,就叫上开发一起讨论,确定问题后,就提单给开发修复,修复好了就进行回归测试。
如何判断网络是否存在瓶颈?
在性能测试结束之后,我们会根据性能测试的结果,查看在整个性能测试过程中,网络的吞吐量是多少,如果网络的吞吐量占到了服务器的70%以上,我们就认为网络存在瓶颈,通常会增加带宽或者压缩传输数据。
响应时间不达标
响应时间不达标的话,我们会根据性能测试结果先检查看下是否是服务器带宽存在问题,如果带宽存在瓶颈,则会考虑增加带宽或者压缩传输数据,如果带宽没有问题的话,我们会从服务器上导出日志,开发一起讨论分析是哪个地方导致响应时间过长,确定问题后,就提单给开发修复,修复好了就进行回归测试。
CPU使用率不达标
CPU使用率不达标,我们会从服务器上导出日志,分析是哪个地方导致CPU使用率不达标,如果分析不出来,就叫上开发一起讨论,确定问题后,就提单给开发修复,修复好了就进行回归测试。
程序在单用户场景下运行成功,多用户运行则失败,提示连不上服务器。
原因:程序没有做多线程处理。
程序实现的功能是,随机给用户分配不同的任务,单用户运行时,能成功分配;多用户并发申请任务时,所有用户得到的任务都是一样的。
原因:程序存在线程同步的问题。
系统并发200个用户,服务器返回 http status-code = 500
原因:数据库连接没有来得及关闭,就有用户访问上来了,导致数据库崩溃 。这个就是数据库的链接这块开发没有处理好
你们的性能测试需求哪里来的?
参考答案:我们的需求文档上有的,不过有时候不太合理,我们可能需要和BA进行讨论。比如,我之前做了一个公司内部用的OA系统的性能测试时,要求并发用户200人,我们整个公司都没有100人,很明显,做200人并发是没有必要的,后来,我们只做了50人并发。
如何实现200用户的并发?
参考答案:在请求的前面添加集合点,设置并发用户数为200
什么情况下要做关联,关联是怎么做的?
参考答案:当发给服务器的请求数据需要依赖另一个请求返回的数据,就用关联。
有验证码的功能,怎么做性能测试?
参考答案:
1)、将验证码暂时屏蔽,完成性能测试后,再恢复。注意:屏蔽验证码是不会给性能测试的结果带来影响的。
2)、使用一个万能的验证码。
你们性能测试做的是前台还是后台?
参考答案:
我们做的是后台服务器的性能
性能测试指标有哪些?
平均事务响应时间,90%的事务响应时间,TPS,CPU、内存
你们项目最佳的并发用户数是多少?
参看答案:我们当时做到1500个并发用户的时候,查询功能的响应时间超过了性能指标2秒多,原因是有几个表的索引建得不合理导致的,重新建索引后,问题就解决了。我们当时做到1500并发用户后,就没再继续增加用户量了。
分布式环境怎么搭建?
分布式的环境搭建比较复杂,当时我也是根据自己的笔记来搭建的。具体的步骤不记得了,大概是要先修改配置文件,将所有需要使用到的压力机的IP地址添加进来,然后在压力机只需要开启服务,在主机的电脑就可以控制远程启动了
怎么监控服务器资源的
我们使用的是Nmon工具来监控服务器资源的,它能够将linux上一段时间的资源以文档的形式保存下来。
Jmeter做性能测试的工作原理是什么?
Jmeter通过主机来控制各个压力机,并发大量用户,对服务器产生负载,从而实现性能测试。
服务器的配置是怎样的
CentOS、 6.8
CPU型号:英特尔 酷睿 i5
CPU核数:16核
内存:32G
服务器当时有几台?
2台web服务器,一台db服务器
app端测试
APP测试流程
其实,大部分的软件测试流程都是差不多的。
测试周期可按项目的开发周期来确定测试时间,一般测试时间为两三周(即15个工作日),根据项目情况以及版本质量可适当缩短或延长测试时间。正式测试前先向主管确认项目排期。
测试任务开始前,检查各项测试资源:
--产品功能需求文档;
--产品原型图;
--测试设备(真实的手机,如:OPPO R17,vivox23,华为p20,mate20, iPhone 8, iPhone xs)
APP测试策略
功能测试
和PC端测试一样,APP测试也要根据软件说明或用户需求来验证App的各个功能实现,采用如下方法实现并评估功能测试过程:
1)根据用户需求提炼App的用户使用场景,构建测试点,并明确测试标准,若用户需求中无明确标准遵循,则需要参考行业或相关国际标准或准则。
2)根据被测功能点的特性列出相应类型的测试用例对其进行覆盖,如;涉及输入的地方需要考虑等价类、边界值、判定表、探索性测试方法等对其进行覆盖。
3)在测试实现的各个阶段跟踪测试实现与需求输入的覆盖情况,及时修正业务或需求理解错误。
- 应用的前后台切换
APP切换到后台及应用状态是否正常
手机锁屏解屏后进入APP时,再回到APP,是否停留在上一次操作界面
APP切换到后台,再回到APP,功能否会崩溃,功能状态是否正常
当App使用过程中有电话进来中断后再切换到APP,功能状态是否正常
当杀掉APP进程后,再开启APP,APP能否正常启动
出现必须处理的提示框后,切换到后台,再切换回来,检查提示框是否还存在,有时候会出现应用自动跳过提示框的缺陷
对于有数据交换的页面,每个页面都必需要进行前后台切换、锁屏的测试,这种页面最容易出现崩溃
- 免登陆:很多应用提供免登录功能,当应用开启时自动以上一次登录的用户身份来使用app。
以7天内免登陆为例,测试点:
1、选择7天内免登录,登录后退出再次登录,是否免登录
2、选择7天内免登录,登录后,第七天登录,是否免登录
3、选择7天内免登录,登录后,第八天登录,是否免登录
4、考虑跨周的测试
5、考虑到跨月份的测试(28天、29天、30天、31天)
6、考虑跨年的测试
7、免登录期间,手动输入密码登录,确认免登录的有效期是否往后延长
8、关于缓存的测试(清除缓存、覆盖安装、卸载安装等等)
- 数据更新:根据应用的业务规则,以及数据更新量的情况,来确定最优的数据更新方案
需要确定哪些地方需要提供手动刷新,哪些地方需要自动刷新,哪些地方需要手动+自动刷新。
确定哪些地方从后台切换回前台时需要进行数据更新。
根据业务、速度及流量的合理分配,确定哪些内容需要实时更新,哪些需要定时更新
确定数据展示部分的处理逻辑,是每次从服务端请求,还是有缓存到本地,这样才能有针对性的进行相应测试
检查有数据交换的地方,均有相应的异常处理 - 离线浏览:很多应用会支持离线浏览,即在本地客户端会缓存一部分数据供用户查看
在无网络情况可以浏览本地数据
退出APP再开启APP时能正常浏览
切换到后台再切回前台可以正常浏览
锁屏后再解屏回到应用前台可以正常浏览
在对服务端的数据有更新时会给予离线的相应提示 - 定位、照相机服务:测试定位、照相机服务时,需要采用真机进行测试
有用到定位服务、照相机服务的地方,需要进行前后台的切换测试,检查应用是否正常。
当定位服务没有开启时,使用定位服务,会友好性弹出是否允许设置定位提示。当确定允许开启定位时,能自动跳转到定位设置中开启定位服务。
- 时间测试:
客户端自行设置手机的时区、时间,检查文字的发布时间、评论时间是否合理。 - PUSH测试:就是把信息推送到APP上
检查push消息是否按照指定的业务规则发送
检查不接受推送消息时,检查用户不会再接收到push
免打扰测试
推送消息是否准
安全测试
敏感信息是否在前端加密,在网络传送过程中是否加密;
密码过于简单检查;
重要数据,如信用卡密码,支付密码,不会被保存的设备中,且不会被解码;
同一个账号在不同的终端登陆,是否有提示;
异地登陆是否有提示;
系统是否允许多次非法的登陆,是否有次数限制;
限制/允许使用手机某些功能,如:读取联系人信息,调取相机,接入网络等;
手机的验证码是否能重复使用,是否有超时限制,使用自己接收到的验证码修改别人的信息;
程序是否能防SQL注入,防XSS攻击
反编译,即将编译后的数据转换成源代码,进而篡改程序。
用户体验测试
用户体验测试,就是以主观的普通消费者的角度去感知产品或服务的舒适、有用、易用和友好亲切程度。
用户体验测试功能点:
是否有空数据界面设计,引导用户去执行操作。
是否滥用用户引导
是否有不可点击的效果
交互流程分支是否太多
相关的选项是否离得很远
一次是否载入太多的数据
界面中按钮可点击范围是否适中
标签页是否跟内容有从属关系
操作应该有主次从属关系
是否有横屏模式的设计
App页面间的切换是否流畅,逻辑是否正确
出错提醒的UI设计能否接受,错误信息内容是否容易理解
系统会因为长时间运行而慢慢停止,然后崩溃
交叉事件
交叉事件测试,即冲突测试,是指一个功能正在执行过程中,同时另外一个事件或操作对该过程进行干扰的测试。
交叉测试功能点:
多个App同时运行是否影响正常功能
App运行时前/后台切换是否影响正常功能
App运行时拨打/接听电话
App运行时发送/接收信息
App运行时发送/收取邮件
App运行时切换网络(2G、3G、4G、wifi)
(为什么要限速/模拟弱网?主要是为了模拟app端(也包括pc端)在低网络速度的情况,用于测试各终端是否有bug以及对用户体验是否有影响)
App运行时浏览网络
App运行时使用蓝牙传送/接收数据
App运行时使用相机、计算器等手机自带设备
兼容性测试
兼容性测试,是指测试软件在特定的硬件平台上、不同的应用软件之间、不同的操纵系统平台上、不同的网络等环境中是否能够很友好的运行的测试。
app兼容性测试应该考虑以下几个方面:
1、主流手机的分辨率测试。比如(高*宽):1280x800、1280x720、1920x1080、800x480、854x480。
不同操作系统的兼容性,是否适配。比如,安卓从7.0到9.0
不同手机品牌。比如,华为,小米,oppo,vivo等等
PS: iphone系统的app也要考虑这些方面。
性能测试
App的性能测试,分为服务器端的性能测试和手机端的性能测试。我们这里主要是讨论手机端的。
手机端的app的性能测试,主要关注的性能测试指标是:CPU,内存,上传流量,下载流量,和电量的使用情况,我们稍后会结合monkey和性能测试的监控工具来讲解。
安装/升级/卸载测试
- 安装测试
1.正常安装测试,检查是否安装成功。
2.APP版本覆盖测试。
例如:先安装一个1.0版本的APP,再安装一个高版本(1.1版本)的APP,检查是否被覆盖。
3.回退版本测试。
例如:先装一个2.0版本的APP,再安装一个1.0版本的APP,正常情况下版本是可以回退的。
4.安装时内存不足,弹出提示。
5.根据安装手册操作,是否正确安装。
6.安装过程中的意外情况(断电、断网、来电话了、查看信息)等等,检查会发生的情况。
7.在不同型号、系统、屏幕大小、分辨率上的手机进行安装。
8.安装完成后,能否正常启动应用程序。
9.安装完成后,重启手机能否正常启动应用程序。
10.安装完成后,检查是否对其他应用程序造成影响。
11.安装完成后,杀毒软件是否会对其当做病毒处理。
12.在安装过程中,所有的提示信息必须是英文或者中文,提示信息中不能出现代码、符号、乱码等。
13.是否支持第三方安装。 - 卸载测试
1.直接卸载,检查是否卸载干净。
2.用第三方工具卸载,检查是否卸载干净。
3.卸载过程中,出现意外(比如手机关机,没电,查看信息,接打电话),程序是否还能运行。
4.在卸载过程中,突然重启设备,再次访问程序,是否还能运行。
5.在没用使用程序时,删除目录文件,看程序是否能运行。
6.在使用过程中,直接删除目录文件,程序是否还能运行。
7.不同系统、硬件环境、网络环境下进行卸载。
8.卸载成功后,是否对其他程序有影响。
9.卸载后再次安装,是否正常使用。
10.在卸载过程中,所有的提示信息必须是英文或者中文,提示信息中不能出现代码、符号、乱码等。 - 升级测试
1.当客户端有新版本时,提示更新。
2.非强制更新,可以取消更新,旧版本正常使用,下次使用软件时,仍然会出现更新提示。
3.强制更新,强制更新而用户没有更新时,退出客户端,下次启动,依然提示更新。
4.不卸载更新,检查是否可以更新。
5.不卸载更新,检查资源同名文件如图片等是否更新成最新版本。
6.非wifi网络下,提示是否更新,取消就加入待下载,wifi下自动更新。
7.跨版本升级,检查是否可以更新。
UI测试
UI测试的目标是确保用户界面会通过测试对象的功能来为用户提供相应的访问或浏觅功能。确保用户界面符合公司或行业的标准。包括用户友好性、人性化、易操作性测试。
UI测试点:
窗口:
• 窗口能否改变大小、移动和滚动
• 窗口中的数据内容能否用鼠标、功能键、方向键和键盘访问
• 当被覆盖并重新调用后,窗口能否正确地再生
• 需要时能否使用所有窗口相关的功能
• 是否有相关的下拉式菜单、工具条、滚动条、对话框、按钮、图标和其他控制可为窗口使用,并适当地显示
• 显示多个窗口时,窗口的名称是否被适当地表示
下拉式菜单和鼠标操作:
• 菜单条是否显示在合适的语境中
• 应用程序的菜单条是否显示系统相关的特性(如时钟显示)
• 下拉式操作能正确工作
• 是否适当地列出了所有的菜单功能和下拉式子功能
• 文本字体、大小和格式是否正确
• 是否能够用其他的文本命令激活每个菜单功能
• 菜单功能是否随当前的窗口操作加亮或变灰
数据项:
• 字母数字数据项是否能够正确回显,并输入到系统中
• 图形模式的数据项(如滚动条)是否正常工作
• 是否能够识别非法数据
• 数据输入消息是否可理解
app测试与web测试的区别
- 系统架构:web端系统,更新服务器,不需要更新客户端;APP如果更新了服务端,客户端也要更新并测试;
- 兼容性。Web端要考虑不同的浏览器内核进行测试(IE、chrome、Firefox),APP的兼容性要考虑选择主流的机型,不同的分辨率、尺寸, 以及不同的操作系统;
- App要考虑交叉事件测试,安装,卸载,前后台切换测试;
- App还要考虑界面操作,如:横竖屏切换,多点触控,事件触发区域。
APP的兼容性怎么测试,测了哪些机型?哪些版本?那又怎么测Android的兼容性、怎么测手机的兼容
app兼容性测试,我们主要就是将测试用例在自己负责的机型上再执行一遍。
测试了哪些机型,自己私下从(华米OV)各选一款
app测试点有哪些?
功能,兼容性,用户体验,安全性,安装卸载升级测试,交叉事件,UI测试,性能测试。
app项目做了多久
一直在做,现在app的主体需求已经完成了,后期都是一些零零散散的需求,测试工作量比较少。
你测了app哪些模块
所有功能都测
,按照机型分工
App的性能测试怎么做的
App的性能分为服务器端的性能和手机端的性能。
服务器端的性能,我们用Jmeter工具进行测试的,和web的端性能测试方法一样的。
我们是用monkey做手机端App的稳定性测试的,使用monkey跑10万次,看它会不会出问题,如果出了问题,我们再定位原因,具体的做法是这样的:
- 在跑monkey前,先使用
adb logcat -c清空手机的logcat日志 - 接下来,使用
adb logcat -v time获取logcat日志并导入本地文件 - 使用monkey运行被测应用:
adb shell monkey -p 包名 -v 10万次并将执行结果导入到本地 - 测试完成后查看monkey日志,如果说它跑的次数跟我设的次数不一样.就说明monkey中途跑失败了。那我就要去看看monkey日志中有没有crash或者anr的关键字,如果有还需定位到是什么原因导致的anr或者crash的问题。并且将相关日志和logcat日志与进程号提交给开发定位,如果是anr的问题,还需要从安卓中获取/data/anr/traces.txt文件提交给开发定位。
你这个app测试人员有几个?怎么分工?
2个。按测试的手机类型分工,每个人负责几种测试机型,每个人都要测试app的所有测试点。
你做APP用过monkey,能具体讲一下吗?
我们是用monkey对APP进行稳定性进行测试。
一般我们会用到命令 adb shell monkey -p 包名 -v 次数,我们项目每次测试都跑10万次。
那如果monkey测试过程中,出现crash你怎么定位?
参考答案:crash一般是空指针导致的,在monkey日志中输入“crash”搜索到相关的日志,然后把日志给开发定位。
那问题开发修复了你怎么验证?(意思就是,monkey怎样做回归测试)
参考答案:我们会进行回归测试,会按照之前的轨迹(seed)去跑monkey,命令是:adb shell monkey -p 包名 -s seed值 -v 次数
面试官:看你写有用MONKEY做APP测试,怎么做的?如果有问题的话怎么定位?
我:我们是使用monkey来做稳定性测试的,
- 在跑monkey前,先使用
adb logcat -c清空手机的logcat日志 - 接下来,使用
adb logcat -v time获取logcat日志并导入本地文件 - 使用monkey运行被测应用:
adb shell monkey -p 包名 -v 10万次并将执行结果导入到本地 - 测试完成后查看monkey日志,如果说它跑的次数跟我设的次数不一样.就说明monkey中途跑失败了。那我就要去看看monkey日志中有没有crash或者anr的关键字,如果有还需定位到是什么原因导致的anr或者crash的问题。并且将相关日志和logcat日志与进程号提交给开发定位,如果是anr的问题,还需要从安卓中获取/data/anr/traces.txt文件提交给开发定位。
APP出现ANR的原因:
- 线程阻塞的
- 内存不足
- CPU满负荷(由于现在的手机基本都是8核CPU,所以基本不会出现CPU满负荷的情况)
APP出现CRASH的原因:
- 空值指针
- 数组越界
- 内存不足
- CPU满负荷(由于现在的手机基本都是8核CPU,所以基本不会出现CPU满负荷的情况)
appium自动化环境是怎么搭建的呢?
参考答案:这个环境搭建起来,稍微复杂些,我自己总结了个文档,网上都找不到的。把这个环境搭建起来,最好先把selenium自动化环境搭建起来,然后安装JDK,配置环境变量,接下来安装nodejs,安装appium,安装SDK,配置好ANDROIR_HOME环境变量就可以了。
appium你是用什么工具定位元素的?
参考答案:可以用uiautomatorviewer,但是这个工具不稳定,经常报错;我一般都用appium自带的inspector来定位。
app自动化,你会用什么方式来定位元素?
参考答案:appium定位方式有id,classname,xpath,还有find_element_by_android_uiautomator,根据实际情况来灵活运用。
H5元素怎么定位?
参考答案:要切换上下文,这个和selenium自动化里面的切换表单有点相似。首先,我们要查出H5页面的context名称,再用switch_to.context()方法切换过去,接下来,就可以进行正常的操作了。
web自动化和app自动化有什么区别?
测试的思路都是一样的,要用到元素定位,unittest框架这些,app自动化定位可以用appium的Inspector来定位。
如何判断客户端还是后台的问题
- 一、客户端问题
- 文字,图片有误;
- 无法输入,按钮不可用;
- 抓包信息显示客户端发送的信息有误。
- 二、服务器端问题
- 通过抓包检查服务器返回的信息,如果信息有误,就可以断定是服务器的问题;
- 客户端向服务器发送信息后,服务器无响应。
问:你怎么做app测试的?
测试前,先熟悉app的原型图和业务需求,确定测试点,开发做完接口之后,先做接口测试,App开发好后,先做一个冒烟测试,看看软件的基本功能是否可用,如果正常,我们再做功能测试,UI测试,兼容性测试,交叉事件测试,安装卸载测试等。
如果面试官问具体某个测试类型怎么,就要举例子加以说明。
比如:
UI测试:检查app的UI是否和原型图一致。
功能测试:xxxx
兼容性测试:xxxx
用户体验测试:xxxx
(补上app的8大测试点,并举例子说明)
Appium的工作原理是什么?
我们的电脑(c端)上运行自动化测试脚本,调用的是appium的webdriver的接口,appium服务器(s端)接收到我们client上发送过来的命令后,他会将这些命令转换为UIautomator认识的命令,然后由UIautomator来在设备上执行自动化。
为什么要限速/模拟弱网?
主要是为了模拟app端(也包括pc端)在低网络速度的情况,是否有bug,对用户体验是否有影响
appium如何远程调用其他机器?
参考答案:在上个项目中,一般我们只使用一台机器去跑appium脚本。
涉及到多台机器调用用的少一些,不过我自己业余时间有学过,大概说一下我的思路。
比如:A要使用B的服务为例:
- 首先,修改B的服务主机 ip
- 将A机器要执行的脚本中的ip替换为B的服务ip
- 将测试机插到远程机B上
- 在机器A上执行脚本,就可以调用远程机
appium遇到系统弹窗是怎么处理的?
和selenium方法一样的。使用switch_to.alert.accept()来接收弹窗,如果是拒绝就是switch_to.alert.dismiss()
appium遇到有电话或者短信怎么处理?
这种情况一般会导致定位不到相关元素,我们就可以直接用try....except去捕捉异常处理,写一些处理逻辑,比如设置等待或者停止运行等。
Linux命令
●查看硬件信息相关命令(8个)
ifconfig free fdisk ethtool mii-tool dmidecode dmesg lspci
●其它(19个)
echo printf rpm yum watch alias unalias date clear history eject time nohup nc xargs exec export unset type
●系统性能监视高级命令(12个)
uptime top free vmstat mpstat iostat sar chkconfig
内存:
top free vmstat mpstat iostat sar
CPU:
top vmstat mpstat iostat sar
I/O:
vmstat mpstat iostat sar
进程:
ipcs ipcrm lsof strace lstrace
负载:
uptime mount umount df du fsck dd dumpe2fs dump
●关机和查看系统信息的命令(3个)
shutdown halt init
●系统管理相关命令(8个)
uptime top free vmstat mpstat iostat sar chkconfig
●系统安全相关命令(10个)
chmod chown chgrp chage passwd su sudo umask chattr
系统信息
arch 显示机器的处理器架构
uname -m 显示机器的处理器架构
uname -r 显示正在使用的内核版本
dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI)
hdparm -i /dev/hda 罗列一个磁盘的架构特性
hdparm -tT /dev/sda 在磁盘上执行测试性读取操作
cat /proc/cpuinfo 显示CPU info的信息
cat /proc/interrupts 显示中断
cat /proc/meminfo 校验内存使用
cat /proc/swaps 显示哪些swap被使用
cat /proc/version 显示内核的版本
cat /proc/net/dev 显示网络适配器及统计
cat /proc/mounts 显示已加载的文件系统
lspci -tv 罗列 PCI 设备
lsusb -tv 显示 USB 设备
date 显示系统日期
cal 2007 显示2007年的日历表
date 041217002007.00 设置日期和时间 - 月日时分年.秒
clock -w 将时间修改保存到 BIOS
关机 (系统的关机、重启以及登出 )
shutdown -h now 关闭系统
init 0 关闭系统
telinit 0 关闭系统
shutdown -h hours:minutes & 按预定时间关闭系统
shutdown -c 取消按预定时间关闭系统
shutdown -r now 重启
reboot 重启
logout 注销
文件和目录
cd /home 进入 '/ home' 目录'
cd .. 返回上一级目录
cd ../.. 返回上两级目录
cd 进入个人的主目录
cd ~user1 进入个人的主目录
cd - 返回上次所在的目录
pwd 显示工作路径
ls 查看目录中的文件
ls -F 查看目录中的文件
ls -l 显示文件和目录的详细资料
ls -a 显示隐藏文件
ls [0-9] 显示包含数字的文件名和目录名
tree 显示文件和目录由根目录开始的树形结构
lstree 显示文件和目录由根目录开始的树形结构
mkdir dir1 创建一个叫做 'dir1' 的目录'
mkdir dir1 dir2 同时创建两个目录
mkdir -p /tmp/dir1/dir2 创建一个目录树
rm -f file1 删除一个叫做 'file1' 的文件'
rmdir dir1 删除一个叫做 'dir1' 的目录'
rm -rf dir1 删除一个叫做 'dir1' 的目录并同时删除其内容
rm -rf dir1 dir2 同时删除两个目录及它们的内容
mv dir1 new_dir 重命名/移动 一个目录
cp file1 file2 复制一个文件
cp dir/* . 复制一个目录下的所有文件到当前工作目录
cp -a /tmp/dir1 . 复制一个目录到当前工作目录
cp -a dir1 dir2 复制一个目录
cp -r dir1 dir2 复制一个目录及子目录
ln -s file1 lnk1 创建一个指向文件或目录的软链接
ln file1 lnk1 创建一个指向文件或目录的物理链接
touch -t 0712250000 file1 修改一个文件或目录的时间戳 - (YYMMDDhhmm)
file file1 outputs the mime type of the file as text
iconv -l 列出已知的编码
iconv -f fromEncoding -t toEncoding inputFile > outputFile creates a new from the given input file by assuming it is encoded in fromEncoding and converting it to toEncoding.
find . -maxdepth 1 -name *.jpg -print -exec convert "{}" -resize 80x60 "thumbs/{}" ; batch resize files in the current directory and send them to a thumbnails directory (requires convert from Imagemagick)
文件搜索
find / -name file1 从 '/' 开始进入根文件系统搜索文件和目录
find / -user user1 搜索属于用户 'user1' 的文件和目录
find /home/user1 -name *.bin 在目录 '/ home/user1' 中搜索带有'.bin' 结尾的文件
find /usr/bin -type f -atime +100 搜索在过去100天内未被使用过的执行文件
find /usr/bin -type f -mtime -10 搜索在10天内被创建或者修改过的文件
find / -name *.rpm -exec chmod 755 '{}' ; 搜索以 '.rpm' 结尾的文件并定义其权限
find / -xdev -name *.rpm 搜索以 '.rpm' 结尾的文件,忽略光驱、捷盘等可移动设备
locate *.ps 寻找以 '.ps' 结尾的文件 - 先运行 'updatedb' 命令
whereis halt 显示一个二进制文件、源码或man的位置
which halt 显示一个二进制文件或可执行文件的完整路径
挂载一个文件系统
mount /dev/hda2 /mnt/hda2 挂载一个叫做hda2的盘 - 确定目录 '/ mnt/hda2' 已经存在
umount /dev/hda2 卸载一个叫做hda2的盘 - 先从挂载点 '/ mnt/hda2' 退出
fuser -km /mnt/hda2 当设备繁忙时强制卸载
umount -n /mnt/hda2 运行卸载操作而不写入 /etc/mtab 文件- 当文件为只读或当磁盘写满时非常有用
mount /dev/fd0 /mnt/floppy 挂载一个软盘
mount /dev/cdrom /mnt/cdrom 挂载一个cdrom或dvdrom
mount /dev/hdc /mnt/cdrecorder 挂载一个cdrw或dvdrom
mount /dev/hdb /mnt/cdrecorder 挂载一个cdrw或dvdrom
mount -o loop file.iso /mnt/cdrom 挂载一个文件或ISO镜像文件
mount -t vfat /dev/hda5 /mnt/hda5 挂载一个Windows FAT32文件系统
mount /dev/sda1 /mnt/usbdisk 挂载一个usb 捷盘或闪存设备
mount -t smbfs -o username=user,password=pass //WinClient/share /mnt/share 挂载一个windows网络共享
磁盘空间
df -h 显示已经挂载的分区列表
ls -lSr |more 以尺寸大小排列文件和目录
du -sh dir1 估算目录 'dir1' 已经使用的磁盘空间'
du -sk * | sort -rn 以容量大小为依据依次显示文件和目录的大小
rpm -q -a --qf '%10{SIZE}t%{NAME}n' | sort -k1,1n 以大小为依据依次显示已安装的rpm包所使用的空间 (fedora, redhat类系统)
dpkg-query -W -f='${Installed-Size;10}t${Package}n' | sort -k1,1n 以大小为依据显示已安装的deb包所使用的空间 (ubuntu, debian类系统)
用户和群组
groupadd group_name 创建一个新用户组
groupdel group_name 删除一个用户组
groupmod -n new_group_name old_group_name 重命名一个用户组
useradd -c "Name Surname " -g admin -d /home/user1 -s /bin/bash user1 创建一个属于 "admin" 用户组的用户
useradd user1 创建一个新用户
userdel -r user1 删除一个用户 ( '-r' 排除主目录)
usermod -c "User FTP" -g system -d /ftp/user1 -s /bin/nologin user1 修改用户属性
passwd 修改口令
passwd user1 修改一个用户的口令 (只允许root执行)
chage -E 2005-12-31 user1 设置用户口令的失效期限
pwck 检查 '/etc/passwd' 的文件格式和语法修正以及存在的用户
grpck 检查 '/etc/passwd' 的文件格式和语法修正以及存在的群组
newgrp group_name 登陆进一个新的群组以改变新创建文件的预设群组
文件的权限 - 使用 "+" 设置权限,使用 "-" 用于取消
ls -lh 显示权限
ls /tmp | pr -T5 -W$COLUMNS 将终端划分成5栏显示
chmod ugo+rwx directory1 设置目录的所有人(u)、群组(g)以及其他人(o)以读(r )、写(w)和执行(x)的权限
chmod go-rwx directory1 删除群组(g)与其他人(o)对目录的读写执行权限
chown user1 file1 改变一个文件的所有人属性
chown -R user1 directory1 改变一个目录的所有人属性并同时改变改目录下所有文件的属性
chgrp group1 file1 改变文件的群组
chown user1:group1 file1 改变一个文件的所有人和群组属性
find / -perm -u+s 罗列一个系统中所有使用了SUID控制的文件
chmod u+s /bin/file1 设置一个二进制文件的 SUID 位 - 运行该文件的用户也被赋予和所有者同样的权限
chmod u-s /bin/file1 禁用一个二进制文件的 SUID位
chmod g+s /home/public 设置一个目录的SGID 位 - 类似SUID ,不过这是针对目录的
chmod g-s /home/public 禁用一个目录的 SGID 位
chmod o+t /home/public 设置一个文件的 STIKY 位 - 只允许合法所有人删除文件
chmod o-t /home/public 禁用一个目录的 STIKY 位
文件的特殊属性 - 使用 "+" 设置权限,使用 "-" 用于取消
chattr +a file1 只允许以追加方式读写文件
chattr +c file1 允许这个文件能被内核自动压缩/解压
chattr +d file1 在进行文件系统备份时,dump程序将忽略这个文件
chattr +i file1 设置成不可变的文件,不能被删除、修改、重命名或者链接
chattr +s file1 允许一个文件被安全地删除
chattr +S file1 一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘
chattr +u file1 若文件被删除,系统会允许你在以后恢复这个被删除的文件
lsattr 显示特殊的属性
打包和压缩文件
bunzip2 file1.bz2 解压一个叫做 'file1.bz2'的文件
bzip2 file1 压缩一个叫做 'file1' 的文件
gunzip file1.gz 解压一个叫做 'file1.gz'的文件
gzip file1 压缩一个叫做 'file1'的文件
gzip -9 file1 最大程度压缩
rar a file1.rar test_file 创建一个叫做 'file1.rar' 的包
rar a file1.rar file1 file2 dir1 同时压缩 'file1', 'file2' 以及目录 'dir1'
rar x file1.rar 解压rar包
unrar x file1.rar 解压rar包
tar -cvf archive.tar file1 创建一个非压缩的 tarball
tar -cvf archive.tar file1 file2 dir1 创建一个包含了 'file1', 'file2' 以及 'dir1'的档案文件
tar -tf archive.tar 显示一个包中的内容
tar -xvf archive.tar 释放一个包
tar -xvf archive.tar -C /tmp 将压缩包释放到 /tmp目录下
tar -cvfj archive.tar.bz2 dir1 创建一个bzip2格式的压缩包
tar -jxvf archive.tar.bz2 解压一个bzip2格式的压缩包
tar -cvfz archive.tar.gz dir1 创建一个gzip格式的压缩包
tar -zxvf archive.tar.gz 解压一个gzip格式的压缩包
zip file1.zip file1 创建一个zip格式的压缩包
zip -r file1.zip file1 file2 dir1 将几个文件和目录同时压缩成一个zip格式的压缩包
unzip file1.zip 解压一个zip格式压缩包
RPM 包 - (Fedora, Redhat及类似系统)
rpm -ivh package.rpm 安装一个rpm包
rpm -ivh --nodeeps package.rpm 安装一个rpm包而忽略依赖关系警告
rpm -U package.rpm 更新一个rpm包但不改变其配置文件
rpm -F package.rpm 更新一个确定已经安装的rpm包
rpm -e package_name.rpm 删除一个rpm包
rpm -qa 显示系统中所有已经安装的rpm包
rpm -qa | grep httpd 显示所有名称中包含 "httpd" 字样的rpm包
rpm -qi package_name 获取一个已安装包的特殊信息
rpm -qg "System Environment/Daemons" 显示一个组件的rpm包
rpm -ql package_name 显示一个已经安装的rpm包提供的文件列表
rpm -qc package_name 显示一个已经安装的rpm包提供的配置文件列表
rpm -q package_name --whatrequires 显示与一个rpm包存在依赖关系的列表
rpm -q package_name --whatprovides 显示一个rpm包所占的体积
rpm -q package_name --scripts 显示在安装/删除期间所执行的脚本l
rpm -q package_name --changelog 显示一个rpm包的修改历史
rpm -qf /etc/httpd/conf/httpd.conf 确认所给的文件由哪个rpm包所提供
rpm -qp package.rpm -l 显示由一个尚未安装的rpm包提供的文件列表
rpm --import /media/cdrom/RPM-GPG-KEY 导入公钥数字证书
rpm --checksig package.rpm 确认一个rpm包的完整性
rpm -qa gpg-pubkey 确认已安装的所有rpm包的完整性
rpm -V package_name 检查文件尺寸、 许可、类型、所有者、群组、MD5检查以及最后修改时间
rpm -Va 检查系统中所有已安装的rpm包- 小心使用
rpm -Vp package.rpm 确认一个rpm包还未安装
rpm2cpio package.rpm | cpio --extract --make-directories bin 从一个rpm包运行可执行文件
rpm -ivh /usr/src/redhat/RPMS/arch/package.rpm 从一个rpm源码安装一个构建好的包
rpmbuild --rebuild package_name.src.rpm 从一个rpm源码构建一个 rpm 包
YUM 软件包升级器 - (Fedora, RedHat及类似系统)
yum install package_name 下载并安装一个rpm包
yum localinstall package_name.rpm 将安装一个rpm包,使用你自己的软件仓库为你解决所有依赖关系
yum update package_name.rpm 更新当前系统中所有安装的rpm包
yum update package_name 更新一个rpm包
yum remove package_name 删除一个rpm包
yum list 列出当前系统中安装的所有包
yum search package_name 在rpm仓库中搜寻软件包
yum clean packages 清理rpm缓存删除下载的包
yum clean headers 删除所有头文件
yum clean all 删除所有缓存的包和头文件
DEB 包 (Debian, Ubuntu 以及类似系统)
dpkg -i package.deb 安装/更新一个 deb 包
dpkg -r package_name 从系统删除一个 deb 包
dpkg -l 显示系统中所有已经安装的 deb 包
dpkg -l | grep httpd 显示所有名称中包含 "httpd" 字样的deb包
dpkg -s package_name 获得已经安装在系统中一个特殊包的信息
dpkg -L package_name 显示系统中已经安装的一个deb包所提供的文件列表
dpkg --contents package.deb 显示尚未安装的一个包所提供的文件列表
dpkg -S /bin/ping 确认所给的文件由哪个deb包提供
查看文件内容
cat file1 从第一个字节开始正向查看文件的内容
tac file1 从最后一行开始反向查看一个文件的内容
more file1 查看一个长文件的内容
less file1 类似于 'more' 命令,但是它允许在文件中和正向操作一样的反向操作
head -2 file1 查看一个文件的前两行
tail -2 file1 查看一个文件的最后两行
tail -f /var/log/messages 实时查看被添加到一个文件中的内容
文本处理
cat file1 file2 ... | command <> file1_in.txt_or_file1_out.txt general syntax for text manipulation using PIPE, STDIN and STDOUT
cat file1 | command( sed, grep, awk, grep, etc...) > result.txt 合并一个文件的详细说明文本,并将简介写入一个新文件中
cat file1 | command( sed, grep, awk, grep, etc...) >> result.txt 合并一个文件的详细说明文本,并将简介写入一个已有的文件中
grep Aug /var/log/messages 在文件 '/var/log/messages'中查找关键词"Aug"
grep ^Aug /var/log/messages 在文件 '/var/log/messages'中查找以"Aug"开始的词汇
grep [0-9] /var/log/messages 选择 '/var/log/messages' 文件中所有包含数字的行
grep Aug -R /var/log/* 在目录 '/var/log' 及随后的目录中搜索字符串"Aug"
sed 's/stringa1/stringa2/g' example.txt 将example.txt文件中的 "string1" 替换成 "string2"
sed '/^$/d' example.txt 从example.txt文件中删除所有空白行
sed '/ *#/d; /^$/d' example.txt 从example.txt文件中删除所有注释和空白行
echo 'esempio' | tr '[:lower:]' '[:upper:]' 合并上下单元格内容
sed -e '1d' result.txt 从文件example.txt 中排除第一行
sed -n '/stringa1/p' 查看只包含词汇 "string1"的行
sed -e 's/ $//' example.txt 删除每一行最后的空白字符
sed -e 's/stringa1//g' example.txt 从文档中只删除词汇 "string1" 并保留剩余全部
sed -n '1,5p;5q' example.txt 查看从第一行到第5行内容
sed -n '5p;5q' example.txt 查看第5行
sed -e 's/00/0/g' example.txt 用单个零替换多个零
cat -n file1 标示文件的行数
cat example.txt | awk 'NR%2==1' 删除example.txt文件中的所有偶数行
echo a b c | awk '{print $1}' 查看一行第一栏
echo a b c | awk '{print $1,$3}' 查看一行的第一和第三栏
paste file1 file2 合并两个文件或两栏的内容
paste -d '+' file1 file2 合并两个文件或两栏的内容,中间用"+"区分
sort file1 file2 排序两个文件的内容
sort file1 file2 | uniq 取出两个文件的并集(重复的行只保留一份)
sort file1 file2 | uniq -u 删除交集,留下其他的行
sort file1 file2 | uniq -d 取出两个文件的交集(只留下同时存在于两个文件中的文件)
comm -1 file1 file2 比较两个文件的内容只删除 'file1' 所包含的内容
comm -2 file1 file2 比较两个文件的内容只删除 'file2' 所包含的内容
comm -3 file1 file2 比较两个文件的内容只删除两个文件共有的部分
字符设置和文件格式转换
dos2unix filedos.txt fileunix.txt 将一个文本文件的格式从MSDOS转换成UNIX
unix2dos fileunix.txt filedos.txt 将一个文本文件的格式从UNIX转换成MSDOS
recode ..HTML < page.txt > page.html 将一个文本文件转换成html
recode -l | more 显示所有允许的转换格式
文件系统分析
badblocks -v /dev/hda1 检查磁盘hda1上的坏磁块
fsck /dev/hda1 修复/检查hda1磁盘上linux文件系统的完整性
fsck.ext2 /dev/hda1 修复/检查hda1磁盘上ext2文件系统的完整性
e2fsck /dev/hda1 修复/检查hda1磁盘上ext2文件系统的完整性
e2fsck -j /dev/hda1 修复/检查hda1磁盘上ext3文件系统的完整性
fsck.ext3 /dev/hda1 修复/检查hda1磁盘上ext3文件系统的完整性
fsck.vfat /dev/hda1 修复/检查hda1磁盘上fat文件系统的完整性
fsck.msdos /dev/hda1 修复/检查hda1磁盘上dos文件系统的完整性
dosfsck /dev/hda1 修复/检查hda1磁盘上dos文件系统的完整性
初始化一个文件系统
mkfs /dev/hda1 在hda1分区创建一个文件系统
mke2fs /dev/hda1 在hda1分区创建一个linux ext2的文件系统
mke2fs -j /dev/hda1 在hda1分区创建一个linux ext3(日志型)的文件系统
mkfs -t vfat 32 -F /dev/hda1 创建一个 FAT32 文件系统
fdformat -n /dev/fd0 格式化一个软盘
mkswap /dev/hda3 创建一个swap文件系统
备份
dump -0aj -f /tmp/home0.bak /home 制作一个 '/home' 目录的完整备份
dump -1aj -f /tmp/home0.bak /home 制作一个 '/home' 目录的交互式备份
restore -if /tmp/home0.bak 还原一个交互式备份
rsync -rogpav --delete /home /tmp 同步两边的目录
rsync -rogpav -e ssh --delete /home ip_address:/tmp 通过SSH通道rsync
rsync -az -e ssh --delete ip_addr:/home/public /home/local 通过ssh和压缩将一个远程目录同步到本地目录
rsync -az -e ssh --delete /home/local ip_addr:/home/public 通过ssh和压缩将本地目录同步到远程目录
dd bs=1M if=/dev/hda | gzip | ssh user@ip_addr 'dd of=hda.gz' 通过ssh在远程主机上执行一次备份本地磁盘的操作
dd if=/dev/sda of=/tmp/file1 备份磁盘内容到一个文件
tar -Puf backup.tar /home/user 执行一次对 '/home/user' 目录的交互式备份操作
( cd /tmp/local/ && tar c . ) | ssh -C user@ip_addr 'cd /home/share/ && tar x -p' 通过ssh在远程目录中复制一个目录内容
( tar c /home ) | ssh -C user@ip_addr 'cd /home/backup-home && tar x -p' 通过ssh在远程目录中复制一个本地目录
tar cf - . | (cd /tmp/backup ; tar xf - ) 本地将一个目录复制到另一个地方,保留原有权限及链接
find /home/user1 -name '.txt' | xargs cp -av --target-directory=/home/backup/ --parents 从一个目录查找并复制所有以 '.txt' 结尾的文件到另一个目录
find /var/log -name '.log' | tar cv --files-from=- | bzip2 > log.tar.bz2 查找所有以 '.log' 结尾的文件并做成一个bzip包
dd if=/dev/hda of=/dev/fd0 bs=512 count=1 做一个将 MBR (Master Boot Record)内容复制到软盘的动作
dd if=/dev/fd0 of=/dev/hda bs=512 count=1 从已经保存到软盘的备份中恢复MBR内容
网络 - (以太网和WIFI无线)
ifconfig eth0 显示一个以太网卡的配置
ifup eth0 启用一个 'eth0' 网络设备
ifdown eth0 禁用一个 'eth0' 网络设备
ifconfig eth0 192.168.1.1 netmask 255.255.255.0 控制IP地址
ifconfig eth0 promisc 设置 'eth0' 成混杂模式以嗅探数据包 (sniffing)
dhclient eth0 以dhcp模式启用 'eth0'
ABD命令
\1. 显示系统中全部Android平台:
android list targets
\2. 显示系统中全部AVD(模拟器):
android list avd
\3. 创建AVD(模拟器):
android create avd --name 名称 --target 平台编号
\4. 启动模拟器:
emulator -avd 名称 -sdcard ~/名称.img (-skin 1280x800)
\5. 删除AVD(模拟器):
android delete avd --name 名称
\6. 创建SDCard:
mksdcard 1024M ~/名称.img
\7. AVD(模拟器)所在位置:
Linux(~/.android/avd) Windows(C:\Documents and Settings\Administrator.android\avd)
\8. 启动DDMS:
ddms
\9. 显示当前运行的全部模拟器:
adb devices
\10. 对某一模拟器执行命令:
abd -s 模拟器编号 命令
\11. 安装应用程序:
adb install -r 应用程序.apk
\12. 获取模拟器中的文件:
adb pull
\13. 向模拟器中写文件:
adb push
\14. 进入模拟器的shell模式:
adb shell
\15. 启动SDK,文档,实例下载管理器:
android
\16. 缷载apk包:
adb shell
cd data/app
rm apk包
exit
adb uninstall apk包的主包名
adb install -r apk包
\17. 查看adb命令帮助信息:
adb help
\18. 在命令行中查看LOG信息:
adb logcat -s 标签名
\19. adb shell后面跟的命令主要来自:
源码\system\core\toolbox目录和源码\frameworks\base\cmds目录。
\20. 删除系统应用:
adb remount (重新挂载系统分区,使系统分区重新可写)。
adb shell
cd system/app
rm *.apk
\21. 获取管理员权限:
adb root
\22. 启动Activity:
adb shell am start -n 包名/包名+类名(-n 类名,-a action,-d date,-m MIME-TYPE,-ccategory,-e 扩展数据,等)。
23、发布端口:
你可以设置任意的端口号,作为主机向模拟器或设备的请求端口。如:
adb forward tcp:5555 tcp:8000
24、复制文件:
你可向一个设备或从一个设备中复制文件,
复制一个文件或目录到设备或模拟器上:
adb push
如:adb push test.txt /tmp/test.txt
从设备或模拟器上复制一个文件或目录:
adb pull
如:adb pull /addroid/lib/libwebcore.so .
25、搜索模拟器/设备的实例:
取得当前运行的模拟器/设备的实例的列表及每个实例的状态:
adb devices
26、查看bug报告:
adb bugreport
27、记录无线通讯日志:
一般来说,无线通讯的日志非常多,在运行时没必要去记录,但我们还是可以通过命令,设置记录:
adb shell
logcat -b radio
28、获取设备的ID和序列号:
adb get-product
adb get-serialno
29、访问数据库SQLite3
adb shell
sqlite3
#cd system/sd/data //进入系统内指定文件夹
#ls //列表显示当前文件夹内容
#rm -r xxx //删除名字为xxx的文件夹及其里面的所有文件
#rm xxx //删除文件xxx
#rmdir xxx //删除xxx的文件夹
30、点亮屏幕
adb shellinput keyevent 82
31、日志相关:
日志
命令行显示Log
复制代码 代码如下:
adb logcat
根据tagname过滤
复制代码 代码如下:
adb logcat -s TAG_NAME
adb logcat -s TAG_NAME_1 TAG_NAME_2
#example
adb logcat -s TEST
adb logcat -s TEST MYAPP
优先过滤
显示一个特定的优先级警告及以上的日志。
复制代码 代码如下:
adb logcat "*:PRIORITY"
# example
adb logcat "*:W"
优先级:
V — 细则 (最低优先级)
D — 调试
I — 信息
W — 警告
E — 错误
F — 致命
S — 静默 (最高优先级,不会打印任何信息)
使用grep过滤
这个很像在Linux上使用管道命令一样,需系统支持
复制代码 代码如下:
adb logcat | grep "SEARCH_TERM"
adb logcat | grep "SEARCH_TERM_1|SEARCH_TERM_2"
#example
adb logcat | grep "Exception"
adb logcat | grep "Exception|Error"
清除日志块
使用来清除旧的日志
复制代码 代码如下:
adb logcat -c
adb对于Android程序员来说在日常的工作中使用频率很高,现将自己工作中常用的adb命令总结一下备忘,方便查询,也供大家参考。查看应用内存占用,耗电信息,启动时间,wakelock,跑monkey的命令在之前的应用性能优化中起了不小的作用。以下adb命令的测试机器为小米3,其中package_name代表包名。
基础脚本:
1、启动adb服务
adb start-server
2、终止adb服务
adb kill-server
3、进入adb运行环境
adb shell
4、获取帮助 里面有adb的各种命令和参数的介绍
adb help
5、查看adb版本
adb version
6、以root权限重启adb
adb root
7、将system分区重新挂在为可读写分区,此命令在操作系统目录时很重要
adb remount
8、重启设备,可选参数进入bootloader(刷机模式)或recovery(恢复模式)
adb reboot [bootloader|recovery]
apk相关:
1、安装apk
adb install test.apk -r 覆盖安装,保留数据和缓存文件 -d 解决低版本version问题 -s 安装apk到sd卡
2、卸载apk
adb uninstall -k <package_name>
可选参数-k的作用为卸载软件但是保留配置和缓存文件
3、查看app相关所有信息,包括action,codepath,version,需要的权限等等信息
adb shell dumpsys package <package_name>
4、查看app的路径
adb shell pm path <package_name>
查看了一个普通app的路径,如下,位于data/app下面的普通app
package:/data/app/com.tencent.test-1/base.apk
5、查看apk的版本信息
adb shell dumpsys package <package_name> | grepversion
如果你得到的是下图的两个version版本,则为系统app,下面是系统app本身的版本,上面是升级之后的系统app的版本信息
versionCode=8 targetSdk=22 versionName=V0.08 versionCode=6targetSdk=22 versionName=V0.0
6、启动activity
查看:
adb shell dumpsys window | findstr mCurrentFocus 命令查看当前运行的包名和Activity
adb shell am start -n<package_name>/.<activity_class_name>
C:\Users\lenovo>adb shell
venus:/ $ ^C
C:\Users\lenovo>adb shell dumpsys window | findstrmCurrentFocus
mCurrentFocus=Window{3bd0b18 u0com.android.settings/com.asu.msettings.AsuSettingsActiv
C:\Users\lenovo>adb shell am start -ncom.android.settings/com.asu.msettings.AsuSettingsA
Starting: Intent { cmp=com.android.settings/com.asu.msettings.AsuSettingsActivityAlias}
6.16
清楚应用数据adb shell pm path
输出安装包的APK路径
adb shell pm clear
删除与包相关的所有数据:清除数据和缓存
7、获得应用的启动时间,可以很方便地获取应用的启动时间
adb shell am start -W<package_name>/.<activity_class_name>
试验结果如下:
adb shell am start -Wcom.cc.test/com.painter.test.PainterMainActivity Starting: Intent {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER]cmp=com.cc.test/com.painter.test.PainterMainActivity } Status: ok Activity:com.cc.test/com.painter.test.PainterMainActivity ThisTime: 355 TotalTime: 355WaitTime: 365 Complete
返回的几个结果,以WaitTime为准,返回的是从startActivity到应用第一帧完全显示的时间。
8、启动service,am的-n参数表示组件,-a参数表示命令,-a后面的参数为manifest中定义的service的action
adb shell am startservice -n<package_name>/.<service_class_name>
也可:
adb shell am startservice -a"android.intent.action.CALL"
9、发送广播
adb shell am broadcast -a"android.intent.action.AdupsFota.WriteCommandReceiver"
广播可以带上不同类型的参数,–es为string参数类型,–ei为int参数类型,–ez为boolean参数类型
adb shell am broadcast -a "android.intent.action.AdupsFota.WriteCommandReceiver"--es test_string "this is test string"
10、查看某个app的进程相关信息
10.1
adb shell ps <package_name|PID>
例如
adb shell ps com.ma.app:push USER PID PPID VSIZE RSS WCHAN PC NAME u0_a116 5483 304 1776564 55112sys_epoll_ 00000000 S com.ma.app:push
小米手机上测试成功,在另外一个设备上,如果ps后面的参数是包名则显示不了进程的详细信息,参见下面的方式获取
10.2
adb shell ps | grep <package_name>
11、杀掉某个进程,一般用于模拟某个bug复现
adb shell kill pidNumber
12、查看某一个app的内存占用
adb shell dumpsys meminfo <package_name|PID>
结果如下,其中的Heap size包括了Dalvik Heap和Native Heap,平时我们所说的内存限制指的是Dalvik Heap。
Pss PrivatePrivate Swapped Heap Heap Heap Total Dirty CleanDirty Size Alloc Free ------ ------ ------ ------ ------ ------ ------ Native Heap 1895618940 0 4696 44288 21352 22935 Dalvik Heap 60102 60088 0 26192 104486 88285 16201 App Summary Pss(KB) ------ Java Heap: 61640 Native Heap:18940 Code: 3356 Stack: 428 Graphics: 16876 Private Other: 3840 System: 2031 ...
13、查看单个应用程序的最大内存限制
adb shell getprop | grep heapgrowthlimit
得到的结果为128M: [dalvik.vm.heapgrowthlimit]: [128m]
这就是说Dalvik Heap size的最大值超过了128M,就很可能发生OOM
14、获取单个应用的电量消耗信息
Battery Historian是Android 5.0开始引入的,下面的命令为获取单个app的电量消耗信息,获取系统耗电信息见下节
adb shell dumpsys batterystats ><package_name> > xxx.txt
上面的电量信息为原始数据,可以通过google编写的historian.py脚本把数据信息转换为可读性很好的html文件,类似TraceView生成的列表数据,之前在做app性能优化的时候起了很大的作用
python historian.py xxx.txt > xxx.html
15、跑monkey,个人很喜欢这个命令,运行过程中,应用程序会不断切换画面,按照选定的不同级别反馈信息,还可以看到执行过程报告和生成的事件。测试应用的稳定性时很实用。现在studio也有了monkeyrunner的tool
adb shell monkey -v -p <package_name> 500 -p 对象包 -v 反馈信息级别
:Monkey: seed=1493061025112 count=500 :AllowPackage:com.tencent.mm.app:push :IncludeCategory: android.intent.category.LAUNCHER:IncludeCategory: android.intent.category.MONKEY ** No activities found to run,monkey aborted.
系统相关
1、查看设备名称,豌豆荚等应用就是通过此来获得设备的名称
adb shell cat /system/build.prop/
结果:
ro.product.model=MI 3W ro.product.brand=Xiaomi
2、查看手机分辨率有两种方法,第二种方法最为简洁
2.1
adb shell dumpsys window | grep Surface
grep是一个非常有用的参数,具体含义和用法大家自行google一下,试验结果为1080 * 1920:
Surface: shown=false layer=21000 alpha=1.0rect=(0.0,0.0) 1080.0 x 1920.0
2.2.
adb shell wm size
返回结果为:
Physical size: 1080x1920
3、查看手机sdk版本
adb shell getprop | grep version
运行上面的命令后,列出来的version中[ro.build.version.release]: [6.0.1]即为手机sdk版本
4、查看手机型号信息
adb shell getprop | grep product
运行此命令之后,能看到product,board,brand和cpu等等的型号
5、获取序列号,获取到的序列号即为adb devices列出来的序列号
adb get-serialno
6、查看连接的设备
adb devices
如果有多个设备连接,想对其中的某一设备进行操作,就需要在此命令的后面加参数
adb [-d|-e|-s
假如有两个真机连接了我的电脑,adb devices获取到的数据如下
List of devices attached 1b71651 device 12sdfsd device
进入1b71651设备的命令为:
adb -s 1b71651 shell
7、查看wifi密码(需要root权限)
adb shell cat data/misc/wifi/*.conf
8、查看wifi_mac
adb shell cat /sys/class/net/wlan0/address
运行此命令,93:a1:a2:91:d1:c1是小米3的wifi_mac地址
9、查看后台services信息
adb shell service list
运行结果为
Found 126 services: 0 miui.whetstone.net:[miui.whetstone.INetworkService] 1 miui.whetstone.power: [miui.whetstone.power]...
10、查看系统当前内存占用,为总述
adb shell cat /proc/meminfo
运行结果:
MemTotal: 1893504 kB MemFree: 81200 kBBuffers: 14828 kB Cached: 244152 kB SwapCached: 15152 kB Active: 541680 kB Inactive: 575280 kB ...
11、查看各进程详细内存占用和系统的内存占用有几种方法
11.1
adb shell dumpsys meminfo
Total PSS SWAP by process: 97858 kB: 34944 kB: com.android.systemui (pid2769) ... Total RAM: 1893504 kB (statusnormal) Free RAM: 344212 kB (117992 cached pss + 136016 cached kernel + 90204free)
Total PSS 信息就是你的应用真正占据的内存大小,通过这个信息,可以轻松判别手机中哪些程序占内存比较大。
11.2 查看各进程内存的另一方法 不是所有设备都支持
adb shell procrank
运行结果如下:
PID Vss Rss Pss Uss cmdline 496 1810184K92744K 57607K 48348K system_server 743 1847492K 84492K 52117K 46796Kcom.android.systemui .... ------------ ------ 328259K 261484K TOTALRAM: 2061012K total, 889152K free, 40940K buffers, 612032K cached, 300K shmem,62556K slab
其中
VSS – Virtual Set Size 虚拟耗用内存(包含共享库占用的内存) RSS – Resident Set Size 实际使用物理内存(包含共享库占用的内存) PSS – Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存) USS – Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
11.3 查看设备上进程的cpu和内存占用情况
adb shell top
12、查看系统耗电情况
adb shell dumpsys batterystats > xxx.txt
13、查看系统设置的闹钟
adb shell dumpsys alarm
14、查看系统的wakelock,不合理的使用wakelock会导致系统耗电加剧
adb shell dumpsys power
返回结果:
Wake Locks: size=2 PARTIAL_WAKE_LOCK 'AudioMix' (uid=1013, pid=236,ws=WorkSource{10018}) PARTIAL_WAKE_LOCK 'Android.media.MediaPlayer' ON_AFTER_RELEASE (uid=10018, pid=24023,ws=null)
文件操作相关:
1、拷贝文件/目录到设备
adb push
2、从设备拷贝文件/目录,-a参数保留了文件的时间戳和模式
adb pull [-a]
3、查看设备log,和studio和eclipse的logcat相同,可通过参数控制输出的日志
adb logcat -s 过滤指定参数log -v time 保留日志时间 >> 追加写 > 覆盖写
下面的命令含义为:打印出log信息中的时间并且包含关键字“Test” 的所有log以覆盖写的方式保存到test文件
adb logcat -v time -s Test > test.txt
4、列出目录下的文件和文件夹,可选参数-al可查看文件和文件夹的详细信息
adb shell ls [-al]
5、进入文件夹
adb shell cd
6、查看文件
adb shell cat
7、重命名文件
adb shell rename path/oldfilename path/newfilename
8、删除文件/文件夹
adb shell rm path/filename -r 可选参数用于删除文件夹及下面的所有文件 eg:adb shell rm -r
9、移动文件
adb shell mv path/filename newpath/filename
10、拷贝文件
adb shell cp file newpath/file1
11、创建目录
adb shell mkdir path/folder
12、设置文件最高读写权限
adb shell chmod 777 filename
13、手机未root 查看data/data/某一app文件信息
笔者的小米3没有root,但是又想方便地查看data/data/目录下的一些文件,直接进入data会提示没有权限,查看的方式为进入data/data/后,运行下面的命令,就能直接进入你应用的包下了,可通用cp或者mv拷贝或移动到sdcard目录进行其他操作
run-as package_name
数据库相关
数据库的操作和今天的主题关系不大,增删改查操作不再列举。但是平时的开发过程中只是查看数据库中某个表或者某个字段,也无需每次都pull出来之后再查看,用命令行会更加方便快捷,进入到test.db的目录后,运行如下命令
1、操作db
sqlite3 test.db
操作:
通过adb操作手机UI并不常用,但在有的场景下会非常有用,比如测试自动化,访问在远端服务器上的手机等。
发送keyevent和文本
命令行
adb shell input keyevent {key_code}
adb shell input text {text}
keyevent列表
0 –> “KEYCODE_UNKNOWN”1 –> “KEYCODE_MENU”
2 –> “KEYCODE_SOFT_RIGHT”
3 –> “KEYCODE_HOME”
4 –> “KEYCODE_BACK”
5 –> “KEYCODE_CALL”
6 –> “KEYCODE_ENDCALL”
7 –> “KEYCODE_0”
8 –> “KEYCODE_1”
9 –> “KEYCODE_2”
10 –> “KEYCODE_3”
11 –> “KEYCODE_4”
12 –> “KEYCODE_5”
13 –> “KEYCODE_6”
14 –> “KEYCODE_7”
15 –> “KEYCODE_8”
16 –> “KEYCODE_9”
17 –> “KEYCODE_STAR”
18 –> “KEYCODE_POUND”
19 –> “KEYCODE_DPAD_UP”
20 –> “KEYCODE_DPAD_DOWN”
21 –> “KEYCODE_DPAD_LEFT”
22 –> “KEYCODE_DPAD_RIGHT”
23 –> “KEYCODE_DPAD_CENTER”
24 –> “KEYCODE_VOLUME_UP”
25 –> “KEYCODE_VOLUME_DOWN”
26 –> “KEYCODE_POWER”
27 –> “KEYCODE_CAMERA”
28 –> “KEYCODE_CLEAR”
29 –> “KEYCODE_A”
30 –> “KEYCODE_B”
31 –> “KEYCODE_C”
32 –> “KEYCODE_D”
33 –> “KEYCODE_E”
34 –> “KEYCODE_F”
35 –> “KEYCODE_G”
36 –> “KEYCODE_H”
37 –> “KEYCODE_I”
38 –> “KEYCODE_J”
39 –> “KEYCODE_K”
40 –> “KEYCODE_L”
41 –> “KEYCODE_M”
42 –> “KEYCODE_N”
43 –> “KEYCODE_O”
44 –> “KEYCODE_P”
45 –> “KEYCODE_Q”
46 –> “KEYCODE_R”
47 –> “KEYCODE_S”
48 –> “KEYCODE_T”
49 –> “KEYCODE_U”
50 –> “KEYCODE_V”
51 –> “KEYCODE_W”
52 –> “KEYCODE_X”
53 –> “KEYCODE_Y”
54 –> “KEYCODE_Z”
55 –> “KEYCODE_COMMA”
56 –> “KEYCODE_PERIOD”
57 –> “KEYCODE_ALT_LEFT”
58 –> “KEYCODE_ALT_RIGHT”
59 –> “KEYCODE_SHIFT_LEFT”
60 –> “KEYCODE_SHIFT_RIGHT”
61 –> “KEYCODE_TAB”
62 –> “KEYCODE_SPACE”
63 –> “KEYCODE_SYM”
64 –> “KEYCODE_EXPLORER”
65 –> “KEYCODE_ENVELOPE”
66 –> “KEYCODE_ENTER”
67 –> “KEYCODE_DEL”
68 –> “KEYCODE_GRAVE”
69 –> “KEYCODE_MINUS”
70 –> “KEYCODE_EQUALS”
71 –> “KEYCODE_LEFT_BRACKET”
72 –> “KEYCODE_RIGHT_BRACKET”
73 –> “KEYCODE_BACKSLASH”
74 –> “KEYCODE_SEMICOLON”
75 –> “KEYCODE_APOSTROPHE”
76 –> “KEYCODE_SLASH”
77 –> “KEYCODE_AT”
78 –> “KEYCODE_NUM”
79 –> “KEYCODE_HEADSETHOOK”
80 –> “KEYCODE_FOCUS”
81 –> “KEYCODE_PLUS”
82 –> “KEYCODE_MENU”
83 –> “KEYCODE_NOTIFICATION”
84 –> “KEYCODE_SEARCH”
85 –> “TAG_LAST_KEYCODE”
比如:按Home键:adb shell input keyevent KEYCODE_HOME
滑动屏幕
命令行
# 从(x1, y1)滑动到(x2, y2)
adb shell input touchscreen swipe {x1} {y1} {x2} {y2}
点击屏幕
命令行
# 点击屏幕坐标(x, y)
adb shell input touchscreen tap {x} {y}
ADB 录制屏幕命令
· 对于Android4.4的上的手机,系统自带了一个命令screenrecord,我们可以很方便的使用。
· 录制命令
· adb shell screenrecord /sdcard/test.mp4
视频保存目录可以自己指定,如上面的/sdcard/test.mp4,命令执行后会一直录制180s,按下ctrl+c可以提前结束录制
输入 –time-limit N,限制视频录制时间为N秒
· 设定视频分辨率
对于高分辨率的手机,录制的视频很大,我们分享又不需要这么大的
我们可以设置录制的视频分辨率
adb shell screenrecord --size 848*480 /sdcard/test.mp4
· 设定视频比特率
默认比特率是4M/s,为了分享方便,我们可以调低比特率为2M
adb shell screenrecord --bit-rate 2000000 /sdcard/test.mp4
· 获取视频文件
使用adb pull 即可把手机SD卡中视频获取到本地
adb pull /sdcard/test.mp4 .
设置时间:
查看内存:
adb shell
df
打电话:adb shell am start -a android.intent.action.CALL -d tel:10086
获取devicesname
cat /system/build.prop | grep "product"
adb shellgetprop ro.product.name
自动填充内存:adb shell ddif=/dev/zero of=/mnt/sdcard/bigfile
dd命令创建文件 可以跟参数,比如创建一个1G的文件....可以根据想创建的大小 更改后边的参数值(bs=xx count=xx)
adb shelldd if=/dev/zero of=/mnt/sdcard bs=1Mcount=1024
Monkey命令
1、最简单的monkey执行语句:(adb shell)monkey –p com.jianjiexuan.na –v 500 (对com.jianjiexuan.na 这个程序包单独进行一次500次的monkey测试)
名词解释:-p:用于约束限制,用此参数指定一个或多个包。指定包之后,Monkey将只允许系统启动指定的APP。如果不指定包,Monkey将允许系统启动设备中的所有APP。指定多个包:monkey -p –p -p -v 500-v:用于指定反馈信息级别(信息级别就是日志的详细程度),总共分3个级别,分别对应的参数如下表所示:
日志级别 Level 0
例 monkey –p com.jianjiexuan.na –v 500说明:缺省值,仅提供启动提示、测试完成和最终结果等少量信息
日志级别 Level 1
例 monkey –p com.jianjiexuan.na –v -v 500说明:提供较为详细的日志,包括每个发送到Activity的事件信息
日志级别 Level 2
例 monkey –p com.jianjiexuan.na –v -v -v 500
说明:最详细的日志,包括了测试中选中/未选中的Activity信息
2、延时及固定序列(adb shell)monkey -s 100 -p com.jianjiexuan.na – -throttle 1000 -v 500 (每次执行一次有效的事件后休眠1000毫秒)(adb shell)monkey -p com.jianjiexuan.na – -throttle 1000 – -randomize-throttle -v 500 (每次执行一次有效事件后随机延时0-200毫秒)名词解释:-s:用于指定伪随机数生成器的seed值,如果seed相同,则两次Monkey测试所产生的事件序列也相同的。出现问题下次可以重复同样的系列进行排错。–throttle:固定延时,用于指定用户操作(即事件)间的时延,单位是毫秒;–randomize-throttle:随机延时,用于指定用户操作(即事件)间的时延,单位是毫秒。
3、保存monkey运行结果1)保存在PC中adb shell monkey –p com.jianjiexuan.na –v 500 > d:\monkey\log.txt 2)保存在手机中手机端进入shell模式:adb shell monkey –p com.jianjiexuan.na –v 500 > /mnt/sdcard/monkey/log.txt
4、monkey事件百分比的调整(adb shell)monkey -p com.jianjiexuan.na -v – -pct-anyevent 100 500指定多个类型事件的百分比:monkey -p com.jianjiexuan.na -v –pct-anyevent 50 –pct-appswitch 20 500
名词解释:–pct-****:

设置某个事件的百分比。后面接数字(0-100),100即100%的概率执行该事件注意:各事件类型的百分比总数不能超过100%。如果不进行设置则显示默认百分比。
5、正在运行的monkey如何终止如在命令窗口端直接打印结果,想要停止monkey的运行,那么就再打开一个cmd命令窗口查看monkey的进程:adb shell ps | find “monkey”kill掉该进程就可以adb shell kill + 进程编号
自动化测试
举例来说一下你的自动化测试是怎么做的?
参考答案:就拿简历上的xxx项目来说吧,在编写脚本前,我们会对系统进行评估,确认这个系统可不可以实现UI自动化,如果可以的话,就筛选出能实现自动化测试的用例,一般优先把冒烟测试用例的转为成脚本。我们是用selenium工具来实现自动化,采用python脚本语言,基于unittest框架进行用例的编写。比如,下单这个功能的脚本,我们是这样做的:首先,我们会构建一个测试工程,测试工程包含testcase,主要用来存放测试用例,report用来存放测试报告,其次我们会把用例中公共的部分封装到public中,最后用runAllCase的python文件运行项目自动化用例,脚本调试完后,我们会用jenkins持续集成工具,设置脚本每天晚上10点跑一遍脚本,跑完后生成html格式的自动化测试报告。
自动化脚本失败的原因:
- 可能是测试环境的网络不稳定;
- 开发修改了代码没通知到测试人员修改脚本;
- 开发引入了新的问题。
测试脚本用到了哪些技术?
参考答案:元素定位,表单切换,模块调用,JS定位等等,脚本是基于python自带的unittest单元测试框架,采用了模块化方式编写,把复用性高的操作封装到公共模块中,如果脚本需要用到对应的操作,直接调用就可以了,如果元素发生变化,只需要调整元素封装的代码就可以了,提高测试用例的可维护性。
xpath和CSS定位方式的区别:
1、语法不一样;
2、CSS定位比较稳定。
脚本怎么组织的?(编写自动化脚本,你的思路是什么?)
参考答案:构建一个测试工程,测试工程包含testcase,主要用来存放测试用例,report用来存放测试报告,其次我们会把用例中公共的部分封装到public中,最后用runAllCase的python文件运行项目自动化用例。测试脚本使用的是python的unittest单元测试框架组织管理,将所有测试脚本通过单元测试框架组织起来运行,这样做的好处是,维护起来方便,可以生成测试html格式的测试报告,报告包括:测试用例,通过数,失败数。
自动化率多少?
一般是30%到40%,这个没有固定的,我们是优先将优先级高的测试用例,比如,冒烟测试的测试用例转换成自动化脚本的,后面有时间的时候再不断补充,能写多少写多少。
自动化脚本的通过率是多少?(注意这个题目的意思)
参考答案:这个说不准,如果没有什么异常情况,自动化脚本都是100%运行通过;如果异常情况比较多,比如出现测试环境不稳定,或者开发修改了代码没通知到测试人员及时修改脚本,又或者开发引入了新的问题等等,自动化脚本通过率可能80%都不到。
用那个方法判断元素是否显示
is_displayed()
你曾经都写过多少自动化测试用例?
这个具体没有算过。但是只要有时间,模块稳定的功能都会写。就拿上个项目来说,自动化测试用例大概写了将近有100-120条这样子吧。
python3 的数据类型有哪些?
int (整型)
float (浮点型)
str(字符串)
List(列表)
Tuple(元组)
Set(集合)
Dictionary(字典)
不可变数据(四个):int (整型)、float (浮点型)、str(字符串)、Tuple(元组)、Set(集合);
可变数据(两个):List(列表)、Dictionary(字典)。
面:unittest框架了解吗?
参考答案:unittest框架,由setUp()--环境预置,testCase()--- 测试用例 tearDown()----环境恢复,三大部分组成,unittest框架可组织执行测试用例,并且提供丰富的断言方法,判断测试用例是否通过,最终生成测试结果。
怎样用python连接mysql数据。
参考答案:我们之前主要是用python语言来写web端的自动化测试脚本,连接数据库的话,我们主要使用pymysql这个模块来进行连接的。一般在进行完自动化测试之后,我们会连接上数据库,将数据进行清除
用python做过接口测试自动化测试吗?
参考答案:我们之前主要是用python语言来写web端的自动化测试脚,接口是用Jmeter来做的,用python写接口的脚本也在网上学习过,主要使用到requests模块,但是工作中没用用过,到时候工作需要的话,再学一下应该没问题。
元素定位失败的原因
- 页面的元素未加载完成
- 元素的属性值不唯一
- 元素的属性值是动态值
- 元素在另外一个表单
- 元素在另外一个页面
自动化脚本,如何切换不同的浏览器
参考答案:使用对应的浏览器驱动,然后在脚本中更换不同的浏览器。
你的python水平很一般啊?(遇到这种否定你的问题,一定不能虚!)
参考答案:我现在掌握的python知识,做ui层的自动化测试是可以的,代码的封装,调用这些都没问题;我一般是会做,但不是很会用文字描述出来,我以注意到这点,现在也在加强提升自己的总结能力。
PS---重点强调:凡是遇到被面试官否定的,都要想办法怼回去,输也要输得精彩些,但是,怼回去的时候,要注意语气,要有礼有节,不卑不亢。
python怎么定义一个函数,怎么定义一个类
def 函数名:
函数体
class 类名:
属性
方法
有些元素,在谷歌浏览器上能定位,在火狐浏览器上定位失败,是什么原因呢?
参考答案:因为不同浏览器的内核不一样,他们的CSS样式不一样。
如何提高selenium脚本的执行速度?
- 提高网速;
- 少用sleep,多用隐式等待或显式等待。
- 提升电脑配置
元素定位的方式有哪些
d.find_element_by_id('id的值')
d.find_element_by_name('name的值')
d.find_element_by_class_name('class的值')
d.find_element_by_tag_name('标签名')
d.find_element_by_link_text('完整的文本链接')
d.find_element_by_partial_link_text('部分的文本链接')
d.find_element_by_css_selector('css表达式')
d.find_element_by_xpath('xpath表达式')
js定位
如何切换iframe
switch_to.frame()
如何切换窗口
switch_to.window()
鼠标悬停的方法是什么
鼠标悬停用到ActionChains类提供的move_to_element方法
如何定位下拉框
需要导入Select类,可以使用下标、值和文本定位
如何获取弹出警告框的text
switch_to.alert.text
什么样的项目适合做自动化
项目周期长,版本多,界面元素稳定的项目
selenium如何做兼容性测试
使用对应的浏览器驱动,然后在脚本中更换不同的浏览器。
为什么会生成HTML报告
使用了HTMLTestRunner第三方工具包来实现的
脚本运行出错,应该怎样定位,说出分析过程
运行结束之后我们会得到一个测试报告,我们根据测试报告先定位一下是脚本的原因还是程序的原因,一般来说脚本的原因在报告中都会显示出哪一行代码出错了,如果是程序的原因通常来说都是断言的问题。
如果系统有验证码,怎么做自动化?
- 去掉验证码。
- 设置万能验证码。
- 用python调用OCR模块,自己写代码来识别。这种方法可以识别出简单的验证码。
- 调用第三方平台提供的接口进行识别。比如:斐斐打码,尖叫数据这些平台接口。
setUp(),tearDown()和setUpClass(),tearDownClass()的区别:
参考答案:当测试用例有多个,setUp()和tearDown()就会被执行多次;不管测试用例有多少个,setUpClass()和tearDownClass()只会被执行一次。
python的第三方模块/标准库有哪些?
time,random,unittest,selenium,HTMLTestRunner
python的pass语句的作用是什么?
参考答案:占位符,当方法没有内容时,防止出现语法错误。
自动化写过哪些模块的脚本?
参考答案:主要是把冒烟测试的用例转化为脚本,比如,我这个xx商城系统,做自动化的模块有后台的上架商品,订单查询,添加团购活动,促销活动,前台的搜索商品,添加商品到购物车,下单等等。
元素的属性值是动态变化的,怎么定位这个元素?
参考答案:如果元素有属性值是动态变化的,我们就不要使用这个属性进行定位;我们可以使用这个元素的非动态变化,并且是唯一的值属性进行定位;也可以使用xpath或者css,使用层次+属性的方式定位。
webdriver的原理是什么?
参考答案:浏览器的驱动,接收客户端发过来的指令(指令就是我们的脚本),浏览器的驱动根据接收到的指令,驱动浏览器工作。
你们是怎么检查自动化的结果是不是正确的?
参考答案:我们会用unittest单元测试框架提供的断言方式来检查实际结果和预期结果是否一致,常用的断言方式有assertEqual(),assertIn(),还有一些其他的,不常用就没记了。
怎么样提升自动化脚本成功率
- 在容易失败的地方,加上sleep
- 尽量定位一些稳定的元素
- 使用try..except多中方式定位
run_all_case中有哪些内容?
run_all_case具体的内容不太记得了,一般都是直接使用的,一般需要修改的是测试报告的路径,测试用例的路径,还有用例的匹配规则。
自动化的优点和缺点?
自动化的优点的话,可以提升测试的效率,比如我们之前是将冒烟测试的用例转换成自动化用例。可以节省自己的测试时间。
缺点的话,可能他的执行速度比较慢,其次他对于测试人员的代码能力需要一定要求。
unittest单元测试怎么安装的?
参考答案:不需要安装,是python自带的,直接通过import 关键字引用就可以了。
pytest了解吗?
参考答案:也是python的一个单元测试框架,它的用法比unittest框架复杂些。自动化测试我们一般是基于unittest框架来做的,pytest用的少,以后工作需要,我业余时间学习一下,很快上手。
po(page object:页面对象)设计模式了解吗?
参考答案:po还是了解的。po是web自动化测试目前最佳的一种实践方式,简单来说就是类和类之间的封装和调用。
包括基础类、页面类、用例层等部分。目前正在往这个方面进阶脚本。
selenium的工作原理?
① 脚本启动driver
② driver去驱动浏览器作为远程服务器
③ 执行脚本发送请求
④ 服务器解析请求作出相应操作,并返回给客户端(脚本)
selenium自动化页面元素找不到存在异常的原因?
① 元素定位错误
② 页面加载时间过慢,需要查找的元素程序已经完成,单页面还未加载,此时可以加载页面等待时间
③ 有可能元素包含在iframe或者frame里面,需要切换。
如何去定位属性动态变化的元素?
属性动态变化是指该element没有固定的属性值,只能通过相对位置定位。
第一种方法:用findelements遍历
第二种方法:通过xpath的轴 parent / following-sibling / precent-sibling
如何去定位页面上动态加载的元素?
触发动态事件,继而findelement;如果是动态菜单,需要一级一级的find。
selenium调用js(execute_script),有哪些场景?
① 对input执行输入
② 对富文本框的操作
③ 滚动到指定位置操作
selenium如何处理web弹窗?js弹窗?
需要使用driver.switch_to.alert()
selenium可以处理window弹窗吗?
selenium本身是不可以处理windows弹窗的,但是可以借助AutoIT小工具来完成对windows弹窗的操作。比如 上传下载附件等
如何在定位元素后高亮元素(以调试为目的)?
使用javascript将元素的border或者背景颜色改成黄色或其他颜色即可
selenium是否支持桌面应用软件的自动化测试?
不支持。selenium是根据网页元素的属性来确定范围元素的
selenium是否有读取excel文件的库?
没有,需要借助第三方工具。例如Apache PIO插件
selenium是否可以向页面发送鼠标滚轮操作?
不能。
如何在webdriver中调用应用程序?
driver.get('url') 或者 driver.navigate().to('url')
selenium中常见的异常?
NoSuchElementException 找不到页面元素异常
ElementNoInteractac tableException
selenium为什么不推荐使用xpath定位?
selenium使用xpath定位时采用遍历页面的方式,性能指标较差。另外xpath定位有通过绝对路径定位的,有时会不准确;
而用css选择器定位比较简洁,运行速度更快,通常用于性能要求严格的场景。
如何判断一个页面上元素是否存在?
法1:用try...except 在代码块加上
法2:用elements定义组元素方法 然后根其元素个数len()<1 存在返回True, 不存在则返回False
法3:结合WebDriverWait和excepted_conditions条件判断(强烈推荐)
显示等待,每间隔1秒判断一次,30秒超时,存在返回True,不存在则返回False
如何定位动态元素?
动态元素有两种情况:
一个是属性动态,定位时,若id是动态的,就不要用id定位,用其他定位元素方法
另一个还是这个元素一会在页面上方,一会在下方,飘忽不定,定位方法也是一样,根据元素属性定位(元素的tag name属性是不会变的,动的只是class属性和style属性)
如何通过子元素定位父元素?
通过父元素定位子元素,可以通过二次定位来找到。
第一种:通过子元素定位父元素,selenium提供了parent方法,但是只能定位到父元素,却不能获取元素属性,也不能操作。
第二种:通过xpath的语法直接定位。 如.//*[@name="hello"]/.. 两个点代表父级元素。
如何截取一个元素的图片,不要截取全部图片?
首选截取当前页面并自定义保存
然后根据要截取元素图片的属性来获取该元素的坐标和大小 ele.location ele.size
然后分别left = ele.location['x']
top = ele.location['y']
right = ele.location['x'] + ele.size['width']
bottom = ele.location['y'] + ele.size['height']
获取该元素的图片的坐标大小
最后,再次打开刚开始保存的,通过image类中的crop方法(相当于拷贝该元素的一个矩形区域),然后做保存操作就可以了。
一个元素明明定位了,点击无效(也没报错),如何解决?
使用js点击,selenium有时候点击元素时会失效
# js 点击
js = 'document.getElementById('baidu').click()'
driver.execute_script(js)
如何提高脚本的稳定性?
首先只要页面一直没变过,说明定位方法是没问题的。
优化方向:① 自己写相对路径,多用id为节点查找,少用右键复制xpath,那种不稳定。
② 第二个影响因素就是等待了,sleep等待尽量少用(影响执行时间)
③ 定位元素方法重新封装,结合WebDriverWait和excepted_conditions判断元素方法,自己封装一套定位元素方法
提高selenium脚本的执行速度方式?
减少不必要的操作。
页面加载过多并且不影响测试,可设置超时时间中断页面加载。
设置等待时间时,可以sleep()固定的时间,检测到元素出现后中断等待也可以提高速度。
配置testNG实现多线程,在编写测试用例时,一定要实现松耦合,在服务器允许的情况下尽量设置多线程运行,提高执行速度。
selenium自动化时,在平时遇到过哪些问题?如何解决的?
比如动态id 、有iframe的情况、没加等待等因
selenium中隐藏元素定位,你该如何做?
隐藏元素可以正常定位到,只是不能操作(定位元素和操作元素是两码事,操作元素是指click 、clear 、send_keys等这些方法)。我们可以用js来操作隐藏元素。js和selenium不同,只有页面上有的元素(在dom里面的)都能正常操作。
上传图片的几种方式?
send_keys和AutoIT工具实现.
截图应当怎么操作?
driver.get_screenshot_as_file('C:\test.jpg')
项目中的公共功能怎么测试
支付功能怎么测试
-
从功能方面考虑:
- 正常完成支付的流程;
- 支付中断后继续支付的流程;
- 支付中断后结束支付的流程;
- 单订单支付的流程;
- 多订单合并支付的流程;
- 余额不足;金额的最小值 :如0.01;金额为0;金额为负数
- 未绑定银行卡;
- 密码错误;
- 密码错误次数过多;
- 找人代付;
- 弱网状态下,连续点击支付功能功能,会不会支付多次;
- 有优惠券、折扣、促销价进行结算是否正确;
- 不同终端上支付:包括PC端的支付、笔记本电脑的支付、平板电脑的支付、手机端的支付等;
- 不同的支付方式:银行卡网银支付、支付宝支付、微信支付等;
- 支付失败后,再次支付。
-
从性能方面考虑:
- 多个用户并发支付能否成功;
- 支付的响应时间;
-
从安全性方面考虑
- 使用Fiddler拦截订单信息,并修改订单金额,或者修改订单号,(下两个订单A,B,付款时拦截订单B,并把订单B的订单号改为A订单的订单号)无法完成支付;
-
从用户体验方面考虑
- 是否支持快捷键功能;
- 点击付款按钮,是否有提示;
- 取消付款,是否有提示;
- UI界面是否整洁;
- 输入框是否对齐,大小是否适中等。
-
兼容性
- BS架构:不同浏览器测试。
- APP:不同类型,不同分辨率,不同操作系统的手机上测试
购物车怎么测试
- 功能测试
- 未登录时:将商品加入购物车,页面跳转到登录页面,登录成功后购物车数量增加。
- 登录后:
- 所有链接是否跳转正确;
- 商品是否可以成功加入购物车;
- 购物车商品总数是否有限制;
- 商品总数统计是否正确;
- 全选功能是否可用;
- 删除功能是否可用;
- 价格总计是否正确;
- 商品文字太长时是否显示完整;
- 购物车中下架的商品是否有标识,是否还能支付;
- 新加入购物车商品排序(添加购物车中存在的店铺的商品和购物车中不存在的店铺的商品);
- 是否支持快TAB、ENTER等快捷键;
- 商品删除后商品总数是否减少;
- 收藏功能是否可用;
- 购物车结算功能是否可用。
- 兼容性测试
- BS架构:不同浏览器测试,比如:IE,火狐,谷歌,360这些。
- APP:在主流的不同类型,不同分辨率,不同操作系统的手机上测试,华为,vivo,oppo等
- 用户体验测试
- 删除商品是否有提示;
- 是否支持快捷键功能;
- 是否有回到顶部的功能;
- 商品过多时结算按钮是否可以浮动显示;
- 购物车有多个商品时,能不能只对单个商品结算;
- 界面布局、排版是否合理;
- 文字是否显示清晰;
- 不同卖家的商品是否区分明显。
- 性能测试
- 打开购物车页面要多长时间
- 安全性测试
- 加入购物车时,抓包拦截数据
搜索功能怎么测试
- 功能方面的测试:
- 搜索单个字,词语,句子,检索到的内容是否准确,链接是否准确
- 长度:例如输入框支持100字符, 那需要测试100字符、101字符,最大长度的显示是否正常;
- 哪些是支持的字符类型:数字、字母、汉字、字符!@!#、特殊字符;
- 是否支持换行;
- 字符串前后中带空格,前后的空格是否过滤, 中间的空格是否保留
- 全角半角的字母、数字
- 性能方面的测试
- 点击搜索按钮后,搜索结果多长时间能够显示
- 进入搜索页面需要多久
- 安全性方面的测试
- 能否防止SQL注入攻击,否防止XSS攻击
- 用户体验测试:
- 页面布局是否合理,输入框和按钮是否对齐
- 输入框的大小和按钮的长度,高度是否合理
- 快捷键:能不能全选,部分选择,复制剪切粘贴是否可用,粘贴超过最大长度的字符串怎么显示,table键盘是否可用;
- 兼容性测试
- BS架构:不同浏览器测试,比如:IE,火狐,谷歌,360这些。
- APP:在主流的不同类型,不同分辨率,不同操作系统的手机上测试,华为,vivo,oppo等
文件上传功能怎么测试
- 功能测试
- 选择符合要求的文件,上传--------上传成功;
- 上传成功的文件名称显示----------显示正常(根据需求)
- 查看,下载上传成功的文件--------上传的文件可查看或下载
- 删除上传成功的文件-------------可删除
- 替换上传成功的文件-------------可替换
- 上传文件是否支持中文名称--------根据需求而定
- 文件路径是否可手动输入----------根据需求而定
- 手动输入正确的文件路径,上传-----上传成功
- 手动输入错误的文件路径,上传-----提示,不能上传
- 文件大小测试
- 符合格式,总大小稍小于限制大小的文件------上传成功
- 符合文件,总大小等于限制大小的文件--------上传成功
- 符合文件总大小稍大于限制大小的文件--------在上传初提示附件过大
- 小为0kb的txt文档-----------------------不能上传
- 文件名称测试
- 文件名称过长。Win2000标准:255个字符(指在英文的字符下),如果是中文不超过127个汉字-----提示过长
- 文件名称达到最大长度(中文,英文或混在一起)上传后名称显示,页面排版-----------页面显示正常
- 文件名称中包含特殊字符-------------根据需求而定
- 文件名全为中文--------------------根据需求而定
- 文件名全为英文--------------------根据需求而定
- 文件名为中、英混合-----------------根据需求而定
- 文件格式测试
- 上传正确格式-----------------上传成功
- 上传不允许的格式--------------提示不能上传
- 上传rar,zip等打包文件(多文件压缩)---------根据需求而定
- 安全性测试
- 上传可执行文件(exe文件)-----------------根据需求而定
- 上传常见的木马文件------------------------提示不能上传
- 上传时服务器空间已满----------------------有提示
- 性能测试
- 上传时网速很慢(限速)-----------------当超过一定时间,提示
- 上传过程断网--------------------------有提示是否上传成功
- 上传过程服务器停止工资------------------有提示是否上传成功
- 上传过程服务器的资源利用率---------------在正常范围
- 界面测试
- 界面美观性、易用性(键盘和鼠标的操作、tab跳转的顺序是否正确)----------显示正常(根据需求)
- 按钮文字是否正确--------------正确
- 正确/错误提示的文字是否正确---------------正确
- 说明性文字是否正确-----------------------正确
- 其他测试
- 有多个上传框时,上传相同名称的文件---------------根据需求而定
- 上传一个正在打开的文件-------------------------可以上传
- 文件路径是手工输入的是否限制长度----------------限制一定的长度
- 上传过程中是否有取消正在上传文件的功能-----------有
- 保存时有没有已经选择好,但没有上传的文件-----------提示上传
- 选择好但是未上传的文件是否可以取消选择------------可以取消选择
登录功能怎么测试
- 功能方面的测试:
- 输入正确的用户名和密码,点击提交按钮,验证是否能正确登录,能否能跳转到正确的页面
- 输入错误的用户名, 验证登录失败,并且提示相应的错误信息
- 输入错误的密码, 验证登录失败,并且提示相应的错误信息
- 用户名为空, 验证登录失败,并且提示相应的错误信息
- 密码为空, 验证登录失败,并且提示相应的错误信息
- 用户名和密码都为空,点击登陆
- 用户名和密码前后有空格的处理
- 性能方面的测试
- 打开登录页面,需要多长时间
- 输入正确的用户名和密码后,登录成功跳转到新页面,需要多长时间
- 安全性方面的测试
- 密码是否在前端加密,在网络传输的过程中是否加密
- 用户名和密码的输入框,能否防止SQL注入攻击
- 用户名和密码的输入框,能否防止XSS攻击
- 错误登陆的次数限制(防止暴力破解)
- 是否支持多用户在同一机器上登录
- 一个用户在不同终端上登陆
- 用户异地登陆
- 用户体验测试:
- 页面布局是否合理,输入框和按钮是否对齐
- 输入框的大小和按钮的长度,高度是否合理
- 是否可以全用键盘操作,是否有快捷键
- 输入用户名,密码后按回车,是否可以登陆
- 牵扯到验证码的,还要考虑文字是否扭曲过度导致辨认难度大,考虑颜色(色盲使用者),刷新或换一个按钮是否好用
- 兼容性测试
- BS架构:不同浏览器测试,比如:IE,火狐,谷歌,360这些。
- APP:在主流的不同类型,不同分辨率,不同操作系统的手机上测试,华为,vivo,oppo等
还款功能怎么测试
- 功能:
- 正常还款流程
- 逾期还款
- 不同的还款账户
- 余额不足还款
- 弱网状态下,连续点击还款按钮
- 弱网状态,或系统不稳定,支付服务方未把支付结果返回给下单发起方(如果发生这种问题,结果是,钱扣了,还款状态未发生变化)
- 金额不输,为0,为负数
- 提前还款
- 第三方还款
- 性能:
- 还款的响应时间是否过长
- 用户体检:
- 系统提示是否容易理解
- 界面是否友好,输入框是否对齐,按钮大小是否适中,是否有错别字等
- 安全性:
- 是否能防止SQL注入,防XSS攻击
- 还款金额是否会被拦截篡改
- 还款密码等敏感信息是否加密
- 兼容性:
- BS架构的系统,要考虑不同浏览器的兼容性
- APP:考虑在不同分辨率,不同操作系统,不同类型的手机的兼容性
订单功能怎么测试
我们系统的订单生成的流程是这样子的,用户下单后,系统会在用户端和卖家端生成一个待付款的订单,同时在数据库也会生成一个待付款的订单;当用户付款之后,用户端显示待发货状态,卖家端显示已付款待发货状态,订单在数据库的状态为待发货,产品相应的库存量会减少,用户的账户金额减少相应的金额;当卖家发货后,用户端和卖家端的订单状态都显示为配送中,数据库中的订单状态也同时发生变化;当用户确认收货后,订单状态会显示为已完成,待评价状态,数据库中的订单状态也同时发生变化,买家支付的款项会打入到卖家的账户;当用户评论完后,订单状态显示为已结束,数据库中的订单状态也同时发生变化。这是一个正常的流程,我们测试的时候,要优先把这个流程测试通过。
然后再考虑用户的其他使用场景,比如:
- 用户下单后,取消订单;
- 下单后,一直不付款,检查订单超时不付款的场景下,会不会自动取消订单;
- 在订单快超时时,付款;
- 下单后,在不同的终端登录,一端取消订单,同时一端对该订单进行付款;
- 弱网状态下,多次点击提交订单按钮,检查是否会生成多个订单;
- 用户付款后,申请退款,买家端的订单状态为退款申请中,卖家端显示为退款审核;申请退款通过后,订单状态为已关闭状态,买家收到退还的金额;卖家拒绝退款,订单状态为待发货状态;卖家超时不处理退款申请,自动退款,订单自动设置为已退款状态,买家收到退还的金额;
- 当卖家发货后,买家申请退款,买家端的订单状态为退款申请中,卖家端显示为退款审核;申请退款通过后,订单状态为已关闭状态,买家收到退还的金额;卖家拒绝退款,订单状态为待发货状态;卖家超时不处理退款申请,自动退款,订单自动设置为已退款状态,买家收到退还的金额;
- 买家收货后,买家申请退款/退货,买家端的订单状态为退款申请中,卖家端显示为退款审核;申请退款通过后,订单状态为已关闭状态,买家收到退还的金额;卖家拒绝款/退货,订单状态为已确认收货状态;卖家超时不处理退款/退货申请,自动退款,订单自动设置为已退款状态,买家收到退还的金额;
- 买家长时间不确认收货,系统自动确认收货,系统自动设为好评,订单状态为已结束,卖家收到买家的货款;
- 收货后,超时不评论,系统自动设为好评,订单状态为已结束。
这些是功能测试的场景,每个场景,我们都要检查数据库对应订单的数据变化。
- 用户体验:
- 订单界面是否整洁,清晰,文字大小是否适中,订单编号是否能复制;
- 下单,取消订单,申请退款等功能是否有响应的提示,提示是否合理;
- 超时时长是否有倒计时提示;
- 只对订单的部分商品进行发货,订单里的商品发货状态是否分开展示;
- 是否支持Enter,tab等快捷键。
- 安全性:
- 使用Fiddler,检查是否能拦截篡改修改订单的信息。
- 兼容性:
- web端,在不同的浏览器,比如:谷歌,IE,火狐,360上测试;
- app端,在主流的不同的机型,不同的分辨率,不同的操作系统的手机上进行测试,比如:xxx;
- 性能:
- 多用户并发下单;
- 提交订单,取消订单,申请退款的响应时间。
- 可靠性:
- 多用户长时间运行提交订单功能。
聊天功能测试案列
聊天功能需求(红框需要测试):
聊天功能测试点
1.确认聊天的联系人类型:
包括个人账号,公共号,机构号,群组等。
2. 确认联系人具有的特征:
个人主页---头像、昵称、性别、地区、签名、管理的群、2维码
群------------头像、创建人、群成员、群名称、群类型、消息设置、2维码
公共号------头像、名称、简介、消息设置、2维码
3、确认联系人要做哪些操作
消息发送--------单聊、群聊、语音、文字、图片、表情、链接、字符及长度
消息管理--------发布通知、接受通知、发文件、消息提醒、通知提醒、声音、震动、好友请求、请求处理
消息推送--------在线、离线、收发、时序
权限管理--------开放群(任何人入群),半开放群(验证入群),验证加好友,不需验证加好友
隐私管理--------黑名单,允许好友查看动态,允许陌生人查看动态,允许通过手机号查找,允许真实姓名查找
成员管理--------加人,被加,退出,被动退出,编辑,删除
群组管理--------创建群,消息设置,申请入群,扫二维码入群,退群,通知提醒,头像编辑,名称编辑,简介编辑,权限编辑,成员编辑
好友管理--------扫二维码加人,加好友,查好友,好友推荐,群组推荐,联系人导入,拉黑名单,解除好友,备注名
动态管理--------发动态,发投票,点赞,表情,评论,增加,删除,分享,隐藏,编辑
登录退出--------忘记密码,更换账号
文件管理--------接收,离线接收,预览,删除,分享,转存,文件格式,大小
4. 缓存
缓存这个东西需要检查的,关系到用户体验,如果页面没做缓存,打开很慢。可以清除缓存测测。
5. 升级
安装,卸载,升级一定要测。有的时候需要直接升级测试,因为开发可能改了表结构而没告诉你,导致升级后部分数据丢失,后果很严重。还要看升级后消息记录是否有丢失(如果可能,需要去查看数据库。)还有可能升级过程中发现签名不一致哦,抓狂吧?
6. 网络
要覆盖(2G,3G,4G,wifi),使用Charles模拟慢网、弱网等条件,验证消息是否成功发送,或者retry几次,没发出去是否有提示等,各种响应速度是否可以接受
7. 中断
要测试启动,静置,活动中等状态下的中断,看错误的操作是否有保护现场机制。。。
8. 兼容性
布局检查,分辨率检查,各种代表性机型检查
9. 闪退
10、不同平台间的交叉测试
京东购物车测试案列
京东产品的核心业务流程
购物车的流程分析
京东购物车入口
京东购物车界面
未登录进入购入车
购物车为空:
购物车功能点
1、入口测试:我的购物车,去购物车而结算
2、用户类型:登录的用户,未登录的用户
3、商品清单:
-
- 按店铺展示商品清单,包括图片、名称、单价、数量、小计等;
- 显示店铺合计金额、商品总结金额
- 购买数量可进行增减-- 等价类、边界值
- 商品支持删除、移到关注
4、选择商品
-
- "全选"
- 单个勾选、部分选;
- 删除选中商品,移入关注,清理购物车
5、去结算
-
- 点击“去结算”
- 跳转至订单确认界面--交互验证
6、空页面处理
-
- 当购物车商品为空时, 可选择“去购物”
购物车如何测试:功能点
朋友圈如何测试案列
首先,先从测试的角度向HR分析
1.从功能测试的角度分析
功能测试是软件中最基础的测试,功能实现不好,软件就不能发布测试。功能测试软件提交测试后,可进行测试的第一步。要进行功能测试,首先就需要了解朋友圈的各个功能。
那么如何了解朋友圈的功能呢?当然是查看需求文档。因为所有的开发设计、测试设计等,都是以需求文档来进行的。需求文档中规定了必须有哪些功能,那么我们在测试的时候就可以对比知道哪些功能已实现,哪些功能未实现(需要说明的是:开发计划明确说明当前版本暂不实现的功能,不能算作bug。)。
相信玩过微信朋友圈的人都知道,微信朋友圈大概有以下基础功能:
a.发、删朋友圈,查看朋友圈;
b.朋友圈的类型(图、文、混合);
c.评论朋友圈;
d.朋友圈的对外接口(例如:打王者荣耀时,把战绩分享到朋友圈,这个时候就是调用微信朋友圈提供的接口);
e.屏蔽与被屏蔽,能否查看对应好友的朋友圈。
下面我们就要向HR举例阐述。在此,给大家一个小技巧,请举HR最容易懂,最容易解释的内容。例如:
发朋友圈:我们可以通过短按或长按朋友圈中的照相机图标,分别发起图片版或文字版的朋友圈操作。在此过程中,我们需要关注进行发起操作的响应时间是否符合需求;然后,我们要对发朋友圈进行全面的测试。其中包括,正常发朋友圈、取消发朋友圈,多次发朋友圈与取消发朋友圈等。如果需求中对朋友圈内容有限定,例如:不允许出现敏感字眼等,提前检查设定。
2.从可靠性测试的角度分析
首先,要向HR阐释软件可靠性的概念。即:软件可靠性 (software reliability )是软件产品在规定的条件下和规定的时间区间完成规定功能的能力。
由于面试官可能对这些定义不甚了解,因此,在面试过程中,我们可以这样简化回答:(1)在规定的条件下,在规定的时间内,软件不引起系统失效的概率;
(2)在规定的时间周期内,在所述条件下程序执行所要求的功能的能力;
同样,向HR举简单易懂的例子来分析如何测试软件的可靠性。
(1)短时间内频繁进行发送、取消、与删除朋友圈的组合测试,看朋友圈相关功能是否正常;
(2)微信打开后,手机锁屏或切换到主界面,微信在后台是否会失效出现bug,连带着朋友圈的功能是否会失效。
3.从性能测试的角度分析
性能测试主要对服务器的性能进行的测试。在App上,性能测试分为客户端性能、服务器性能。
对客户端性能我们主要关注的指标有:CPU占用率、内存占用率、流量耗用量、FPS等。举例来说,如果发起朋友圈操作之前,手机的CPU的使用率为30%,发起操作之后,噌噌的涨到了80%,不关闭朋友圈的相关操作,CPU使用率降不下来。那么,这个朋友圈可能存在性能问题。
对提供朋友圈服务的服务器进行性能测试时,我们需要进行压力测试、负载测试、稳定性测试了。常用的工具就是Loadrunner了,主要关注指标有:CPU、内存、TPS、响应时间等。
4.从其它测试的角度分析
对于一些特殊情况,可向HR简单举例带过即可。例如:
(1)受WiFi信号进行限速,在弱信号的情况,进行发、看朋友圈等操作,测试其可能会产生其它未知故障;
(2)由于客户使用的手机、平板等厂商不同,在做兼容性测试时,要使用不同的客户端进行操作,观察不同测试结果;
(3)还可以做一些安全测试,例如在朋友圈中输入一些脚本程序代码什么的,测试是否会将微信客户端整崩溃什么的。
其次,从用户的角度向HR回答
把你考虑到的跟用户体验相关的内容抛给你的HR,会额外增加分数。比如:
站在用户角度来说,易用性是客户评价软件好坏最主要点。功能操作是否简单明了,给出的提示是否清楚明白无二意,界面布局是否美观合理等,这些因素都将是软件测试人员在实际工作中可以给出建议的部分。
除此之外,好的测试人员可通过模拟不同用户使用场景,针对性的给产品提出设计改进方案。
最后,别忘记回归到面试本身
最后,请记得归到面试本身,可以引导面试官抛出更多该公司目前工作项目的问题并进行初步解答,以便HR更加认可你的专业性。
转载 侵权联系 删!!

浙公网安备 33010602011771号