测试面试题
面试题
测试相关
1.get和post 的区别?
1、GET请求:请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接。
POST请求:POST请求会把请求的数据放置在HTTP请求包的包体中。
2、传输数据的大小
使用GET请求时,传输数据会受到URL长度的限制。
对于POST,理论上是不会受限制的
3、安全性。POST的安全性比GET的高
2.你觉得自动化测试有什么缺陷?
-不稳定
-可靠性不强
-不易维护
-成本与收益
3.如何去定位属性动态变化的元素?
先去找该元素不变的属性,要是都变,那就找不变的父元素,用层级定位(以不变应万变)
属性动态变化也就是指该元素没有固定的属性值,可以通过:
JS实现,
通过相对位置来定位,比如xpath的轴,paren/following-sibling/percent-sibling
4.什么是imlicitlyWait(隐式等待)
webdriver 会在指定的超时时间范围内不断的查找元素,直到找到元素或超时
5.什么是expliciteWait(显式等待)
通常是我们自定义的一段代码,这段代码用来等待某种条件发生后,再继续执行后续的代码
6.什么是线程等待(硬式等待)
如Thread.sleep(2000),webdriver线程强制休眠2秒钟,2秒过后,再执行后续的代码。
7.测试用例常用设计方法
答案: 等价类、因果图、边界值、判定表
黑盒测试底层逻辑:
8.软件测试的流程?
答案:
-
一、测试需求分析阶段:阅读需求,理解需求,主要就是对业务的学习,分析需求点。参与需求评审会议
-
二、测试计划阶段:主要任务是编写测试计划,参考软件需求规格说明书、项目总体计划,内容包括测试范围(来自需求文档)、进度的安排,人力物力的分配,整体测试策略的制定,和风险的评估与规避措施有一个制定,一般有测试负责人编写,当然我们也会参与相关的评审工作。
-
三、测试设计阶段:主要任务是编写测试用例,会参考需求文档(原型图)、概要设计、详细设计等文档,有不明确的也会及时和开发、产品经理沟通。用例编写完成后会进行评审。
-
四、测试执行阶段:首先搭建测试环境,执行预测(冒烟),以判定当前版本可测与否,如果预测通过,正式进入系统测试,遇到问题提交Bug到缺陷管理平台,并对bug进行跟踪,直到被测软件达到测试需求要求,没有重大bug,测试结束。
-
五、测试评估阶段:出测试报告,对整个测试的过程和版本质量做一个详细的评估。确认是否可以上线。
作者:柠檬班软件测试
链接:https://www.zhihu.com/question/42023056/answer/554616997
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
9.测试用例设计
业务需求
软件功能需求
1.用户注册功能
2.用户登录功能
3.用户账号后台管理
测试需求
1.用户登录的功能
2.用户登录的安全性
3.用户登录的兼容性
4.用户登录的性能
测试用例
- 功能测试用例集
- 1.显性功能验证
- 1.登录的正确性
a.用户名、密码正确
1.账号在
b.验证码功能
1.输入正确的用户名、正确的密码、正确的验证码
登录成功 - 2.登录异常
a.输入错误情况检测
1.已注册的账户、错误的密码登录
2.未注册的账户、正确的密码
3.账号、密码都错误
b.为空检测
1.账号和密码都为空时验证
登录失败,且提示信息正确;
2.账号和密码两者之一为空时
登录失败,且提示信息正确;
c.其他功能无效检测
1.找回密码功能是否有效
2.记住密码是否有效
3.自动登录
d.验证码功能验证
1.输入账号、密码正确,但验证码错误:
登录失败,且提示信息正确
同样的账号同时登录;
-
2.隐性功能验证
1.用户名和密码是否大小写敏感?
2.页面上的密码框是否加密显示?
3.后台系统创建的用户第一次登录成功时,是否提示修改密码?
4.忘记用户名和忘记密码的功能是否可用?
5.前端页面是否根据设计要求限制用户名和密码长度?
6.如果登录功能需要验证码,点击验证码图片是否可以更换验证码,更换后的验证码是否可用?
7.刷新页面是否会刷新验证码?
8.如果验证码具有时效性,需要分别验证时效内和时效外的有效性;
9.用户登录成功后但是会话超时后,继续操作是否会重定向到用户登录界面?
10.不同级别的用户,比如管理员用户和普通用户,登录系统后的权限是否正确?
11.页面默认焦点是否定位在用户名的输入框中;
12.快捷键Tab和Enter等,是否可以正常使用?账号
1.是否可以使用登录的API发送登录请求,并绕开验证码校验。
密码
1.密码是否支持特殊字符和中文等。
2.密码强弱性校验,数据库和数据操作时候合理等。
3.没劲是否有明文和暗文两种模式(有时候只有暗文显示真的不知道自己的密码是否输入正确。)
4.更改密码后,是否还能用之前的密码登录?
5.若支持手机号+验证码登录,验证码是否有时间限制?移动端设备是否可以直接获取验证码?
6.输入账号密码时对键盘格式是否有要求比如数字键盘;
7.密码一栏需要设置明暗切换?
8.输入账号密码格式不规范时是否将按钮设置为不可点击;
9.输入栏是否设置快速删除按钮?
登录
1.是否可以用抓包工具抓到请求包直接登录?
2.截取到的token等信息,是否可以在其他终端上直接使用,绕开登录,token过期时校验。
3.除了前端校验格式长度等,后端是否也校验?
4.登录后输入登录URL,是否还能再次登录?如果能,原登录用户是否变得无效。
5.登录错误后的提示是否有安全隐患。
6.登录失败后第二次登录
1.输入正确的用户名和错误的密码登录失败后,再次输入正确的密码登录并观察登录情况。
2.输入正确的用户名和不输入密码登录失败后,再次输入正确的密码并观察登录情况。
3.输入未注册的用户名和任意密码登录失败后,再次输入正确的用户名和密码,观察登录情况。
7.修改密码后:
1.修改密码后是否重定向登录到界面?
2.修改密码后,分别使用原密码和新密码登录。
3.在其他终端修改密码后,本终端是否自动下线?下线后,使用原密码能否继续登录?
8.退出登录
1.退出登录是否有记住账号或记住密码功能?
2.退出登录后,再次输入密码登录。
9.数据同步
1.第一次登录时,数据的同步情况,如个人头像,好友列表等。
2.本终端切换其他账号登录后,数据的同步情况,日志记录情况,如:用户文件夹是否自动创建?
10.账号互踢
1.不同页面下被踢,如:后台运行时被踢,进入前台查看反应;前台运行一级、二级页面下被踢能否提示正确并重定向到登录页面?
2.本终端被踢下线后点击登录能否再次登录。
11.密码错误限制次数
1.密码输入错误是否有最大次数限制?分别测试最大值-1、最大值、最大值+1的输错密码情况。
2.超过最大次数限制后,是否采取强制手段限制登录或对账号暂时冻结处理。
3.超过最大次数限制后,分别输入正确的密码和错误的密码再次登录。
12.不同状态的用户登录
1.未激活的用户登录。
2.被停用的用户登录。
3.登录的操作日志记录是否准确?
4.登录有效性是否控制正确?
13.一个用户是否具备多种登录方式(用户名,手机号,邮箱…)
14.用户名和密码是否对空格敏感。
16.为空和输入空字符串时的校验是否一致?
17.使用中文键盘输入字母时和使用英文键盘输入字母时传给后端的字符长度是否一致?
18.登录成功后的Session时效设置。
19.是否用到缓存?
- 安全测试用例集
1.用户密码后台存储是否加密?
2.用户密码在网络传输过程中是否加密?
3.密码是否具有有效期,密码有效期到期后,是否提示需要修改密码?
4.不登录的情况下,在浏览器中直接输入登录后的URL地址,验证是否会新定向到用户登录界面;
5.密码输入框是否不支持复制和粘贴?
6.密码输入框输入的密码是否都可以在页面源码模式下被查看?
7.用户名和密码的输入框中分别输入典型的“SQL注入攻击”字符串,验证系统的返回页面;
8.用户名和密码的输入框中分别输入典型的“XSS跨站脚本攻击”字符串,验证系统行为是否被篡改?
9.连续登录多次失败的情况下,系统是否会阻止后续的尝试以应对暴力破解?
10.同一用户在同一终端的多种浏览器上登录,验证登录功能的互斥性是否符合设计预期?
11.同一用户先后在多台终端的浏览器上登录,验证登录是否具有互斥性?
12.网络延迟或者弱网切换网络或者断网时正常登录是否正常?
13.是否可记住密码,记住的密码保存是否加密?
14.用户登录后存储在数据库中的用户个人信息是否加密?
15.用户登录过程中log中是否有个人信息明文打印。
16.本终端用户已登录,在其他终端尝试登录本用户账号登录失败时、本终端是否有账号异常操作的安全提示?
17.输入密码时是否有安全键盘模式?点击密码输入框是否能调起安全键盘?(参考各大手机银行APP)
19.网络相关
1.无网络模式下登录,是否给出“网络未连接”或 “网络异常”的提示及提示是否正确?
2.第一次登录请求超时后(服务器出问题,随后恢复正常),再次请求是否能登录成功?
3.第一次无网络情况下登录失败后,再次连接网络并登录。
4.正在登录过程中,遇到网络切换,如(4G切换到WiFi环境时)能否正常登录。
20.已登录的用户,杀死APP进程后,再次打开APP是否依然为已登录状态。
21.异地登录校验、更换设备登录校验、登录信息异常是否考虑账号冻结停用;是否允许第三方工具平台存储密码?
22. - 兼容性测试用例集
1.不同浏览器下,验证登录页面的显示以及功能正确性?
2.相同浏览器的不同版本下,验证登录页面的显示以及功能正确性?
3.不同移动设备终端的不同浏览器下,验证登录页面的显示以及功能正确性。
4.不同分辨率的界面下,验证登录页面的显示以及功能正确性。
4.性能测试用例集
1.单用户登录的响应时间是否小于3秒?
2.单用户登录时,后台请求数量是否过多?
3.高并发场景下用户登录的响应时间是否小于5秒?
4.高并发场景下服务端的监控指标是否符合预期?
5.高集合点并发场景下,是否存在资源死锁和不合理的资源等待?
6.长时间大量用户连续登录和登出,服务器端是否存在内存泄漏?
7.登录用户限制:同时支持10个用户登录,同时9个或者11个用户登录是否正常或者提示信息正确。
- 1.登录的正确性
- 1.显性功能验证
数据库相关
1.Redis和MongoDB的区别?
就Redis和MongoDB来说,大家一般称之为Redis缓存、MongoDB数据库。这也是有道有理有根据的,
Redis主要把数据存储在内存中,其“缓存”的性质远大于其“数据存储“的性质,其中数据的增
删改查也只是像变量操作一样简单;
MongoDB却是一个“存储数据”的系统,增删改查可以添加很多条件,就像SQL数据库一样灵活。
MongoDB和Redis都是NoSQL,采用结构型数据存储。二者在使用场景中,存在一定的区别,这也主要由于
二者在内存映射的处理过程,持久化的处理方法不同。MongoDB建议集群部署,更多的考虑到集群方案,Redis
更偏重于进程顺序写入,虽然支持集群,也仅限于主-从模式。
2.数据库中join的left join , inner join, cross join
1.以A,B两张表为例
A left join B
选出A的所有记录,B表中没有的以null 代替
right join 同理
2.inner join
A,B有交集的记录
3.cross join (笛卡尔积)
A中的每一条记录和B中的每一条记录生成一条记录
例如A中有4条,B中有4条,cross join 就有16条记录
3.关系型数据库和非关系型数据库区别
关系型数据库
优点
1、容易理解:二维表结构是非常贴近逻辑世界一个概念,关系模型相对网状、层次等其他模型来说更容易理解;
2、使用方便:通用的SQL语言使得操作关系型数据库非常方便;
3、易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率;
4、支持SQL,可用于复杂的查询。
5.支持事务
缺点
1、为了维护一致性所付出的巨大代价就是其读写性能比较差;
2、固定的表结构;
3、不支持高并发读写需求;
4、不支持海量数据的高效率读写
非关系型数据库
1、使用键值对存储数据;
2、分布式;
优点
无需经过sql层的解析,读写性能很高
基于键值对,数据没有耦合性,容易扩展
存储数据的格式:nosql的存储格式是key,value形式
缺点
不提供sql支持
算法相关
问题1:给你一串乱序的指定范围的连续数字,里面缺省一位,如何以最快的速度找出缺少的那位数字
例如:数据范围1~100,乱序,其中97缺省,如何以最快的速度找出来缺省数字97
答案:分别求和,两个值相减
第一个和值是sum1:得出1-100的数值总和
第二个和值是sum2:乱序的数值总和
sum1-sum2=缺省值
问题2:怎样找出链表中倒数第k个元素。
答案:双指针,第一个a从链表头出发,第二个从第k个节点出发,a、b同时后移,直到b指向链表尾,循环结束,a则就指向了链表中倒数第k个元素
问题3:写出下列算法的时间复杂度。
(1)冒泡排序 O(nn)
(2)选择排序 O(nn)
(3)插入排序 O(nn)
(4)快速排序 O(nlog n)
(5)堆排序 O(nlog n)
(6)归并排序 O(nlog n)
问题4:编程—判断两个字符串是否可以通过改变字母的顺序变成一样的字符串(String a, String b)
答案:以下两个答案,第一个最容易想到的,先排序,再对比。复杂度:(n logn);第二个函数时间复杂度为O(n)。
def fun_1(s1, s2):
s1, s2 = s1.lower(), s2.lower()
lsts1 = list(s1)
lsts2 = list(s2)
lsts1.sort()
lsts2.sort()
for i, char in enumerate(lsts1):
if lsts2[i] != char:
return False
return True
def fun_2(s1, s2):
s1, s2 = s1.lower(), s2.lower()
lst1 = [0] * 26
lst2 = [0] * 26
l1, l2 = len(s1), len(s2)
for i in range(l1):
pos = ord(s1[i]) - ord('a')
lst1[pos] += 1
for i in range(l2):
pos = ord(s2[i]) - ord('a')
lst2[pos] += 1
for i in range(26):
if lst1[i] != lst2[i]:
return False
return True
常用算法
排序算法:快速排序、归并排序、计数排序
搜索算法:回溯、递归、剪枝技巧
图论:最短路、最小生成树、网络流建模
动态规划:背包问题、最长子序列、计数问题
基础技巧:分治、倍增、二分、贪心
逻辑智力相关
1、你让工人为你工作7天,给工人的回报是一根金条。金条平分成相连的7段
,你必须在每天结束时给他们一段金条,如果只许你两次把金条弄断,你如何给你
的工人付费?
答案:day1 给1 段,
day2 让工人把1 段归还给2 段,
day3 给1 段,
day4 归还1 2 段,给4 段。
day5 依次类推……
2、假设有一个池塘,里面有无穷多的水。现有2个空水壶,容积分别为5升和6升。问题是如何只用这2个水壶从池塘里取得3升的水。
答案:1、先把5升的灌满,倒在6升里,这时6升的壶里有5升水
2.再把5升的灌满,用5升的壶把6升的灌满,这时5升的壶里剩4升水
3.把6升的水倒掉,再把5升壶里剩余的水倒入6升的壶里,这时6升的壶里有4升水
4.把5升壶灌满,倒入6升的壶,5-2=3
3、烧一根不均匀的绳要用一个小时,如何用它来判断半个小时 ?
答案:两边一起烧。