-
写好测试用例的关键 /写好用例要关注的维度?
①覆盖用户的需求;
②从用户使用场景出发,考虑用户的各种正常和异常的使用场景;
③用例的颗粒大小要均匀。通常,一个测试用例对应一个场景;
④用例各个要素要齐全,步骤应该足够详细,容易被其它测试工程师读懂,并能顺利执行;
做好用例评审,及时更新测试用例。 -
软件测试的分类?
①:软件测试:按阶段分、代码是否执行、运行程序划分、其他。
a: 阶段划分:
单元测试:按模块划分后的颗粒度进行分类测试(单个功能的测试 如:crud 分页 上传下载)
集成测试:功能模块的测试(将多个功能点进行总结在一起)
系统测试:多个模块合成测试(整体测试)
验收测试:客户以及产品经理进行(交付前的测试)
b:程序是否运行划分:
静态测试: UI界面 、业务逻辑
动态测试: 链接数据之后
c:代码是否执行:黑、白、灰
黑:纯功能测试(点点点/手动测试)
功能测试:
安装/卸载测试
界面测试:
易用测试:
兼容性测试
性能测试:
稳定性测试: monkey命令
压力测试
负载测试
一般性能测试 系统资源使用率
白:使用编程脚本进行测试 实现自动化
灰:介于黑和白之间
②:其他测试:
冒烟测试:对软件的主要功能进行测试
回归测试:是指对软件的新版本进行测试时,重复执行上一个版本测试时的用例,比如在1.0版本中,有一个bug,到了2.0版本中,再重新测试1.0中这个bug
随机测试:是指测试中所有的输入数据都是随机生成的,其目的是模拟用户的真实操作,并发现一些边缘性的错误。
暴力测试: -
测试流程是什么?
我们一般在项目进行开立项会【产品经理 项目经理 开发人员 测试人员】的时候进行参与,讨论需求并提出建议,在立项会中制定需求文档,由ui设计原型图,开发根据需求文档进行编码,我们测试会根据需求文档进行编写 测试计划,根据模块的(颗粒度)划分并编写测试用例以及对用例的评审,开发结束侯测试对主要功能进行冒烟测试,执行测试用例,提交bug 开发进行修改,修改成功侯关闭bug,进行回归测试,在上线前进行测试总结。 -
测试的原则是?
-
测试显示软件存在缺陷
-
穷尽测试是不可能的
-
测试尽早介入
-
缺陷集群性(2/8原则)
-
杀虫剂悖论
6.测试活动依赖于测试内容
7.没有错误是好是谬论 -
软件测试的黑盒白盒灰盒的区别?
白盒测试:对程序的内部结构与算法进行的测试
黑盒测试:不考虑程序的内部结果,只检查程序是否实现了需求的功能
灰盒测试:关注系统接口所实现的功能,是否和需求一致。 -
软件测试的开始条件和结束条件分别是什么?
开始接入测试:
确保单元测试通过
模块之间的联调测试通过
确认提交的测试版本
冒烟测试通过
结束测试:
确保核心测试用例执行完毕
确保中级以上的缺陷全部修复,且bug修复率达95%以上
测试由于其他原因中断无法进行,通知相关领导进行下一步确认
-
怎么保证百分之百覆盖用户需求?
项目开始前,我们会先熟悉需求,画好流程图,保证整个流程都覆盖全面,小组之间每个人都要根据各自的流程图,各个功能点有哪些限制条件,来讲解一下自己对测试点的理解,防止之后编写测试用例时出现遗漏;用例编写完之后,再进行用例的评审,看看测试点有没有用遗漏,对需求理解有没有错误,测试场景是否覆盖完全。 -
常见的测试风险有哪些?
进度风险、质量风险和需求变更 -
常见的测试方法有哪些?
等价类划分法,边界值,场景法,因果图,正交表 -
产品上线后发现bug怎么办?
测试人员复现问题后,提交问题单进行跟踪;
评估该问题的严重程度,以及修复问题时的影响范围,回归测试需要测试哪些功能;
问题修复后,先在测试环境上回归,通过后再在生产环境上打补丁,然后再进行回归测试;
总结经验,分析问题发生的原因,避免下次出现同样问题。 -
开发不认为是bug的时候怎么办?
先跟开发沟通,确认系统的实际结果是不是和需求有不一致的地方;有些地方可能需求没提及,但是用户体检不好,我们也可以认为是bug。
如果开发以不影响用户使用为理由,拒绝修改,我们可以和产品经理,测试经理等人员进行讨论,确定是否要修改,如果大家都一致认为不用改,就不改。 -
如何跟踪bug?
当发现缺陷后,我们要在禅道上提交问题单给开发,并每隔一段时间(间隔一个小时,或两个小时都可以)去检查缺陷是否被处理,如果没及时处理,就要提示开发,让开发及时修复问题,问题修复后,要及时进行回归测试。 -
Bug的关注点有哪些?
缺陷编号 缺陷描述 缺陷标题 重新步骤
严重程度 优先级 用例编号 -
你发现一个bug后怎么处理?
答:发现bug后,我们会先自己定位一下,比如,抓个包,看看是前端的问题,还是后端的问题,检查下数据库的数据是不是正确的,尽量把问题发生的原因或者产生的日志找出来,方便开发定位问题,然后就提单给开发,然后开发做出相应的处理,开发修复完后就进行回归测试,回归测试通过后就关闭这个bug,没有通过就继续给回开发修复。如果遇到开发认为这个不是bug的话,那么我们就要和开发沟通,然后我们要坚持自己的立场,通过讨论后一致认为是bug就给开发修复,不是就关闭这个bug。如果开发和我们意见一直不一致,那么就要将问题升级,召集开发经理和测试经理一起讨论,再做决定。 -
Bug的状态有哪些?
新信息(New):测试中新报告的软件缺陷;
打开 (Open):被确认并分配给相关开发人员处理;
修正(Fixed):开发人员已完成修正,等待测试人员验证;
拒绝(Declined):拒绝修改缺陷;
延期(Deferred): 不在当前版本修复的错误,下一版修复
关闭(Closed):错误已被修复; -
用linux命令把a.log文件中的包含 Error 字符串的内容提取出来,追加到b.log文件中?
cat a.log | grep Error>>b.log -
用linux命令从远程服务器(192.168.2.1)上把/root/log拷贝到本地的/opt目录下?
scp -r root@192.168.2.1:/root/log /opt -
用linux命令在当前文件夹中查找a.log?
find ./ -name a.log -
查看可用内存,磁盘大小和CPU使用率的命令?
free -m df -h top -
测试环境怎么搭建的?
搭建环境前,开发都会给到我们一份系统发布手册,我们会根据这个手册来搭建。比如,我这个xx系统,是搭建在Unix系统下的,web服务器用的是Tomcat8,MySQL版本是5.7,程序是JAVA编写的,首先我们向开发拿到编译好的安装包,然后用xshell(或CRT)远程连接上Unix系统,把tomcat服务器停掉,把程序包放到webapps目录下,然后再启动tomcat服务器就可以了 -
在需求文档不太详细的情况下,如何开展一个web端项目测试?
首先,把需求文档中有异议的部分标识出来,再找产品和开发一起讨论,把需求明确下来;
提取测试点,然后再叫上产品和开发一起对测试点进行讨论,看有没有遗漏,是不是合理的,
然后再编写测试用例,再评审,评审通过后,再进行后续的测试。 -
项目中的订单怎么测试?(主要测试订单的状态变化)?
我们系统的订单生成的流程是这样子的,用户下单后,系统会在用户端和卖家端生成一个待付款的订单,同时在数据库也会生成一个待付款的订单;当用户付款之后,用户端显示待发货状态,卖家端显示已付款待发货状态,订单在数据库的状态为待发货,产品相应的库存量会减少,用户的账户金额减少相应的金额;当卖家发货后,用户端和卖家端的订单状态都显示为配送中,数据库中的订单状态也同时发生变化;当用户确认收货后,订单状态会显示为已完成,待评价状态,数据库中的订单状态也同时发生变化,买家支付的款项会打入到卖家的账户;当用户评论完后,订单状态显示为已结束,数据库中的订单状态也同时发生变化。这是一个正常的流程,我们测试的时候,要优先把这个流程测试通过。
然后再考虑用户的其他使用场景,比如:
①用户下单后,取消订单;
②下单后,一直不付款,检查订单超时不付款的场景下,会不会自动取消订单;
③在订单快超时时,付款;
④下单后,在不同的终端登录,一端取消订单,同时一端对该订单进行付款;
⑤弱网状态下,多次点击提交订单按钮,检查是否会生成多个订单;
⑥用户付款后,申请退款,买家端的订单状态为退款申请中,卖家端显示为退款审核;申请退款通过后,订单状态为已关闭状态,买家收到退还的金额;卖家拒绝退款,订单状态为待发货状态;卖家超时不处理退款申请,自动退款,订单自动设置为已退款状态,买家收到退还的金额;
⑦当卖家发货后,买家申请退款,买家端的订单状态为退款申请中,卖家端显示为退款审核;申请退款通过后,订单状态为已关闭状态,买家收到退还的金额;卖家拒绝退款,订单状态为待发货状态;卖家超时不处理退款申请,自动退款,订单自动设置为已退款状态,买家收到退还的金额;
⑧买家收货后,买家申请退款/退货,买家端的订单状态为退款申请中,卖家端显示为退款审核;申请退款通过后,订单状态为已关闭状态,买家收到退还的金额;卖家拒绝款/退货,订单状态为已确认收货状态;卖家超时不处理退款/退货申请,自动退款,订单自动设置为已退款状态,买家收到退还的金额;
⑨买家长时间不确认收货,系统自动确认收货,系统自动设为好评,订单状态为已结束,卖家收到买家的货款;
⑩收货后,超时不评论,系统自动设为好评,订单状态为已结束。
这些是功能测试的场景,每个场景,我们都要检查数据库对应订单的数据变化。
用户体验:
①订单界面是否整洁,清晰,文字大小是否适中,订单编号是否能复制;
②下单,取消订单,申请退款等功能是否有响应的提示,提示是否合理;
③超时时长是否有倒计时提示;
④只对订单的部分商品进行发货,订单里的商品发货状态是否分开展示;
⑤是否支持Enter,tab等快捷键。
• 安全性:
使用Fiddler,检查是否能拦截篡改修改订单的信息。
• 兼容性:
①web端,在不同的浏览器,比如:谷歌,IE,火狐,360上测试;
②app端,在主流的不同的机型,不同的分辨率,不同的操作系统的手机上进行测试,比如:xxx;
• 性能:
①多用户并发下单;
②提交订单,取消订单,申请退款的响应时间。
• 可靠性:
多用户长时间运行提交订单功能。 -
项目中的支付模块怎么测试?
从功能方面考虑:
1、正常完成支付的流程;
2、支付中断后继续支付的流程;
3、支付中断后结束支付的流程;
4、订单支付的流程;
5、多订单合并支付的流程;
6、余额不足;金额的最小值 :如0.01;金额为0;金额为负数
7、未绑定银行卡;
8、密码错误;
9、密码错误次数过多;
10、找人代付;
11、弱网状态下,连续点击支付功能功能,会不会支付多次;
12、有优惠券、折扣、促销价进行结算是否正确;
13、不同终端上支付:包括PC端的支付、笔记本电脑的支付、平板电脑的支付、手机端的支付等;
14、不同的支付方式:银行卡网银支付、支付宝支付、微信支付等;
15、支付失败后,再次支付。
从性能方面考虑:
1、多个用户并发支付能否成功;
2、支付的响应时间;
从安全性方面考虑
使用Fiddler拦截订单信息,并修改订单金额,或者修改订单号,(下两个订单A,B,付款时拦截订单B,并把订单B的订单号改为A订单的订单号)无法完成支付;
从用户体验方面考虑
1、是否支持快捷键功能;
2、点击付款按钮,是否有提示;
3、取消付款,是否有提示;
4、UI界面是否整洁;
5、输入框是否对齐,大小是否适中等。
兼容性
1、BS架构:不同浏览器测试。
2、2、APP:不同类型,不同分辨率,不同操作系统的手机上测试 -
项目中的登录怎么测试?
功能方面的测试:
1、输入正确的用户名和密码,点击提交按钮,验证是否能正确登录,能否能跳转到正确的页面
2、输入错误的用户名, 验证登录失败,并且提示相应的错误信息
3、输入错误的密码, 验证登录失败,并且提示相应的错误信息
4、用户名为空, 验证登录失败,并且提示相应的错误信息
5、密码为空, 验证登录失败,并且提示相应的错误信息
6、用户名和密码都为空,点击登陆
7、用户名和密码前后有空格的处理
性能方面的测试
1、打开登录页面,需要多长时间
2、输入正确的用户名和密码后,登录成功跳转到新页面,需要多长时间
安全性方面的测试
1、密码是否在前端加密,在网络传输的过程中是否加密
2、用户名和密码的输入框,能否防止SQL注入攻击
3、用户名和密码的输入框,能否防止XSS攻击
4、错误登陆的次数限制(防止暴力破解)
5、是否支持多用户在同一机器上登录
6、一个用户在不同终端上登陆
7、用户异地登陆
用户体验测试:
1、页面布局是否合理,输入框和按钮是否对齐
2、输入框的大小和按钮的长度,高度是否合理
3、是否可以全用键盘操作,是否有快捷键
4、输入用户名,密码后按回车,是否可以登陆
5、牵扯到验证码的,还要考虑文字是否扭曲过度导致辨认难度大,考虑颜色(色盲使用者),刷新或换一个按钮是否好用
兼容性测试
1、BS架构:不同浏览器测试,比如:IE,火狐,谷歌,360这些。
2、APP:在主流的不同类型,不同分辨率,不同操作系统的手机上测试,华为,vivo,oppo等 -
Python中的模块有哪些?
time、datatime、random、requests -
Python中的2.0和3.0有什么区别?
-
python3中1/2终于等于0.5 了
-
print "Hello World"变成了print("Hello World")
-
raw_input没了
-
class Foo: 写法不能用了,只能 class Foo(object)
-
用自己熟悉的语言编写一个9*9乘法表?
乘法表
for i in range(1, 10):
for j in range(1, i + 1):
print(str(i) + '*' + str(j) + '=' + str(i * j), end=' ')
print('')
- 用自己熟悉的语言编写一个冒泡排序?
冒泡排序
def bubble_sort(arr):
"""冒泡排序"""
# 第一层for表示循环的遍数,表示总得长度,代表每个元素遍历次数
for i in range(len(arr) - 1):
# 第二层for表示具体比较哪两个元素,根据每个元素从第一到最后0-j 进行排序
for j in range(len(arr) - 1 - i):
if arr[j] > arr[j + 1]:
# 如果前面的大于后面的,则交换这两个元素的位置
arr[j], arr[j + 1] = arr[j + 1], arr[j]
print(arr)
return arr
return arr
if name == 'main':
arr = [7,6,5,4,3,2,1]
bubble_sort(arr)
- 用自己熟悉的语言编写一个2分排序?
二分查找法
def erfen(alist, item):
# 构造初始下标和结束下标
first = 0
last = len(alist) - 1
# 构造循环比较条件
while first <= last:
# 构造中间值下标
mid = (first + last) // 2
# item(要查找的元素) 和中间值下标对应的元素进行比较 查询到后直接返回值
if item == alist[mid]:
# 返回查询到的值
return True, alist.index(item)
else:
if item > alist[mid]:
first = mid + 1
else:
last = mid - 1
return False
if name=='main':
alist = [-22, -11, 0, 11, 22, 33, 38, 44, 55, 57, 66, 72, 81, 96, 123456]
print(erfen(alist,11))
-
显示等待 隐式等待 强制等待的区别以及对应的代码是?
• sleep(): 强制等待,设置固定休眠时间。后脚本的执行过程中执行 sleep()后线程休眠,而另外两种线程不休眠。
• implicitly_wait():隐式等待,是设置的全局等待。设置等待时间,是对页面中的所有元素设置加载时间,如果超出了设置时间的则抛出异常。隐式等待可以理解成在规定的时间范围内,浏览器在不停的刷新页面,直到找到相关元素或者时间结束。
• WebDriverWait():显示等待,是针对于某个特定的元素设置的等待时间,在设置时间内,默认每隔一段时间检测一次当前页面某个元素是否存在,如果在规定的时间内找到了元素,则直接执行,即找到元素就执行相关操作,如果超过设置时间检测不到则抛出异常。默认检测频率为0.5s,默认抛出异常为:NoSuchElementException。 -
常见的定位方式有哪些?Web端和app端?
app是 id,classname,xpath、find_element_by_android_uiautomator
web是 xpath 和 css -
Adb查看当前运行的APP的包名和打开的Activity?
adb shell "dumpsys window | grep mCurrentFocus" -
Adb先监控日志中关于START关键字的日志?
adb logcat -v time | findstr START -
Adb 将 安卓/data目录下a.txt文件 下载到D: est中?
adb pull /data/a.txt D: est -
Charles中如何进行请求断点替换?
② 断点:(request)
①右键breakpoints(开启断点功能)
②设置断点参数 copy url --proxy--Breakpoint setting--Enable Breakpoints
③黏贴地址(右键空白处自动生成Host)
path
query必须是*号
然后选择请求(request)点击ok
④刷新页面出现Edit request,点击进行编辑
⑤execute运行 -
Charles中如何进行响应断点替换?
② 断点:(response)
①右键breakpoints(开启断点功能)
②设置断点参数 copy url --proxy--Breakpoint setting--Enable Breakpoints
③黏贴地址(右键空白处自动生成Host)
path
query必须是*号
然后选择请求(response)点击ok
④刷新页面出现Edit request,点击进行编辑
⑤execute运行 -
Charles中如何进行对app端抓包?
1.首先在代理里把Windows Proxy关掉
2.点击Help,点击SSL Proxying,再点击下载最长的那个下载证书
3.点击品Proxy,点击代理设置,查看端口号
4.打开手机WLAN长摁,手动输入代理,把本地ip和代理号输入保存
5.浏览器下载证书,手机随意点开软件,就会有接口显示出来 -
Charles中如何进行弱网测试?
1.请求网页,点击proxy(代理),选中Throttle Setting(节流阀调整),点击Enable Throttling(使用节流阀)进行调整里面的数据,最后点击ok保存
2.如果想退出就点菜单栏的小乌龟,取消慢网测试 -
Charles中如何模拟404/403?
1.点击tools(工具)选择blacklist(黑名单)
2.允许启动黑名单功能 选择接口返回值的形式 添加接口地址并保存
3.选中需要返回404/403的接口 点击ok再次请求 -
Jmeter中如何进行对数据库压测?
①右键线程组-取样器-添加-jdbc request
②添加-配置元件-jdbc Connection Configuration 填写数据库信息,database Url中有地址,端口号,数据库名称,协调时间的和可以多条执行sql的路径还有jdbc驱动和数据库账号密码
③jdbc request中写sql语句
④线程组增加次数点击运行进行压测 -
Jmeter中如何实现参数化关联?
1.需要把Mysql jdbc驱动包mysql-connector.jar包放到apache-jmeter-3.1libext文件下,重启jmeter。
2.添加数据库连接
①步骤1:线程组->配置元件->JDBC Connection Configuration
②步骤2:填入数据库的服务器地址和用户名
3.添加一个Sampler:JDBC Request
步骤:线程组->Sampler->JDBC Request
4.添加ForEach控制器
步骤:添加->逻辑控制器->ForEach控制器
5.在请求中使用 -
Ant+jmeter+jenkins 如何实现的(关键步骤)?
-
tps和qps的区别?
TPS:是Transactions Per Second的缩写,也就是事务数/秒。它是软件测试结果的测量单位。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。
QPS:是Queries Per Second的缩写,意思是每秒查询率,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。
-
Cookie和session的区别?
cookie是存放在浏览器上而session是存放在服务器上的。
cookie不是很安全,涉及到用户隐私方面尽量存放在session中。
当访问量增多时,session会更加占用服务器资源。 -
你知道的请求方式有哪些以及区别?
get、put、post、delete
(GET:用来查询 、POST:用来新增、PUT:用来修改、DELETE:用来删除) -
举例说明下你的自动化如何做的?
就拿简历上的xxx项目来说吧,在编写脚本前,我们会对系统进行评估,确认这个系统可不可以实现UI自动化,如果可以的话,就筛选出能实现自动化测试的用例,一般优先把冒烟测试用例的转为成脚本。我们是用selenium工具来实现自动化,采用python脚本语言,基于unittest框架进行用例的编写。比如,下单这个功能的脚本,我们是这样做的:首先,我们会构建一个测试工程,测试工程包含testcase,主要用来存放测试用例,report用来存放测试报告,其次我们会把用例中公共的部分封装到public中,最后用runAllCase的python文件运行项目自动化用例,脚本调试完后,我们会用jenkins持续集成工具,设置脚本每天晚上10点跑一遍脚本,跑完后生成html格式的自动化测试报告。 -
你知道的测试框架有哪些都怎么用的?
selenium是浏览器自动化测试框架, -
自动化中如何切换不同的浏览器和iframe的以及对应的代码?
使用对应的浏览器驱动,然后在脚本中更换不同的浏览器
switch_to.frame() -
如果有验证码功能怎么实现自动化?
去掉验证码。
设置万能验证码。
用python调用OCR模块,自己写代码来识别。这种方法可以识别出简单的验证码。
调用第三方平台提供的接口进行识别。比如:斐斐打码,尖叫数据这些平台接口。 -
请你简单的浅谈一下你了解的po模型?
po还是了解的。po是web自动化测试目前最佳的一种实践方式,简单来说就是类和类之间的封装和调用。
包括基础类、页面类、用例层等部分。目前正在往这个方面进阶脚本。