全网最全软件测试面试题(含答案解析+文档)
一、软件测试基础面试题
1、阐述软件生命周期都有哪些阶段? 常见的软件生命周期模型有哪些?
软件生命周期是指一个计算机软件从功能确定设计,到开发成功投入使用,并在使用中不断地修改、增补和完善,直到停止该软件的使用的全过程(从酝酿到废弃的过程)
生命周期从收到应用软供开始算起,到该软件不再使用为止。
它有如下各方面的内容:
初始构思、需求分析、功能设计、内部设计、文档计划、测试计划、文档准备、集成、测 试、维护升级、再测试、逐步淘汰 (phase-out)、等等
常见的软件生命周期模型:
瀑布模型,迭代式模型,快速原型模型,螺旋模型
2、什么是版本控制,常用的版本控制系统有哪些?
版本控制 (Revision control) 是一种软件工程技巧,在在开发的过程中,确保由不同人所编辑的司一文件都得到更新及历史记录的保存。Git(读音为/git/。)是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 https://git-scm.com/docSVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设 计目标就是取代CVs .互联网上很多版本控制服务已从CVs 迁Subversion移https://tortoisesvn.net/support.htm
3、简述软件测试与软件开发之间的关系?
1.项目规划阶段:负责从单元测试到系统测试的整个测试阶段的监控。
2.需求分析阶段:确定测试需求分析、系统测试计划的制定,评审后成为管理项目。测试需求分析是对产品生命周期中测试所需求的资源配置、每阶段评判通过的规约,系统测试计划则是依据软件的需求规格说明书,制定测试计划和设计相应的测试用例。
3.详细设计和概要设计阶段: 确保集成测试计划和单元测试计划完成。
4.编码阶段: 由开发人员进行自己负责部分的代码的测试。在项目较大时,由专人进行编码阶段的测试任务
5.测试阶段(单元、集成、系统测试) :
依据测试代码进行测试,并提交相应的测试状态报告和测试结束报告开发和测试是一个有机的整体!在产品的发布之前,开发和测试是循环进行的, 测出的缺陷要经开发人员修改后继续测试。在开发的同时测试经理开始编写测试用例,测 试文档要参考开发文档,所以开发和测试是不可分割的,少了任何一个都不能开发出产品。从角色方面看,像理论和实验的关系,开发人员通过自己的想象创造出一套思想,之 后测试人员再对它进行检验、证伪,开发人员再修改的过程从而不断丰富产品。
从方法方 面看,是演绎和归纳的关系,一个要掌握大量的技术一个要不断的从实例中学习。因这 两方面的不司,所以开发和测试看上去做的工作很不一样开发与测试是相辅相承、密不可分的,开发人员开发出新的产品后要通过测试判断产 品是否完全满足用户的需求。如果发现缺陷,提交给开发人员进行修复,然后再转交测试 人员进行回归测试,直到产品符合需求规格说明。符合用户需求的产品是开发和测试 共同努力的成果
4、请根据”V”模型分别概述测试人员在软件的需求定
义阶段、设计阶段、编码阶段、系统集成阶段的工作任务及其相应生成的文档?
需求定义阶段:根据项目需求提取测试需求 并形成测试需求文档,根据提取的测试需求和项目计划进行测试计划的拟定,测试计划文档
设计阶段: 根据测试需求拟订测试方案并形成测试方案文档,根据测试方案制定测试用例,并形成测试用例文档
编码阶段:执行测试并完善测试用例文档
系统集成阶段:测试总结报告,阶段问题统计报告,测试问题报告
5、W 模型的描述?
W 模型也称之为双V 模型,一个V 是开发的生命同期,另一个V 是测试的生命周期,W 模型与V模型有一个很大的不同,就是W 模型是一个并行的模型,V 模型是一个串行的模型,W 模型开始是从需求分析开始就开始了,而不是等到编码完成后才开始。
并且测试阶段的划分更清楚,而不仅仅是单元测试、集成测试、系统测试,还包括前期的测试计划、测试方案等内容,这更符合现在企业测试的流程。W 模型强调测试伴随着整个软件开发周期,而且测试的对象不仅仅是程序需求、设计等同样要测试,也就是说,测试与开发是同步进行的。W 模型有利于尽早全面地发现问题。
从需求分析开始测试工程师就参与到项目的测试中,当需求分析完成后,测试工程师就需要参与到需求的验证和确认活动中,并需要提供可测试性需求分析说明书,这样可以尽早地发现需求阶段的缺陷。同时,对需求的测试也有利子及时了解项目难度和测试风险,及早制定应对指施,这将显著减少总体测试时间,加快项目进度。
但W 模型也存在局限性,需求、设计、编码等活动被视为是串行的,同时,测试和开发活动也保持着一种线性的前后关系,上一阶段完全结束,才可正式开始下一阶段工作,这样就无法支持迭代的开发模型。对于当前软件开发复杂多变的情况,W 模型并不能解除测试管理面临的床惑。
总之W 模型具有以下特征:
(1)测试阶段戈分得更全面,不仅仅是单元测试、集成测试和系统测试,
(2)测试与开发是并行的,从需求测试就应该开始介入
(3)提出尽早测试的概念,这样可以险低缺陷修复成本;
(4)测试对象不仅仅是程序,还包括需求或其他的相关文档
6、编写测试计划的目的是?
使测试工作顺利进行,使项目参与人员沟通更舒畅,使测试工作更加系统化
7、测试计划编写的六要素?
why一一为什么要进行这些测试
what一测试哪些方面,不同阶段的工作内容
when一测试不同阶段的起止时间
where一相应文档,缺陷的存放位置,测试环境等
who一项目有关人员组成,安排哪些测试人员进行测试
how一如何去做,使用哪些测试工具以及测试方法进行测试。
8、项目版本执行过程中,测试人员如何把控测试进度?
在项目的系统测试过程中,测试负责人要及时了解测试进度,跟踪 BUG 提交、修复及验证情况以及系统的拷机情况。在开发初期阶段,测试组执行BBFV 时,很多模块、功能点的开发完成进度和原计划会存在一定的偏差,就需要测试负责人动态的刷新WBS 计划,根据实际的开发进度调整测试计划。
在开发阶段,存在版本编译不出来导致无法测试,开发人员修复代码太随意导致版本稳定性反复,需求变更过大导致后端测试开发变更严重等现象,会导致测试工作无法正常进行。
就需要测试负责人及时反馈出来,根据项目本身的特点讲行对应的处理。当测试进度出现延期时,要及时确认问题原因如果是问题协查导致,则需及时与研发人员进行沟通协商,看问题是否必须在测试环境进行排查,若为必现问题可与研发协商要求其在自己环境进行排查,若必须占用测试环境,则需及时调整测试计划,若因此可能影响版本的发布,则应及时与 SE 确认。
若发现有较多BUG 未解决,则应主动联系 SE 及研发人员召开BUG 会确定问题的解决时间。若发现有较多BUG未验证,则应提醒项目组的测试人员及时进行验证,对于一些拷机或非必现的BUG,建议测试人员在此 BUG 上现做拷机标记连续拷机一周未再复现的做关闭处理,若再次复现则继续进行排查。疑难问题的跟控: 比较难复现的问题,怎么去尝试复现。
比较难定位的问题,怎么驱动、反馈给SE,协调开发人员定位问题。比较难处理的问题,怎么跟控反馈进度等每天下班前确认拷机内容,每天上班第一件事需确认拷机结果,只有这样才能保证拷机的效果,实现拷机的真正意义。
9、测试人员在软件开发过程中的任务是什么?
寻找 Bug;避免软件开发过程中的缺陷;衡量软件的品质,关注用户的需求。总的目标是:确保软件的质量。
10、软件缺陷有哪些?
1)软件未实现产品说明书要求的功能
2)软件出现了产品说明书指明不应该出现的错误
3)软件实现了产品说明书未提到的功能
4)软件未实现产品说明书虽未明确提及但应该实现的目标
5)软件难以理解、不易使用、运行缓慢或者从测试员的角度看最终用户会认为不好
为了发现软件产品中的各种缺陷,而对软件产品进行验证和确认的活动过程,此过程贯穿整个软件开发生命周期。简单的说,软件测试是以发现错误为目的而执行的一个程序或系统的过程。
11、你如何理解软件测试的目的?
-
验证软件需求和功能是否得到完整实现
-
验证软件是否可以发布
-
尽可能多的发现软件中的bug
-
尽可能早的发现软件中的bug
-
对软件质量做出合理评估
-
预防下个版本可能出现的问题
-
预防用户使用可能出现的问题
-
发现开发过程中的问题和风险
12、软件测试有哪些原则?
-
所有测试的标准都是建立在用户需求之上 。
-
合理控制测试深度与广度,完全测试不可能,测试的投入与产出要均衡。
-
80-20原则,软件中80%的bug可以在分析、设计与评审阶段就能被发现与修正,16%的缺陷在系统的软件测试中发现,最后剩下的4%是用户长期使用的过程中才能暴露出来。
-
尽可能早的开展测试,越早发现错误,修改的代价越小。
-
发现错误较多的程序段,应进行更深入的测试。
-
软件项目一启动,软件测试也就是开始,而不是等程序写完,才开始进行测试 。
-
软件开发人员即程序员应当避免测试自己的程序
-
严格执行测试计划,排除测试的随意性,以避免发生疏漏或者重复无效的工作
优秀测试人员应具备的素质:
1)沟通能力与表达能力
2)好奇心与怀疑精神
3)责任感与抗压能力
4)自信心,坚持自己的观点
5)耐心与细心
6)逆向思维的能力
7)善于学习与总结
8)团队协作精神
9)文档编写能力
优秀测试人员应具备的技能:
1)精通业务知识
2)具备软件编程能力,比如C,C++,JAVA等。
3)可以用脚本语言编写小测试工具
4)主流操作系统应用与网络知识,可以搭建测试环境
5)熟练掌握各种数据库知识
6)精通软件测试理论与方法
7)掌握常用测试与开发工具的使用
8)优秀的文档编写能力
13、说一说软件测试的组织架构
1)项目型的测试组织:
测试人员作为项目组的固定成员,从头到尾的跟着项目走
2)智能型的测试组织:
测试人员参与到项目中,是以独立的测试部门委派的方式进入
3)综合型的测试组织:
项目型与职能型的结构组合并加以改造而产生的。测试部门把测试人员,分为常规项目测试人员与专项测试人员。测试部门会把常规测试人员长期委派到项目组中,成为项目中的一员。专项测试人员,一般由性能测试工程师、自动化测试工程师、安全性测试工程师等组成。只有当项目发生专门需求测试时,测试部门才灵活把专项测试人员委派到各个项目组进行专项测试。
14、软件测试常见分类有哪些?
1)按照是否执行被测试软件来分:
静态测试:是指不运行软件,测试包括代码检查、静态结构分析、代码质量度量等,主要对软件需求说明书、设计说明书、软件源代码进行检查与分析。
动态测试:指通过运行被测程序,检查运行结果与预期结果的差异,分析差异原因,并分析软件运行效率、健壮性等性能。动态测试是目前公司主要的测试方式
2)按照测试技术分为黑盒测试和白盒测试:
黑盒测试:黑盒测试又叫功能测试或数据驱动测试,在完全不考虑程序内部结构和内部特性的情况下,通过软件的外部表现来发现其缺陷和错误。
白盒测试:白盒测试也称结构测试或逻辑驱动测试,它是按照程序内部的结构进行测试程序,通过测试来检测产品内部逻辑是否按照设计规格说明书的规定正常进行,检验程序中的每条通路是否都能按预定要求正确工作。
3)按照测试手段来分:可以分为手工测试和自动化测试
4)按照过程阶段来分:可以分为单元测试、集成测试、系统测试和验收测试
单元测试:通过模块(类/方法/函数)测试,使代码达到设计要求 主要目的是针对编码过程中可能存在的各种错误,例如用户输入验证过程中的边界值的错误。
集成测试:将经过单元测试的模块逐步组装成完整的程序。主要目的是检查各单元与其它程序部分之间的接口是否存在问题,各模块功能之间是否有影响。
系统测试:是将已经确认的软件、计算机硬件、外设、网络等其他元素结合在一起进行测试。系统测试是针对整个产品系统进行的测试,目的是验证系统是否满足了需求规格的定义,找出与需求规格不符或与之矛盾的地方 ,进行改正。
验收测试:验收测试是在软件产品完成了单元测试、集成测试和系统测试之后,产品发布之前所进行的最后一次软件测试活动,也称为交付测试。通常由业务专家或用户进行,以确认产品能真正符合用户业务上的需要。
15、软件开发流程和开发模型?
软件生命周期:
计划-》需求分析-》设计-》程序编写-》测试-》运行/维护
软件测试流程:
测试计划-》需求分析-》测试用例-》测试用例执行-》提交bug-》回归测试
瀑布模型:适用于需求很明确的项目,分阶段向下进行,无法回溯
迭代模型:需求不明确,迭代版本系统
敏捷开发模型:
敏捷开发是一种以人为核心、迭代、循序渐进的开发方法。在敏捷开发中,软件项目被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。
测试驱动开发模型:先编写测试代码,再写开发代码
16、软件测试模型有哪些?
V模型:反映了测试与开发阶段之间一一对应的特点,测试在开发之后,出错后回归测试量大
W模型:测试伴随整个开发周期,测试与开发同步进行,有利于尽早发现问题
H模型:软件测试活动完全独立,与其他流程并行
二、WEB功能测试面试题
1、Student-coures-Studentcourse表关系如下:
student(sno,sname,age,sdept)学生表
course(cno,cname,teacher)课程表
Studentcourse(sno,cno,grade)选课表写出sql语句:
·查询所有课程都及格的学生号和姓名·查询平均分不及格的课程号和平均成绩
找出各门课程的平均成绩,输出课程号和平均成绩
找出没有选择c2课程的学生信息
2、请说出XHTML和HTML的区别
1、文档顶部doctype声明不同,xhtml的doctype顶部声明中明确规定了xhtml DTD的写法;
2. html元素必须正确嵌套,不能乱;3、属性必须是小写的;
4、属性值必须加引号;
5、标签必须有结束,单标签也应该用“/”来结束掉;
3、很多网站不常用table iframe这两个元素,知道原因吗
因为浏览器页面渲染的时候是从上至下的,而table和iframe这两种元素会改变这样渲染规则,他们是要等待自己元素内的内容加载完才整体渲染。用户体验会很不友好。
4、jpg和png格式的图片有什么区别?
jpg是有损压缩格式,png是无损压缩格式。所以,相同的图片,jpg体积会小。
比如我们一些官网的banner图,一般都很大,所以适合用jpg类型的图片。
但png分8位的和24位的,8位的体积会小很多,但在某些浏览器下8位的png图片会有锯齿。
5、简述—下src与href的区别
浏览器会识别href引用的文档并行下载该文档,并且不会停止对当前文档的处理
当浏览器解析到src引|用时,会暂停浏览器的渲染,直到该资源加载完毕。这也是将js脚本放在底部而不是头部的原因。
6、:before和::before区别?
单冒号(t)用于CSS3伪类,双冒号(:)用于CSS3伪元素。
对于CSS2之前已有的伪元素,比如:before,单冒号和双冒号的写法::before作用是一样的。
7、如何理解HTML结构的语义化?
所谓标签语义化,就是指标签的含义。语义化的主要目的就是让大家直观的认识标签(markup)和属性(attribute)的用途和作用,对搜索引擎友好,有了良好的结构和语义我们的网页内容便自然容易被搜索引擎抓取,这种符合搜索引擎收索规则的做法,网站的推广便可以省下不少的功夫,而且可维护性更高,因为结构清晰,十分易于阅读。这也是搜索引擎优化SEO重要的一步。
8、常见的视频编码格式有几种?视频格式有几种?
视频格式:MPEG-1、MPEG-2和MPEG4 、AVl .RM、ASF和WMV格式
视频编码格式:H.264、MPEG-4、MPEG-2.WMA-HD以及VC-1
9、JS中null, undefined的区别?
null表示一个对象被定义了,但存放了空指针,转换为数值时为0。
undefined表示声明的变量未初始化,转换为数值时为NAN。
typeof(null) - object;
typeof(undefined) - undefined
10、什么是sql注入,什么是跨站脚本,什么是跨站请求伪造?
SQL注入攻击是注入攻击最常见的形式(此外还有OS注入攻击( Struts 2的高危漏洞就是通过OGNL实施OS注入攻击导致的)),当服务器使用请求参数构造SQL语句时,恶意的SQL被嵌入到SQL中交给数据库执行。SQL注入攻击需要攻击者对数据库结构有所了解才能进行,攻击者想要获得表结构有多种方式:
- 如果使用开源系统搭建网站,数据库结构也是公开的(目前有很多现成的系统可以直接搭建论坛,电商网站,虽然方便快捷但是风险是必须要认真评估的);
- 错误回显(如果将服务器的错误信息直接显示在页面上,攻击者可以通过非法参数引发页面错误从而通过错误信息了解数据库结构,Web 应用应当设置友好的错误页,一方面符合最小惊讶原则,一方面屏蔽掉可能给系统带来危险的错误回显信息);
- 盲注。防范SQL注入攻击也可以采用消毒的方式,通过正则表达式对请求参数进行验证,此外,参数绑定也是很好的手段,这样恶意的SQL会被当做SQL的参数而不是命令被执行,JDBC中的PreparedStatement 就是支持参数绑定的语句对象,从性能和安全性上都明显优于Statement。
xss (Cross Site Script,跨站脚本攻击)是向网页中注入恶意脚本在用户浏览网页时在用户浏览器中执行恶意脚本的攻击方式。跨站脚本攻击分有两种形式:
反射型攻击(诱使用户点击一个嵌入恶意脚本的链接以达到攻击的目标,目前有很多攻击者利用论坛、微博发布含有恶意脚本的URL就属于这种方式)
持久型攻击(将恶意脚本提交到被攻击网站的数据库中,用户浏览网页时,恶意脚本从数据库中被加载到页面执行,QQ邮箱的早期版本就曾经被利用作为持久型跨站脚本攻击的平台)。
CSRF 攻击(Cross Site Request Forgery,跨站请求伪造)是攻击者通过跨站请求,以合法的用户身份进行非法操作(如转账或发帖等)。CSRF的原理是利用浏览器的Cookie或服务器的Session ,盗取用户身份,其原理如下图所示。防范CSRF的主要手段是识别请求者的身份,主要有以下几种方式:
- 在表单中添加令牌(token) ;
- 验证码;
- 检查请求头中的Referer (前面提到防图片盗链接也是用的这种方式)。
令牌和验证都具有一次消费性的特征,因此在原理上一致的,但是验证码是一种糟糕的用户体验,不是必要的情况下不要轻易使用验证码,目前很多网站的做法是如果在短时间内多次提交一个表单未获得成功后才要求提供验证码,这样会获得较好的用户体验。
三、APP测试面试题
(1)基础篇
1、请介绍一下,APP测试流程?
APP测试流程与web测试流程类似,分为如下七个阶段:
1.根据需求说明书编写测试计划;
2.制定测试方案,主要是测试任务、测试人员和测试时间的分配;
3.测试准备,包括搭建测试环境,准备测试数据,确定测试方法;
4.测试用例的设计与编写,进行用例评审及补充完善;
5.执行测试时首先进行冒烟测试,然后对主功能流程进行测试,包括客户端的单个功能模块,及功能业务逻辑功能交互,回归测试;
6.提交测试结果,包括测试用例,测试计划;
7.日常维护性测试;
APP测试周期可根据项目的开发周期来确定测试时间,一般测试时间为两三周,根据项目情况以及版本质量可适当缩短或延长测试时间。
2、APP测试需要提前准备哪些测试资源?
具体要准备的测试资源,根据实际项目来,可以从以下几个方面出发:
1.IOS设备、Android设备(选取市面上主流手机产品);
2.支付宝/银联支付的项目,需要提前申请支付宝/银联账户等等;
3.有秒杀专题的题目,需要规划秒杀时间表;
4.有优惠券使用的项目,需要添加优惠券数据;
3、APP测试和Web测试的区别?
单纯从功能测试的层面上来讲的话,APP 测试、web 测试在流程和功能测试上是没有区别的。
相同点:
1.同样的测试用例设计方法;
2.同样的测试方法:都会依据原型图或效果图检查UI;
3.测试页面载入和翻页的速度、登录时长、内存是否溢出等;
4.测试应用系统的稳定性;
不同点:
1.系统结构方面
-
web项目,b/s架构,基于浏览器的;web测试只要更新了服务器端,客户端就会同步更新。
-
app项目,c/s结构的,必须要有客户端;app 修改了服务端,则客户端用户所有核心版本都需要进行回归测试一遍。
2.性能方面
-
web项目 需监测 响应时间、CPU、Memory;
-
app项目 除了监测 响应时间、CPU、Memory外,还需监测 流量、电量等;
3.兼容性方面
-
web项目:浏览器(火狐、谷歌、IE等);操作系统(Windows7、Windows10、Linux等)。
-
app项目:设备系统:iOS(ipad、iphone)、Android(三星、华为、联想等) 、Windows(Win7、Win8)、OSX(Mac);手机设备可根据 手机型号、分辨率、屏幕尺寸不同。
4.测试工具方面
- 自动化工具:APP 一般使用 Appium; Web 一般使用 Selenium;
- 性能测试工具:APP 一般使用Monkey、 JMeter; Web 一般使用 LR、JMeter;
4、相对于 Web 项目,APP有哪些专项测试
1)干扰测试:中断,来电,短信,关机,重启等。
2)弱网络测试(模拟2g、3g、4g、5g,wifi网络状态以及丢包情况);网络切换测试(网络断开后重连、3g切换到4g、5g/wifi 等)。
3)安装、更新、卸载,中断、前后台切换。
-
安装:需考虑安装时的中断、弱网、安装后删除安装文件,全新安装、升级安装、第三方工具安装等情况;
-
卸载:需考虑第三方工具卸载、直接卸载卸,载后是否删除app相关的文件;
-
更新:分强制更新、非强制更新、增量包更新、断点续传、弱网状态下更新;
-
中断:来电中断、短信中断、闹钟中断、手机锁定、手机断电、手机死机;
4)界面操作:关于手机端测试,需注意手势,横竖屏切换,多点触控,前后台切换。
5)安全测试:安装包是否可反编译代码、安装包是否签名、权限设置,例如访问通讯录等。
6)边界测试:可用存储空间少、没有SD卡/双SD卡、飞行模式、系统时间有误、第三方依赖(QQ、微信登录)等。
7)权限测试:设置某个App是否可以获取该权限,例如是否可访问通讯录、相册、照相机等。
5、Android手机和IOS手机,系统有什么区别?
1.两者运行机制不同:IOS采用的是沙盒运行机制,安卓采用的是虚拟机运行机制。
IOS 沙盒运行机制:
-
每个程序都有自己的虚拟地址空间。所以,程序之间不能进行访问。
-
默认只会将应用的最后运行数据,记录在RAM里面。
Android 虚拟机运行机制:
-
所有的应用程序都是运行在虚拟机中,用户界面其实是由虚拟机传递的,并且通过虚拟机,Android的任何程序都就可以轻松访问其他程序文件。
-
所有的Android的应用程序都是运行在RAM里面的,所以会发现有时候Android用着用着就开始有点卡顿。
2.两者后台制度不同:IOS中任何第三方程序都不能在后台运行;安卓中任何程序都能在后台运行,直到没有内存才会关闭。
3.IOS中用于UI指令权限最高,安卓中数据处理指令权限最高。
6、IOS和Android的APP测试有什么区别?
1.物理按键:Android长按home键呼出应用列表和切换应用,然后右滑则终止应用;iOS所有的返回上一层,只能靠页面功能实现。
2.多分辨率测试:Android端20多种;IOS较少。
3.手机操作系统:Android较多,IOS较少且不能降级,只能单向升级;新的IOS系统中的资源库不能完全兼容低版本中的IOS系统中的应用,低版本IOS系统中的应用调用了新的资源库,会直接导致闪退。
4.操作习惯:Android,Back键是否被重写,测试点击Back键后的反馈是否正确;应用数据从内存移动到SD卡后能否正常运行等。
5.push测试:Android点击home键,程序后台运行时,此时接收到push,点击后唤醒应用,此时是否可以正确跳转;IOS点击home键关闭程序和屏幕锁屏的情况(红点的显示)。
6.安装卸载测试:Android可以通过手机自带的应用市场或者是第三方的手机助手进行下载,下载和安装的平台和工具和渠道比较多;IOS主要有app store,iTunes和testflight下载。
7.升级测试:可以被升级的必要条件:新旧版本具有相同的签名;新旧版本具有相同的包名;有一个标示符区分新旧版本(如版本号)。
8.支付方式:对于一些有内购功能的APP,Android直接调用第三方支付渠道完成支付;IOS需要先在APP store里绑定支付方式,然后通过APP store去完成支付操作。
9.消息推送机制:Android使用第三方或者自建平台进行消息推送;IOS的消息推送渠道由苹果官方提供。
7、介绍一个APP抓包工具?
一般用Fiddler,主要用来做app抓包使用,先在Fiddler客户端做好各项配置,端口设置为8888;然后在手机上设置代理,就可以抓包,主要看的是服务器返回的值、还能够修改传入参数、传出的参数、模拟网络延时,构造不同场景。
8、APP日志如何抓取?
-
可以使用adb命令:adb logcat | find "com.sankuai.meituan" >d:\test.txt
-
也可以用ddms抓取,手机连上电脑,打开ddms工具;
-
或者在Android Studio开发工具中,打开DDMS;
9、常用的adb命令有哪些?
1.查看帮助手册列出所有的选项说明及子命令:
adb help
2.获取设备列表及设备状态:
adb devices
3.安装应用:adb install 路径\xx.apk, 安装应用;adb install -r 重新安装。
adb install
adb install -r
4.获取设备的状态,设备的状态有 device , offline , unknown3种,其中device:设备正常连接,offline:连接出现异常,设备无响应,unknown:没有连接设备。
adb get-state
5.卸载应用:adb uninstall <包名>, 后面的参数是应用的包名,区别于 apk 文件名。
adb uninstall
6.将 Android 设备上的文件或者文件夹复制到电脑本地:adb pull <远程路径> <本地路径>, 如复制 Sdcard 下的 pull.txt 文件到 D 盘:adb pull sdcard/pull.txt d:\,重命名:adb pull sdcard/pull.txt d:\rename.txt。
adb pull
7.推送本地文件至 Android 设备:adb push <本地路径> <远程路径>, 如推送 D 盘下的 ITester.txt 至 Sdcard:adb push d:\ITester.txt sdcard/ (注意sdcard 后面的斜杠不能少)。
adb push
8.结束和启动adb服务:adb kill-server /adb start-server , 结束 adb 服务/启动 adb 服务,通常两个命令一起用,设备状态异常时使用 kill-server,运行 start-server 进行重启服务。
adb kill-server
adb start-server
9.打印及清除系统日志:adb logcat , 打印 Android 的系统日志 ;adb logcat -c,清除日志。
adb logcat
adb logcat -c
10.查找包名/活动名
adb logcat | findstr START
10、adb三个组件是指?
ADB作为一个客户端/服务器架构的命令行工具,主要由3个部分组成。
-
adb clent(客户端):可以通过它对Android应用进行安装、卸载及调试。
-
adb service(服务器):管理客户端到Android设备上abd后台进程的连接,负责管理client和damon进行通信。
-
adb daemon(守护进程):运行在Android设备上的adb后台进程。
(2)进阶篇
1、介绍一下Android四大组件?
Android四大基本组件:Activity、BroadcastReceiver广播接收器、ContentProvider内容提供者、Service服务。
-
Activity:应用程序中,一个Activity就相当于手机屏幕,它是一种可以包含用户界面的组件,主要用于和用户进行交互。一个应用程序可以包含许多活动,比如事件的点击,一般都会触发一个新的Activity。
-
BroadcastReceiver广播接收器:应用可以使用它对外部事件进行过滤只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。广播接收器没有用户界面。然而,它们可以启动一个activity或serice 来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。
-
ContentProvider内容提供者:内容提供者主要用于在不同应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问数据的安全性。只有需要在多个应用程序间共享数据时才需要内容提供者。例如:通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。它的好处:统一数据访问方式。
-
Service服务:是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要长期运行的任务(一边打电话,后台挂着QQ)。服务的运行不依赖于任何用户界面,即使程序被切换到后台,或者用户打开了另一个应用程序,服务仍然能够保持正常运行,不过服务并不是运行在一个独立的进程当中,而是依赖于创建服务时所在的应用程序进程。当某个应用程序进程被杀掉后,所有依赖于该进程的服务也会停止运行(正在听音乐,然后把音乐程序退出)。
2、Activity生命周期?
生命周期即活动从开始到结束所经历的各种状态,从一个状态到另一个状态的转变,从无到有再到无,Activity本质上有四种状态:
-
运行(Active/Running):Activity处于活动状态,此时Activity处于栈顶,是可见状态,可以与用户进行交互。
-
暂停(Paused):当Activity失去焦点时,或被一个新的非全面屏的Activity,或被一个透明的Activity放置在栈顶时,Activity就转化为Paused状态。此刻并不会被销毁,只是失去了与用户交互的能力,其所有的状态信息及其成员变量都还在,只有在系统内存紧张的情况下,才有可能被系统回收掉。
-
停止(Stopped):当Activity被系统完全覆盖时,被覆盖的Activity就会进入Stopped状态,此时已不在可见,但是资源还是没有被收回。
-
系统回收(Killed):当Activity被系统回收掉,Activity就处于Killed状态。
如果一个活动在处于停止或者暂停的状态下,系统内存缺乏时会将其结束(finish)或者杀死(kill)。这种非正常情况下,系统在杀死或者结束之前会调用onSaveInstance()方法来保存信息,同时,当Activity被移动到前台时,重新启动该Activity并调用onRestoreInstance()方法加载保留的信息,以保持原有的状态。
在上面的四中常有的状态之间,还有着其他的生命周期来作为不同状态之间的过渡,用于在不同的状态之间进行转换。
3、请介绍一下,Android SDK中自带的几个工具?
有如下几个工具:
-
ddms:Dalvik Debug Monitor Service,是 Android 开发环境中的Dalvik[虚拟机]调试监控服务。
-
monkey:Android中的一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试。
-
uiautomator:UIAutomator是Eclipse自带的用于UI自动化测试工具,可仿真APP上的单击、滑动、输入文本等操作。
-
monitor:同uiautomator
-
adb:ADB的全称为Android Debug Bridge,就是起到调试桥的作用。通过ADB我们可以在Eclipse中方面通过DDMS来调试Android程序,就是debug工具。
4、你所了解的APP测试工具?
APP自动化测试工具:
-
Appium
-
Airtest
-
uiautomator2(python)
APP稳定性测试工具:
-
Monkey
-
MonkeyRunner
-
Maxim
-
UICrawler
APP性能测试工具:
-
Perfdog
-
SoloPi
APP弱网测试&抓包工具:
-
Fiddler
-
Charles
APP兼容性测试工具:
-
TestIn
-
腾讯优测
-
百度MTC
-
阿里MQC
APP安全测试工具:
-
OWASP ZAP
-
Drozer
-
MobSF
-
QARK
5、介绍一下冷启动、暖启动、热启动、首屏启动?
APP启动会发生多个事件,测试人员需要知道整个环节是否出现问题,需要了解到具体是哪个环节存在问题:
-
冷启动:当进程不存在的时候,从进程创建开始到界面的展示的过程;
-
暖启动:有一部分资源已经存在,进程存在,相对于热启动要消耗更多资源。当用户退出应用程序时,进程还会存在,暖启动相较于冷启动只是少了进程的创建;
-
热启动:大部分资源都在,只是应用之间的切换;
-
首屏启动:第一屏加载完整;
标准:
-
冷启动:需要5秒甚至更长;
-
暖启动:需要2秒甚至更长;
-
热启动:需要1.5秒甚至更长;
整个启动过程可以用adb工具进行分析,利用adb logcat获取启动数据,或者录屏,使用ffmpeg拆帧分析。
adb logcat
首先定义一个变量,这个变量填写用到的包名。
package=com.xueqiu.android
清除缓存数据:
adb shell pm clear $package
停止进程:
adb shell am force-stop $package
通过以上命令就做好了冷启动的环境,下面启动app并获取数据。启动App
adb shell am start -S -W $package/.view.WelcomeActivityAlias
-S表示启动之前先停止应用进程
-W是表示等待对应的activity启动完成
获取数据:bash adb logcat |grep -i displayed
获取的时间如下:
6、谈谈对冷启动的理解?
应用的启动可以分为冷启动,热启动和温启动,而启动最慢、耗时最长的就是冷启动。
冷启动开始时,系统会依次执行三个任务去启动APP:
-
加载和启动应用程序;
-
APP启动后,立即创建一个空白的启动Window;
-
创建APP的进程;
在这三个任务执行后,系统创建了应用进程,那么应用进程接下来会执行下一步:
-
创建APP对象;
-
开启一个主线程;
-
创建启动页的Activity;
-
加载View;
-
布局view到屏幕;
-
进行初始绘制显示视图;
当应用进程完成初始绘制之后,系统进程用启动页的Activity来替换当前显示的空白Window,这个时刻用户就可以使用App了。
四、接口测试常见面试题
1、请描述下HTTP接口?
了解HTTP接口首先需要知道HTTP是什么。
HTTP的全称为:HyperText Transfer Protocol,即超文本传输协议 。百度百科中对HTTP协议的解释是http是一个简单的请求-响应协议,通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息及会得到什么样的响应。请求和响应消息的头以ASCII码形式给出;而消息内容则具有一个类似MIME的格式。
所以HTTP是工作于 客户端/服务端架构之上的。通常情况下,常用的web服务器有Apache服务器、 IIS服务器等等。
OSI模型中的七层结构见下图,而HTTP是属于应用层,定义应用程序的功能 。
用户通过URL向HTTP服务端发送请求,HTTP服务器经过一系列的算法处理请求后再把相应的结果返回给用户(即浏览器)。
2、GET接口与 POST接口分别有什么特点,有什么区别?
GET接口是从指定的资源中获取数据的,参数通过URL发送
POST是把需要处理的数据提交到指定的资源 POST的参数不能通过URL发送,只能从请求的的消息主体中发送。
3、HTTP1.1版本中有哪些请求方法?
1.0版本中有三种方法即GET POST HEAD。
http1.1版本中新增了OPTIONS DELETE PUT CONNECT TRACE5种请求方法.
4、HTTP响应消息由哪些部分组成?
响应消息包括状态行,消息报头和响应正文
5、HTTP某个状态码的含义(如:304代表什么)或是XX状态码头的含义
1xx表示请求已接收 ,继续处理
2xx 请求成功接收
3xx 重定向 ,需要进一步操作
4xx 请求错误 ,属于客户端错误
5xx 请求合法,但服务器无法处理,属于服务端错误
常见的状态码见下图:
6、你怎么理解RPC接口,有什么作用?
RPC 的全称为:Remote Procedure Call Protocol即远程过程调用协议。
RPC通过网络从远程的服务器上请求服务无需了解底层技术协议 。RPC采用的是客户端/服务端模式,RPC的作用是开发方便、直接,安全性高,特别是在一些大型项目中,内部的子系统及接口比较多的情况下,采用网络分布式的多个APP开发更加容易 。
7、RPC的工作流程是怎样的?
下图为RPC的工作流程:
8、请描述下RPC的各个核心部件
Remoting 网络通信框架 实现了消息机制 RPC远程过程调用 ,支持集群,负载均衡 Registry服务目录框架
9、接口测试的流程
接口测试流程也与公司要求、项目性质有所区别,可以适当增减节点。
阅读接口文档(接口文档形式各个公司不同)
设计接口测试用例
准备测试环境、测试工具及测试数据
执行测试
提交缺陷报告,回归测试
编写测试报告
10、你之前使用过的接口测试工具有哪些
postman、jmeter、RESTClient、loadrunner、SoapUI等
本人常用的有postman、jmeter
postman使用操作非常简单,支持测试case的管理 ,文件上传、响应验证以及环境参数管理还可以批量运行
jmeter是一款免费开源的轻量工具,可以用来做简单的压力测试,也可以自己写接口脚本验证。
11、调用HTTP接口时如何获取到HTTPClient库?
使用maven管理的话可以加入GroupId及 ArtifactID均为 commons-httpclient的依赖即可。
12、你之前怎么做RPC接口测试,有哪些准备工作?
接口调用客户端依赖包 配置接口远程服务端的Consumer Provider 编写RPC接口测试脚本。
13、说说HTTP单接口测试与 RPC接口测试的特点
RPC接口编写测试脚本时是需要导入JAR包,并且配置好Consumer。Http单接口测试是提交数据的方式 ,常用的提交数据方式有application/x-www-form-urlencoded multipart/form-data
14、针对你之前做的项目中简单描述下日志工具是怎么配置的
以maven为例,首先,需要引入Log4j,在CLASSPATH目录下建立一个文件log4j.properties,然后使用API输出日志
15、GIT代码版本控制工具的常用命令
第一次从Git下载新代码:git clone xx.git “下载目录”
从远程仓库克隆:git clone “url”
添加目录:git add “要添加的目录”
提交:commit
查看所有的本地分支:git branch
查看所有的远程分支:git branch -r
新建分支:git branch 新建分支名称
切换分支:git checkout 切换分支名称
合并分支:git merge 要合并的分支
查看git状态:git status
查看当前文件与上次时的区别:git diff 文件名
查看提交日志:git log
回退到上一个版本:git reset
删除版本库的文件:git rm 文件名
16、简要说明JUnit的测试框架
JUnit是用Java语言编写的单元测试框架,使用JUnit进行测试前需要先继承TestCase类。应用比较多的领域有重构和极限编程。
17、TestNG常用的annotation关键字的含义
@Test 标记一个类或方法
@BeforeSuite被@BeforeSuite注解的方法,会在所有测试运行之前运行。
@AfterSuite被@AfterSuite注解的方法,会在所有测试运行之后运行。
@BeforeTest被@BeforeTest注解的方法,在测试执行之前运行。
@AfterTest被@AfterTest注解的方法,在测试执行之后运行。
@BeforeClass被@BeforeClass注解的方法会在当前类的第1个测试方法运行前运行。
@AfterClass被@AfterClass注解的方法会在当前类的第1个测试方法调用后运行。
@BeforeMethod被@BeforeMethod注解的方法,会在每个测试方法调用之前运行。
@AfterMethod被@AfterMethod注解的方法会在每个测试方法调用后运行。
18、TestNG常用的断言方法
assertTrue判断是否为True
assertFalse判断是否为false
assertNull判断是否为null
assertNotNull判断是否不为null
assertSame判断引用地址是否相同
assertNotSame判断引用地址是否不同
19、TestNG多线程测试时的annotation如何使用
invocationCount \threadPoolSize
20、TestNG怎么导出测试报告
TestNG自带了导出测试报告的功能 ,但可读性较差,可以用maven下载ReportNG的依赖并在pom.xml中进行配置。也可以使用插件。
五、自动化测试面试真题
(1)编程语法题
1 、 python 有哪些数据类型
-
python 数据类型有很多,基本数据类型有整型(数字)、字符串、元组、列表、字典和布尔类型等
2 、怎么将两个字典合并
-
调用字典的 update 方法,合并 2 个字典。
3 、 json.l python 如何将 json 写到文件里?
-
loads() 是将字符串转化为字典
-
json.load()是将文件打开从字符串转换成数据类型
-
json.dumps () 是将字典转化为字符串
-
json.dump()是将数据类型转换成字符串并存储在文件中
4 、 __init__ 和 __new__ 区别?
-
__new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该
实例对象,是个静态方法。
-
__init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值,通常用在初始化一个类实例的时候。是一个实例方法。
5 、什么是可变、不可变类型?
-
可变数据类型:列表 list 和字典 dict;
-
不可变数据类型:整型 int、浮点型 float、字符串型 string 和元组 tuple
6 、 mysql 注入点,用工具对目标站直接写入一句话,需要哪些条件?
mysql 写入一句话需要具备
-
1.secure-file-priv='',即:my.ini 文件,打开找到 secure-file-priv 参数改空
-
2.当前用户具备 root 权限
-
3.已获取到应用程序的绝对路径,且目录可以进行文件写入操作。
7 、 python 深浅拷贝的区别
-
对于不可变数据来说深浅拷贝的结果一致会重新创一个数据的副本。浅拷贝对于
可变类型来说只会拷贝其元素的引用。
-
深拷贝对于可变元素来说会递归的整个重新创建一个原数据的副本。
8 、 python 为什么使用 *args 和 **kwargs
如果我们不确定要往函数中传入多少个参数,或者我们想往函数中以列表和元组
的形式传参数时,那就使用*args;如果我们不知道要往函数中传入多少个关
键词参数,或者想传入字典的值作为关键词参数时,那就要使用**kwargs。args
和 kwargs 这两个标识符是约定俗成的用法,你当然还可以用*bob 和**billy,
但是这样就不太专业。
9 、重写和重载有什么区别?
-
重写:用在类的继承当中。子类对父类的同名方法,进行重写。在子类同名方法
内部,如果要延用父类的方法,可以使用 super 调用。
-
重载:用在类当中,对于同一个方法名,支持不同类型的参数,支持不同数量的
-
参数。由于 python 的函数本身就对参数不作类型限定,也有*args 和**kwargs
支持不定长度参数。
10 、 python 实现 get 数据库的表?你是怎么实现的?
python 当中对于不同数据库,都有不同的第三库来实现连接和数据库操作。
比较熟悉的是对 mysql 的操作。使用的是 pymysql 这个第三方库。第一步是建立
数 据 库 连 接 ;第 二 步 调 用 execute 方 法 执 行 sql 语 句 , 第 三 步 使 用
fetchone,fetchall,fetchmany 去获取不同条数的结果。
11 、对象 ( 实例 ) 方法,类方法,静态方法的定义有何不同?分别适用于什么场
景?
-
python 中,类中定义的普通函数就是对象方法,对象方法中的第一个形参一般
会定义为`self`,表示调用的对象本身,当对象调用对象方法时会被隐式的传递
给这个形参。所以当函数需要用到对象或对象的属性时一般会将其定义为对象方
法。
-
类方法定义时,需要使用装饰器`classmethod`进行装饰,类方法中的第一个形
参一般会定义为`cls`,表示类本身。当对象调用或类调用类方法时,类会被隐
式的传递给这个形参。所以当函数需要用到类或者类的属性时一般会将其定义为
类方法。
-
静态方法定义时,需要使用装饰器`staticmethod`进行装饰,其他与普通函数没
有区别。一般会将一些与对象和类无关的工具函数定义为静态方法,方便调用。
12 、 SQL 连表查询,去重查询,查询重复的数据?
两表查询:SELECT 字段 1,字段 2,字段 3,…… FROM 表名 1 INNER JOIN 表名 2
ON 关联条件;
去重查询:SELECT distinct ...;
查询重复的数据:select 列名 from 表名 group by 列名 having count(列名) > 1;
13 、 python 的单例模式?
-
单例模式是:确保类有且只有一个对象被创建为唯一对象提供访问点,令其可被全局访问控制共享资源的并行访问
-
具体实现方式可以通过模块导入、装饰器、控制 __new__方法 等等。
14 、什么是 PEP 8 ?
-
EP 8 代表 Python Enhancement Proposal,它可以定义为帮助我们提供有关如何编写 Python 代码的指南的文档。它基本上是一组规则,指定如何格式化
-
Python 代码获得最大的可读性。它由 Guido van Rossum、Barry Warsaw 和Nick Coghlan 于 2001 年编写
15 、 PO 模式的封装原则有哪一些?
公共方法表示页面提供的服务。比如把登录封装成 login 方法,搜索操作封装成 search 方法,注册操作封装成 register 方法。
-
尽量不要暴露页面的内部,比如页面的 HTML, 页面的上下结构
-
一般不做断言,做到页面逻辑和测试逻辑的分离。
-
方法返回 self 或者其他 PageObjects,也可以是元素属性等。
-
不需要封装整个页面行为,用到什么逻辑封装什么逻辑
-
同一操作如果出现不同结果,可以用不同的方法表示。比如登录成功有跳转,登录失败报错,登录未授权,
(2)编码题
1 、幂的递归,计算 x 的 n 次方,如:3 的 4 次方 为 3*3*3*3=81
# 递归的方式
def mi(x, n):
if n == 0:
return 1
else:
return x*mi(x, n-1)
print(mi(3, 4))
非递归的方式:
def mix(x,n):
result = 1
for count in range(n):
result *= x
return result
print(mi(3,4))
2 、统计列表(list )中每个元素出现的次数
# 统计列表(list)中每个元素出现的次数
lista = [1, 2, 3, 4, 12, 22, 15, 44, 3, 4, 4, 4, 7, 7, 44, 77, 100]
new_dict = {}
for item in lista:
if item not in new_dict.keys():
new_dict[item] = lista.count(item)
print(new_dict)
3 、 ['abc13','abv89'] 这种列表,打印最大长度的共同的前缀,列表元素个数不确定
def test_str(iterable):
return_str=''
for i in zip(*iterable):
if len(set(i))==1:
return_str +=i[0]
else:
break
print(return_str)
return return_str
4 、对 list 去重并找出列表 list 中的重复元素
from collections import Counter #引入 Counter
a = [1, 2, 3, 3, 4, 4]
b = dict(Counter(a))
print(b)
print ([key for key,value in b.items() if value > 1]) #只展示重复元素
print ({key:value for key,value in b.items() if value > 1}) #展现重复
元素和重复次数
5 、已知一个队列 [1, 3, 6, 9, 7, 3, 4, 6]
1. 按从小到大排序
2. 按从大大小排序
3. 去除重复数字
a = [1, 3, 6, 9, 7, 3, 4, 6]
# 1.sort 排序,正序
a.sort()
print(a)
# 2.sort 倒序
a.sort(reverse=True)
print(a)
# 3.去重
b = list(set(a))
print(b)
6 、任选语言完成双向冒泡排序算法程序([8,6,4,3,9,1,2,5,7] 升序)
def cocktail_sort(arr):
n = len(arr)
start = 0
end = n - 1
swapped = True
while swapped:
# 正向冒泡,找到最大元素放到后面
swapped = False
for i in range(start, end):
if arr[i] > arr[i + 1]:
arr[i], arr[i + 1] = arr[i + 1], arr[i]
swapped = True
# 如果没有元素进行交换,则排序完成
if not swapped:
break
# 在反向冒泡之前,重新标记 swapped 为 False
swapped = False
end -= 1
# 反向冒泡,找到最小元素放到前面
for i in range(end - 1, start - 1, -1):
if arr[i] > arr[i + 1]:
arr[i], arr[i + 1] = arr[i + 1], arr[i]
swapped = True
start += 1
return arr
# 测试排序算法
arr = [8, 6, 4, 3, 9, 1, 2, 5, 7]
sorted_arr = cocktail_sort(arr)
print(sorted_arr)
(3)自动化基础能力评估
1 、 python 列表和字典的区别,列表和元组的区别?
-
列表是有序的,字典是无序的。列表通过索引获取、字典通过 key 获取。
-
列表是可变的,可以修改、添加、删除其中的元素,但是元组是不可变的,不能修改、添加、删除其中的元素。
-
对于一个元素的元组,必须要在元素后加逗号,而列表不需要。
2 、 Python 用到的库
-
-
单元测试框架:unittest pytest
-
操作 mysql 数据库:pymysql
-
http 请求库:requests
-
web 自动化:selenium
-
处理日志:logging
-
json 数据提取和 json 文件读写:json,jsonpath
-
pyyaml:yaml 文件读写
-
3 、 unittest 和 pytest 区别?
-
-
pytest 是第三方库,基于 unittest 的扩展框架,比 unittest 更简洁,高效
-
pytest 有丰富的插件系统
-
pytest 的夹具使用更加灵活
-
pytest 可以很方便的过滤用例
-
4 、 python 当中如何操作数据库 ?
-
-
python 不同的数据库,都有对应的第三方库。比如 mysql 数据库有 pymysql库,oracle 数据库有 cx_Oracle
-
安装成功第三方库后,代码中将包导进来 ·接下来就是连接数据库,提供数据库的服务器地址、端口号、访问的用户名和密码、数据库名称,通过调用对应的方法去连接
-
连接成功之后,调用执行 sql 语句的方法去操作数据库
-
操作完成之后,释放数据库连接
-
5 、 jmeter 或 postman 实现多接口关联测试 ? 怎么做关联 ?
6 、接口自动化的断言怎么做
7 、如果需要用自动化测删除接口,断言怎么做
8 、做自动化的过程中如何处理验证码
-
-
让开发屏蔽验证码,邀请开发处理,在测试环境,预发和正式环境恢复
-
让开发设置一个万能验证码,使用复杂的其他人无法猜到的验证码
-
基于图像识别,破解验证码
-
9 、自动化测试用例如何编写
自动化测试本质是测试,是用自动化手段,替代部分手工测试。
-
自动化测试用例,源自功能测试用例,都应包含前置/后置,步骤,断言。
-
自动化用例设计原则,与功能用例一致。
-
自动化用例需要自行解决:环境依赖问题。比如手工测试时,遇到前置条件不满足,手工去准备前置条件再测试。
-
自动化用例断言要明确:将手工测试看到的期望效果,转成代码。
-
自动化用例需要考虑重复执行不受影响。
考虑好以上 5 点,使用工具或者代码的测试框架编写即可。
10 、 pytest 的前置实现有哪几种方式?
11 、 Appium 都有哪些启动方式
12 、 web ui 自动化中显式等待、隐式等待有什么区别
相同点:都是智能等待,在一定时间范围内不断查找元素,一旦找到立刻执行后续代码,没找到就会一直查找到超时为止
不同点:
-
显式等待:显示等待是单独针对某个元素,设置一个等待时间,设置一个查询间隔时间,在等待时间内会按照设置的间隔时间对该元素进行查找,超过设置的等待时间尚未出现则抛异常;显示等待必须在每个需要等待的元素前面进行声明
-
隐式等待:隐式等待是全局的是针对所有元素,设置一个等待时间,在设置的等待时间内,程序会不停检测页面元素是否全部加载完成,加载完成则继续向下,超过设置的等待时间尚未出现则抛异常;隐式等待只需要声明一次,声明之后对整个 drvier 的生命周期都有效不用重复声明;程序会一直等待整个页面加载完成
13、 有没有遇到元素定位不到情况?如何处理的?
-
-
页面加载元素过慢,添加等待时间
-
页面有 frame 框架页,需要先跳转入 frame 框架再定位
-
可能该元素是动态元素,定位方式要优化,可以使用部分元素定位或通过父节点或兄弟节点定位。
-
可能识别了元素,但是不能操作,比如元素不可用,不可写等。需要使用js 先把前置的操作完成,
-
元素定位的表达式写错了。
-
14 、请尽可能多的列出自动化的元素定位方式,以及你最喜欢的定位方式?
web 自动化的定位方式:
1、通过 id:find_element_by_id
2、通过 name 属性:find_element_by_name
3、通过 class 属性:find_element_by_name
4、通过标签名:find_element_by_tag_name
5、通过文本定位链接标签:find_element_by_link_text
6、通过文本部分匹配,定位链接标签:find_element_by_partial_link_text
7、通过 xpath 定位:find_element_by_xpath
8、css 选择器定位:find_element_by_css_selector
最常用的:id,xpath 和 css 这三种
15 、如果同一个浏览器打开两个窗口,要用 selenium 里面哪个指令进行切换?
1、窗口切换 2、iframe 切换 3、alert 切换
16 、 App 自动化有做过吗?知道用到哪些技术框架吗?
-
-
做过,app 自动化主要使用的开源框架 appium,结合测试框架 pytest,还有 PO设计思想,共同搭建了 app 自动化测试框架。
-
17 、 ui 自动化出现的异常,以及出现这些异常后你是如何处理的?
-
-
元素定位失败异常,处理方式为检查元素定位表达式,添加等待;
-
定位超时异常,检查定位方式,检查是否有 iframe ;
-
元素无法交互,检查是否定位到正确元素。
-
18 、什么是 PO 模式,什么是 page factory ?
-
PO 模式是 page object model 的缩写,顾名思义, 是一种设计模式,把每个页面当成一个页面对象,页面层写定位元素方法和页面操作方法,实现脚本的page 和真实的网站页面 Map 起来,一对应起来PO 模式业务代码和测试代码被分开,降低耦合性维护成本低,减少代码冗余
19 、简述 selenium 的原理
selenium 涉及到三个组件的通讯,分别是
-
-
浏览器
-
webdriver
-
client
-
client 负责通过对应的编程语言函数发送请求给 webdriver
client 其实并不知道浏览器是怎么工作的,但是 driver 知道,在 selenium 启动以后,driver 其实充当了服务器的角色,跟 client 和浏览器通信,client根据 webdriver 协议发送请求给 driver,driver 解析请求,并在浏览器上执行相应的操作,并把执行结果返回给 client。这就是 selenium 工作的大致原理。
20 、 UI 自动化测试用例在运行过程中经常会出现不稳定的情况,也就是说这次可以通过,下次就没有办法通过了,如何去提升用例的稳定性?
-
1. 界面上无法预测的弹框。页面上经常会根据用户行为推送或者弹出动态的信息,比如版本更新,消息通知,推荐产品等等,当这些弹框出现以后,原来的页面元素会被遮挡,无法被定位,此时可能会造成自动化测试脚本运行错误。
-
2. 页面元素的动态变化;主要有两方面的变化,第一方面,前端需求经常发生变化导致前端代码频繁修改,当前端页面变化以后可能会造成之前的元素无法被定位;第二方面,页面可能会根据用户的状态和等级展示不同的页面,或者是这一次访问的数据和下一次会不同。
-
3. 随机的页面延迟造成控件识别失败;受限于网络环境和设备状态,自动化代码每次运行时可能会产生随机的超时处理。
-
4. 测试数据变更。ui 测试每个用例的测试步骤会有很大的区别,他们不能共享同一套代码逻辑,当测试数据变更时,如果不能及时更新自动化代码,会造成脚本执行出错等问题。
(4)自动化项目实战能力评估
1 、介绍一下你的自动化测试框架?
我的框架主要根据分层思想设计了几个独立模块:
-
模块一:主要存放通用业务代码,比如接口访问,数据库操作,excel 操作,等
-
模块二:主要负责用例收集和用例执行,生成测试报告。
-
模块三:主要负责存放测试用例数据。通常是使用 excel, yaml, 等通用数据格式。
-
模块四:主要存放测试用例方法和测试逻辑相关代码。这里会调用模块的通用方法。
2 、讲一下在工作中怎么做的自动化测试?
-
-
a. 根据自动化测试特性整理需求
-
b. 根据优先级,和公司人员状况制定自动化测试计划
-
c. 制定自动化测试执行方案
-
d. 自动化测试用例设计或从功能测试用例中挑选适合的用例
-
e. 自动化脚本的开发
-
f. 自动化测试执行,生成报告
-
3 、自动化测试框架至少包含哪些核心模块。
-
-
基础方法
-
数据驱动
-
PO 分层
-
接口分层
-
接口数据管理
-
异常处理 - 工具包
-
配置
-
日志收集
-
测试报告
-
4 、框架中的接口参数传递怎么做的?是否有优化,第三库有没有用到,方法是什么?
-
框架当中接口参数传递主要涉及 2 部分:一是数据生成或者提取,二是替换。在框架当中,数据从响应结果提取用的 jsonpath,提取表达式直接写在 excel 当中,提取之后存储到变量类 Data 当中,作为它的类属性。
-
替换时,则直接访问 Data 类的类属性,将其值拿到并替换。在 excel 中要替换的标志为#value#。因为会存在有多个要替换的值,所以用正则表达式来查找到所有要替换的标识,然后全部替换。
-
用到第三方库的话,一个是 jsonpath,一个是 re
5 、拿到一个项目,怎么衡量这个项目做接口自动化还是 UI 自动化?
1、不管什么项目都可以做接口自动化
2、偏公司内部人员使用的管理平台无需做 UI 自动化,对外用户的可以考虑做
UI 自动化
6 、框架的数据库验证在你 excel 中 check_sql 放的是什么,你如何做比对?
-
check_sql 中存放的是一个列表,列表的成员是字典,字典有 3 个 key,一个是sql 语句,第二个是期望结果,第三个是 sql 的查询方式(查询总条数/查询值)在收到响应结果以后,会遍历 check_sql 中的列表,将每一个字典取出来,执行sql 语句查询结果 ,并与期望结果做比较。
7 、自动化测试中,测试用例的执行是怎么让他按照你写的用例一条一条执行的?
在我的项目接口自动化中,我用 pytest 框架。
一个接口的用例,我的用例数据是写在 excel 当中,在编写时就是按照顺序写的,从 excel 读取出来使用数据驱动 方式就是按照 excel 中的顺序;
多个接口的用例,因为我是一个接口一个 py 测试文件,所以我在 py 测试文件命名中用 00-99 数字按顺序编写的。
8、Login 这些用例数据是在哪里取的?excel 吗?用到什么方法?什么第三方库?
具体公司的业务:业务怎么开展 项目的介绍?( 或者简单介绍最熟悉的项目介绍:)
主要考察 2 个方面:一是表达能力和业务的熟悉度。二是做的项目复杂度如何,是否能胜任复杂项目的测试工作。
一般是根据自己的业务来回答。最好是能讲出有挑战性有难度或者复杂的业务场景。面试官不一定听得懂,但是他觉得复杂挺难的就可以。