【学习笔记】高级软件测试工程师,常见功能/自动化/性能/安全面试题整理-简答题集锦_20200115

【TCP与UDP的区别】
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

【哪些方法可以提高数据库查询效率】
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 
2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: 
select id from t where num is null 
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: 
select id from t where num=0 
3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。 
4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如: 
select id from t where num=10 or num=20 
可以这样查询: 
select id from t where num=10 
union all 
select id from t where num=20 
5.in 和 not in 也要慎用,否则会导致全表扫描,如: 
select id from t where num in(1,2,3) 
对于连续的数值,能用 between 就不要用 in 了: 
select id from t where num between 1 and 3 
6.下面的查询也将导致全表扫描: 
select id from t where name like '%abc%' 
若要提高效率,可以考虑全文检索

【你在测试中发现了一个bug,但是开发经理认为这不是一个bug,你应该怎样解决】
首先,将问题提交到缺陷管理库里面进行备案。
然后,要获取判断的依据和标准:根据需求说明书、产品说明、原型图、设计文档等,确认实际结果是否与计划有不一致的地方,提供缺陷是否确认的直接依据;
如果没有文档依据,
1)可以根据同行或类似软件的一般特性来说明是否存在不一致的地方,来确认是否是缺陷;
2)根据用户的一般使用习惯,来确认是否是缺陷;
3)与设计人员、开发人员和客户代表等相关人员探讨,确认是否是缺陷;
合理的论述,向测试经理说明自己的判断的理由,等待测试经理做出最终决定,如果仍然存在争议,可以通过公司政策所提供的渠道,向上级反映,并有上级做出决定。

【在搜索引擎中输入汉字就可以解析到对应的域名,请问如何用LoadRunner进行测试】
建立测试计划,确定测试标准和测试范围
设计典型场景的测试用例,覆盖常用业务流程和不常用的业务流程等。
根据测试用例,开发自动测试脚本和场景:
录制测试脚本:新建一个脚本(Web/HTML协议);点击录制按钮,在弹出的对话框的URL中输入”about:blank”;在打开的浏览器中进行正常操作流程后,结束录制;调试脚本并保存,可能要注意到字符集的关联。
设置测试场景:针对性能设置测试场景,主要判断在正常情况下,系统的平均事务响应时间是否达标;针对压力负载设置测试场景,主要判断在长时间处于满负荷或者超出系统承载能力的条件下,系统是否会崩溃;执行测试,获取测试结果,分析测试结果。

【软件测试各个阶段通常完成什么工作?各个阶段的结果文件是什么?包括什么内容?】
单元测试阶段:
各独立单元模块在与系统地其他部分相隔离的情况下进行测试,单元测试针对每一个程序模块进行正确性校验,检查各个程序模块是否正确地实现了规定的功能。生成单元测试报告,提交缺陷报告。
集成测试阶段:
集成测试是在单元测试的基础上,测试在将所有的软件单元按照概要设计规格说明的要求组装成模块、子系统或系统的过程中各部分工作是否达到或实现相应技术指标及要求的活动。该阶段生成集成测试报告,提交缺陷报告。
系统测试阶段:
将通过确认测试的软件,作为整个给予计算机系统的一个元素,与计算机硬件、外设、某些支持软件、数据和人员等其他系统元素结合在一起,在实际运行环境下,对计算机系统进行全面的功能覆盖。该阶段需要提交测试总结和缺陷报告。

【什么时候会用到使用Fiddler】
 1)做安全测试,检测敏感信息是否加密,拦截篡改数据;
 2)当测试时发现缺陷,用fiddler抓包,定位该问题是前端还是后台的问题;
 3)模拟弱网环境。

【关于HTTP协议中状态码的表示,下列说法错误的是(A D)】
A.1**:表示客户端错误
B.2*:表示请求成功地接收 *
C.3**:表示完成请求,客户需要进一步细化请求
D.4**:表示服务器错误

【接口测用了哪些工具】
http 抓包工具 fiddler charles postman
http接口功能测试工具 postman
http接口性能测试工具 jemter
websevice接口 soapui

【接口文档包含哪些内容】
1. 接口的协议(http https),协议的版本
2. 接口的功能
3. 请求方法:请求方法,get和post
4. 请求参数和参数的说明
5. 响应状态码,数据和格式
6. 接口的请求地址(服务器IP+端口+绝对路径)

【web service和http接口的区别在于】
1.接口中实现的方法和要求参数一目了然。
2.不用担心大小写问题。
3.不用担心中文编码 问题。
4.代码中不用多次声明认证(账号,密码)参数。
5.传递参数可以为数组,对象等

【如何提高selenium脚本的执行速度?】
减少操作步骤,如经过三四步才能打开我们要测试的页面的话,我们就可以直接通过网址来打开,减少不必要的操作。
中断页面加载,如果页面加载的内容过多,我们可以查看一下加载慢的原因,如果加载的内容不影响我们测试,就设置超时时间,中断页面加载。
在设置等待时间的时候,可以sleep固定的时间,也可以检测某个元素出现后中断等待也可以提高速度。
配置testNG实现多线程。在编写测试用例的时候,一定要实现松耦合,然后在服务器允许的情况下,尽量设置多线程运行,提高执行速度。

【接口的性能怎么测试?】
我们用Jmeter进行接口的性能测试,性能测试主要测试的接口有(登录发帖加入房间等自己的项目接口),首先分析接口的性能需求,并转为性能指标值,用Jmeter工具模拟HTTP请求,然后用线程组模拟用户并发,收集性能指标值(性能指标值:TPS响应时间并发用户数事务成功率),找出性能拐点,验证后台接口是否稳定

【进程和线程关系及区别】
cpu是以进程处理的,多核是在处理多个进程或者线程。进程在资源管理器里是1个独立的内存单位,但线程是共享内存的,线程不能单独执行,需要依赖于进程,应用进程可以包含多个线程
进程是CPU进行工作的基本单位,而线程则是进程组成的基本单元,一个进程中至少包含一个线程,而同一时间段一个CPU只能对一个进程进行操作
性能测试中,使用进程模拟负载的资源开销相对较大,每个虚拟用户会使用一个单独的mmdrv.exe来完成负载的实现,这样做用户之间会相互独立,不互相影响。使用线程方式,那么所有用户都是在一个mmdrv.exe上模拟,因此使用线程会存在不稳定的情况,导致用户脚本执行错误

【你们这个项目找Bug找了多久?找了多少个BUG?】
例如:我们每次小版本的迭代找Bug的时间大概1周。每个小版本50-100多个BUG的样子

【元素的定位用的是什么方法?】
Css/xpath

【App测试中ios和Android有哪些区别呢?】
1.Android长按home键呼出应用列表和切换应用,然后右滑则终止应用;
2.多分辨率测试,Android端20多种,ios较少;
3.手机操作系统,Android较多,ios较少且不能降级,只能单向升级;新的ios系统中的资源库不能完全兼容低版本中的ios系统中的应用,低版本ios系统中
的应用调用了新的资源库,会直接导致闪退(Crash);
4.操作习惯:Android,Back键是否被重写,测试点击Back键后的反馈是否正
确;应用数据从内存移动到SD卡后能否正常运行等;
5.push 测试:Android:点击home键,程序后台运行时,此时接收到push,点击后唤醒应用,此时是否可以正确跳转;ios,点击home键关闭程序和屏幕锁屏的情况(红点的显示);
6.安装卸载测试:Android的下载和安装的平台和工具和渠道比较多,ios主要
有 app store,iTunes和testflight下载;
7.升级测试:可以被升级的必要条件:新旧版本具有相同的签名;新旧版本具有
相同的包名;有一个标示符区分新旧版本(如版本号),对于Android若有内置的应用需检查升级之后内置文件是否匹配(如内置的输入法)

【测试用例设计的原则是什么】

充分注意测试中的群集现象。经验表明,测试后程序中残存的错误数目与该程序中已发现的错误数目成正比。
严格执行测试计划,排除测试的随意性。
应当对每一个测试结果做全面检查。
妥善保存测试计划,测试用例,出错统计和最终分析报告,为维护提供方便。

【简述什么是静态测试、动态测试】
静态测试是不运行程序本身而寻找程序代码中可能存在的错误或评估程序代码的过程。  
动态测试是实际运行被测程序,输入相应的测试实例,检查运行结果与预期结果的差异,判定执行结果是否符合要求,从而检验程序的正确性、可靠性和有效性,并分析系统运行效率和健壮性等性能。

【软件测试分为黑盒和白盒,分别适合什么情况? 】
软件测试方法一般分为两种:白盒测试与黑盒测试。白盒测试又称为结构测试、逻辑驱动测试或基于程序本身的测试,它着重于程序的内部结构及算法,通常不关心功能与性能指标;黑盒测试又被称为功能测试、数据驱动测试或基于规格说明的测试,它实际上是站在最终用户的立场,检验输入输出信息及系统性能指标是否符合规格说明书中有关功能需求及性能需求的规定。

【软件测试的原则与策略是什么】
软件测试原则:
1、尽早和不断的测试。
2、程序员应该避免检查自己的程序,软件测试应该由第三方构造。
3、设计测试用例时应该考虑到合法的输入和不合法的输入以 及各种边界条件。
4、注意测试中的错误集中发生现象。
5、对测试错误结果有确认过程。
6、制定严格的测试计划,并把测试时间安排的尽量宽松。
7、回归测试的关联性,原有功能过滤
8、进行版本控制,制定变更测试文档的流程。
测试策略,在一定的软件测试标准、测试规范的指导下,依据测试项目的特定环境约束而规定的软件测试的原则、方式、方法的集合,需在测试计划文档中体现

【描述使用bugzilla缺陷管理工具对软件缺陷(BUG)跟踪的管理的流程】
1、测试人员或开发人员发现bug后,判断属于哪个模块的问题,填写bug报告后,系统会自动通过Email通知项目组长或直接通知开发者,另外还有一种状态UNCONFIRME----没有人确认这个bug需要被解决。有正确权限的用户可以确认这个bug,把它的状态改成"NEW"。bug经常直接被解决并被标志成"RESOVL.ED",但是通常的情况是bug需要先被指定这个bug的属主开发人员确认。
2、项目组长根据具体情况,重新reassigned分配给bug所属的开发者。
3、开发者收到Email信息后,判断是否为自己的修改范围.
1)若不是,重新reassigned分配给项目组长或应该分配的开发者。
2)若是,进行处理,resolved 并给出解决方法。(可创建补丁附件及补充说明)
4、测试人员查询开发者已修改的bug,进行重新测试。(可创建test case附件)
1)经验证无误后,修改状态为VERIFIED。待整个产品发布后,修改为CLOSED。
2)还有问题,REOPENED,状态重新变为“New",并发邮件通知。
5、如果这个BUG一周内一直没被处理过。Bugzilla 就会一直用email骚扰它的属主,直到采取行动。管理员可以设定最迟采取行动的期限,比如说3天,系统默认为7天。

【什么是软件质量 软件包是什么】
软件质量是指适当的、无错误的,满足用户的需求,能在预算内按时完成,满足所定的目标期望,并且是可维护的。
软件包是指具有特定的功能,用来完成特定任务的一个程序或一组程序。

【dbms读取一条记录时发生哪些事件】
用户程序A向DBMS发出读一条记录的指令,这时用户程序要给出外部文件名和记录的关键字值;
DBCS分析所接到的指令,访问对应的外部模式;
DBCS完成外部模式到概念模式的转换,决定访问哪些概念文件;
接着由DBSS完成概念模式到存储模式的转换,并且决定访问哪些存储文件;
DBSS调用存取方法,通过操作系统将读取的记录送到系统缓冲区;
用户程序从系统缓冲区得到所需记录和DBMS返回的状态信息;
用户程序在工作区中使用得到的记录

【网状、层次数据模型与关系数据模型的最大的区别是什么】
1、层次模型
满足以下二个条件的基本层次联系的集合:(1)有且只有一个结点没有双亲结点(这个结点叫根结点);(2)除根结点外的其他结点有且只有一个双亲结点.
层次模型与网状模型类似,分别用记录和链接来表示数据和数据间的联系.与网状模型不同的是:层次模型中的记录只能组织成树的集合而不能是任意图的集合.
层次模型可以看成是网状模型的特例,它们都是格式化模型.它们从体系结构、数据库语言到数据存储管理均有共同的特征.在层次模型中,记录的组织不再是一张杂乱无章的图,而是一棵"倒长"的树.
2、网状模型
满足以下二个条件的基本层次联系的集合:(1)允许一个以上的结点没有双亲结点;(2)一个结点可以有多个双亲结点.
网状模型中的数据用记录(与Pascal语言中的记录含义相同)的集合来表示,数据间的联系用链接(可看作指针)来表示.数据库中的记录可被组织成任意图的集合.
3、关系模型
关系模型用表的集合来表示数据和数据间的联系.每个表有多个列,每列有唯一的列名.在关系模型中,无论是从客观事物中抽象出的实体,还是实体之间的联系,都用单一的结构类型——关系来表示.在对关系进行各种处理之后,得到的还是关系——一张新的二维表
 

【自动化面试题】

【自动化环境搭建】
自动化编程语言:安装Python3.6.5
--常用第三方库说明:
PyYAML、tqdm、fake-useragent 、ddt
selenium、requests、jsonpath 
PyMySQL、PrettyTable
openpyxl、xlrd、xlwt、xlwt-future
hashlib、unittest

【基础题】
1.python常见注释有几种?分别有什么区别?
解答:
2.python数据类型有几种?最常用的哪3种?
解答:
3.python格式化打印规则有几种?关键字是什么?
解答:
4.python格式化,保留2位整数右对齐,用“0”填充空占位符如何实现?
解答:
5.python遍历的循环关键字有几种?分别是什么?
解答:

【接口题】
1.HTTP组成部分分别是哪三样?
解答:
2.HTTP请求头缺了什么参数,发起请求会报错403?
解答:
3.HTTP请求头www-form-urlencoded格式,请求体的报文是什么格式?
解答:
4.HTTP调用FIddle工具抓包请求时,POST请求调用代理的关键字是什么?
解答:
5.HTTP字符串格式转字典格式传参,用哪个关键字?
解答:

【UI题】
1.HTML写出CSS的定位表达式:选择A元素下的所有option子元素?
解答:
2.HTML写出XPATH的定位表达式:选择属性为id='food'的A元素下的兄弟元素B?
解答:
3.HTML写出WED端frame窗口的切换表达式:从二级frame窗口切换会最外层frame窗口?
解答:
4.HTML弹框对话框的确定按钮表达式:弹出弹框对话框,分别有确定和取消按钮,如何点击取消按钮?
解答:
5.HTML列表的文本表达式:如何获取列表A下,子元素的内容?
解答:

【什么是数据的对立性 有几个层次】
数据的独立性包括数据库中数据库的逻辑结构和应用程序相互独立,也包括数据物理结构的变化不影响数据的逻辑结构。
数据库的基本结构分三个层次,反映了观察数据库的三种不同角度。
(1)物理数据层。它是数据库的最内层,是物理存贮设备上实际存储的数据的集合。这些数据是原始数据,是用户加工的对象,由内部模式描述的指令操作处理的位串、字符和字组成。
(2)概念数据层。它是数据库的中间一层,是数据库的整体逻辑表示。指出了每个数据的逻辑定义及数据间的逻辑联系,是存贮记录的集合。它所涉及的是数据库所有对象的逻辑关系,而不是它们的物理情况,是数据库管理员概念下的数据库。
(3)逻辑数据层。它是用户所看到和使用的数据库,表示了一个或一些特定用户使用的数据集合,即逻辑记录的集合。

【简述需求分析的过程和意义】
需求分析的过程:
(1)收集用户的需求
(2)编写需求定义文档
(3)编写软件功能说明
(4)编写软件需求跟踪矩阵
(5)审核软件需求文档
需求分析的意义:明确软件具体要实现哪些功能、以便在接下来的概要设计中进一步分析,同时也是对用户需求的一个总结,通过它可以和用户更好的交流。

【多个 API 连续调用的测试用例设计难点是什么?你是如何解决的?】
单个 API 测试并不难,难的是多个 API 的连续调用,并且后一个 API 的参数值使用的是前一个 API 调用的返回结果,这就要求多个 API 调用之间可以方便地进行参数传递。一个最典型的场景就是,前一个 API 调用会返回一个有效的 token,后一个 API 调用需要带着这个 token 才能调用成功。
为了解决这个问题,一般来讲有三种处理方法:
第一种方法是,手工复制前一个 API 返回结果中的某个值,然后粘贴给后一个 API 作为输入参数。当然,这是最基本的方法,但是效率太低,而且无法实现自动化。
第二种方法是,使用基于代码的 API 测试框架。由于此时所有的测试逻辑都是通过代码来实现的,因此可以很容易地实现 API 之间的参数传递。
第三种方法是,借助于类似 HttpRunner 之类的已有 API 测试框架。此类框架可以通过关键字,很方便地将前一个 API 的返回值中的某个值传递给下一个 API 作为输入参数。

【软件测试的目的与原则】
软件测试的目的: 
(1) 测试是为了发现程序中的错误而执行程序的过程;
(2) 好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案;
(3) 成功的测试是发现了至今为止尚未发现的错误的
软件测试的原则: 
1)所有的测试都应追溯到用户需求。2)应尽早地和不断地进行软件测试 
3)在有限的时间和资源下进行测试 5)充分关注测试中的集群现象。
6)程序员应避免检查自己的程序。 7)尽量避免测试的随意性

【如何处理下拉菜单?】
在Selenium中有一个叫Select的类,这个类支持对下拉菜单进行操作。使用方法如下:
1.定位元素
2.把定位的元素转化成Select对象。
sel = Select(定位的元素对象)
3.通过下标或者值或者文本选中下拉框。
sel.select_by_index(index);
sel.select_by_value(value);
sel.select_by_visible_text(text);

【自动化中有哪三类等待?他们有什么特点?】
1.线程等待(强制等待)如time.sleep(2):线程强制休眠2秒钟,2秒过后,再执行后续的代码。建议少用。
2.imlicitlyWait(隐式等待)会在指定的时间范围内不断的查找元素,直到找到元素或超时,特点是必须等待整个页面加载完成。
3.WebDriverWait(显式等待)通常是我们自定义的一个函数代码,这段代码用来等待某个元素加载完成,再继续执行后续的代码


【关闭浏览器中quit和close的区别】
简单来说,两个都可以实现退出浏览器session功能,close是关闭你当前聚焦的tab页面,而quit是关闭全部浏览器tab页面,并退出浏览器session。知道这两个区别,我们就知道quit一般用在结束测试之前的操作,close用在执行用例过程中关闭某一个页面的操作。

【回归测试的含义】
是指对软件的新版本进行测试时,重复执行上一个版本测试时的用例,比如在 1.0 版本中,有一个 bug,到了 2.0 版本中,再重新测试 1.0 中这个 bug

【常见的安全性测试】
⑴用户验证:登录密码验证、IP 地址访问限制等
用户超时:登录超过 30 分钟,重新登录(安全设置,cookie 过期时间 30 分钟)
⑵用户权限管理:验证低级别用户是否具有了高级别用户的权限,各级别用户权限都得到了实现。
⑶系统数据的保护:对例如系统文件、用户密码文件等进行隐藏、密码验证、内容加密、备份。

【你会封装自动化测试框架吗?】
可以,自动化框架主要的核心框架就是分层+PO模式:分别为:基础封装层BasePage,PO页面对象层,TestCase测试用例层。然后再加上日志处理模块,ini配置文件读取模块,unittest+ddt数据驱动模块,jenkins持续集成模式组成。

【如果一个元素无法定位,你一般会考虑哪些方面的原因?】
1.页面加载元素过慢,加等待时间
2.页面有frame框架页,需要先跳转入frame框架再定位
3.可能该元素是动态元素,定位方式要优化,可以使用部分元素定位或通过父节点或兄弟节点定位。
4.可能识别了元素,但是不能操作,比如元素不可用,不可写等。需要使用js先把前置的操作完成。

【什么是PO模式,为什么要使用它】
PO是Page Object 模式的简称,它是一种设计思想,意思是,把一个页面,当做一个对象,页面的元素和元素之间操作方法就是页面对象的属性和行为,PO模式一般使用三层架构,分别为:基础封装层BasePage,PO页面对象层,TestCase测试用例层。

【测试 v 模型优缺点】
优点:包含了底层测试(单元测试)和高层测试(系统测试);清楚的标识了开发和测试的各个  阶段:自上而下逐步求精,每个阶段分工明确,便于整体项目的把控。
缺点:自上而下的顺序导致了,测试工作在编码之后,就导致错误不能及时的进行修改;实际工作中,需求经常变化,导致v模型步骤,反复执行,返工量很大,灵活度较低。改良:每个步骤都可以进行小的选代工作。

【如何处理多窗口?】
这个多窗口之间跳转处理,我们在项目中也经常遇到。就是,当你点击一个链接,这个链接会在一个新的tab打开,然后你接下来要在新tab打开的页面查找元素,
1.我们在点击链接前使用driver.current_window_handle获得当前窗口句柄。
2.再点击链接。点击后通过driver.window_handles获得所有窗口的句柄,
3.然后再循环找到新窗口的句柄,然后再通过driver.switch_to.window()方法跳转到新的窗口。

【需求的标准是什么?】
标准的需求应该包含以下信息:
文档版本信息:包含文档版本、作者、完成日期,如果是修订版需要加上修订记录(包括版本号、修订者、修订日期、修订内容)
目录:目录结构要清晰,不同级别的标题要区分开字号。 
产品架构:一般包括功能架构和信息架构。可根据项目性质来确定
角色定义:产品角色描述,如电商类平台包含的角色有:游客、注册供应商、注册采购商、认证供应商、认证采购商、普通管理员、超级管理员等
功能摘要:通过列出一级功能->二级功能,不需要细分
详细功能描述(产品特性):即产品特性,包括功能列表、原型界面、详细设计(细分页面  元素及约束)等
其它产品需求:依据公司产品要求来定,一般包含系统兼容性要求、产品运营要求、性能要求等.

【在日历这种web 表单你是如何处理的】
首先要分析当前网页试用日历插件的前端代码,看看能不能通过元素定位,点击日期实现,如果不能,可能需要借助javascript。还有些日历控件一个文本输入框,可以直接sendKeys()方法来实现传入一个时间的数据。

【遇到alert弹出窗如何处理?】
使用driver.switch_to.alert方法先跳转到alert弹出窗口
然后再通过accept点击确定按钮,通过dismiss点击取消难,通过text()获得弹出窗口的文本。

【在Selenium中如何实现拖拽滚动条】
在Selenium中通过元素定位会自动帮你拖拽到对应位置,所以是没有自带的scoll方法。但是这个是有限制,例如当前页面高度太长,默认是页上半部分,你定位的元素在页尾,这个时候可能就会报元素不可见的异常。我们就需要利用javaScript来实现拖拽页面滚动条。
我们一般可以两个方法去拖拽,一个是根据拖拽的坐标(像素单位),另外一个是根据拖拽到一个参考元素附件。

猜你喜欢

转载自blog.csdn.net/denzeleo/article/details/110429813