一、接口测试
1、接口测试用例的编写要点有哪些?(或需要考虑哪些方面?或测试点?)
1) 考虑输入参数和输出参数的合法性,参数必填,默认值,参数长度和格式校验,边界等,图片长传考虑图片大小和格式。查询考虑数据排序,分页考虑分页显示等。
2) 业务逻辑和功能实现
3) 数据库校验
4) 性能测试(接口tps、响应时间等)
5) 兼容性,新老版本数据的兼容
6) 安全性,敏感信息加密,恶意攻击的防范,权限控制等
7) 幂等性(接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。举个最简单的例子,那就是支付,用户购买商品后支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额返发现多扣钱了,流水记录也变成了两条,这就没有保证接口的幂等性)
2、你们项目中有哪些接口,举几个例子
结合项目去说:一般不低于3-5个接口案例(不能包括登录和注册接口),记住一条原则就是:凡是有数据交互的地方就一定有接口。比如:增,删,改,查的功能接口。
3、在你们项目中接口测试用例你是怎么设计的?
正例:正确输入必填的参数,接口正常返回。反例:
鉴权反例:必填,错误,过期...
参数反例:必填,类型异常,长度异常,错误码异常(根据业务定)
其他场景反例:分页,黑名单,接口调用次数限制,接口调用时间的限制。接口服务费。兼容性用例:多版本的兼容,多端的兼容。
4、你是怎么测试接口的?(问法二:说一下你们接口测试流程?)
1、获取接口文档,熟悉单接口以及链路接口业务,包括接口地址,请求方式,鉴权方式,入参,出参,错误码等。
2、编写接口测试用例并评审。接口功能用例设计:
-
正例:单接口返回成功场景!链路接口(业务流接口)逻辑实现!
-
反例:
鉴权反例:鉴权码为空,错误的鉴权码,鉴权码已过期...参数反例:参数为空,参数类型异常,参数长度异常,
错误码反例:(根据业务而定)其他反例场景:
如接口黑名单,接口调用次数限制等,分页场景:(0,第一页1,中间页5,最后一页10,100,其他业务异常)
- 兼容性用例:比如一个接口需要兼容多个版本的前端调用。
3、使用接口测试工具Postman/Jmeter执行接口测试通常执行过程中需要考虑以下几个方面:
-
是否满足前提条件:有些接口需要满足前提,才可成功获取数据。常见的,需要登录Token
-
参数之间是否存在关联:有些参数彼此之间存在相互制约的关系
-
参数是否加密,比如说我登陆的接口,用户名和密码是不是加密,如果不加密的话,别人拦截到你的请求,就能获取到你的信息了,加密规则是否容易破解。
-
参数是否是动态参数。
-
接口是否需要签名验证等。
4、实现持续集成并输出接口测试报告发送电子邮件,企微(钉钉群)等,有bug报bug。
5、每天晚上12点都会运行一次,从而监控是否有因开发代码变更或者新功能添加而导致的遗漏接口 bug。
5、你平常做接口测试的过程中发现过哪些bug?多吗?(问法二:接口测试有没有测试出什么问题?)
接口测试中发现的bug,大多都是接口没按约定返回结果,参数为空,参数长度或类型校验、没有鉴权、参数边界值、代码逻辑、数据错误、或没有返回合理的错误提示等方面的问题。
(1) 一般在前后端联调阶段执行接口测试发现的 bug 会很多(之前开发写代码的时候,所有的ajax数据都不是后端返回的真实数据,而是我们自己通过接口mock模拟的假数据,当前端的代码编写完毕,后端的接口也已经写好之后,我们就需要把mock数据去掉,尝试使用后端提供的数据,进行前后端联调,这个过程我们就把它称之为前后端的接口联调。)
前后端联调接口Bug案例:
比如1:查询列表页接口,前端想分页,Mock就写了三条测试数据,调用后端接口时分页有问题?(模糊查询和分页一起会出错)
比如2:前端访问的mock数据时没有考虑鉴权。访问真实的后端接口时没有权限。
(2) 然后在接口冒烟测试、回归测试阶段执行接口测试的时候,bug就不多。常规接口Bug案例:
比如1:新增促销活动接口,满减金额为空也能保存成功,原因是后端代码没有对满减金额参数做空值判断。
比如2:活动列表接口,查询出来的活动数据少了第一条,原因是SQL中limit条件传入起始序号是1而不是0
比如3:更新活动接口,接口提示更新成功,但是数据库中的update_time字段没有更新成最新时间,原因是开发忘记更新这个字段
比如4:比如说下订单接口,商品的价格参数是300元,那我在提交订单时候,我把这个商品的价格改成
3元,后端并没有做验证,更狠点,我把钱改成-3,我的余额还增加了?
接口鉴权Bug案例:
比如1:比如说修改商品信息接口,只有卖家权限才能修改,我传一个普通用户也可以修改成功,我传一个其他卖家用户也能修改成功。
比如2:之前有个退保接口,下游系统加了身份证证件有效期校验,导致被测系统接口调用跑不通,通过自动化发现的问题,并及时去评估到对被测系统的影响。
6、一个接口请求不通该如何排查?
请看提示:根据提示去找错,英文的提示翻译一下。可能的原因是:
-
检查请求四要素:请求方式,请求路径,请求头,请求参数是否写错。
-
客户端和服务端网络不通
-
服务端项目没有部署起来,接口无法访问。
-
请求被服务器的防火墙拦截了
-
服务端程序内部发生了错误
-
没有访问权限(比如缺乏token、cookie之类)
-
客户端设置了网络代理(比如打开了Fiddler/Charles等抓包工具)
-
如果是浏览器访问,是不是绑定了错误的hosts
7、你在接口测试中是怎么校验接口返回结果是否正确?
1) 验证接口响应状态码是否是200。
2) 当接口响应正文比较短,比较固定时验证响应的完整内容是否等于预期。
3) 当响应内容较长较多时,验证响应报文是否包含关键信息。
4) 当响应正文为XML格式或JSON格式时,可以通过XPATH或JSONPATH,正则表达式,获取其中的某个节点,验证响应报文关键字段是否存在。
5) 查询数据库或调用其余接口查询。当要验证的信息在当前测试接口的响应内容中不存在时,可以调用其他接口来验证。例如,一个增加用户信息的接口,要验证信息确实增加成功了,可以再调用查询用户信息接口来确认用户信息添加成功。当然,在获取数据库查询权限的情况下,也可以直接查询数据库来验证。
8、接口测试中的加密或签名的接口如何处理?
加密接口:
-
首先要先了解接口使用的加密方式(如:base64、md5、sha系列加密、rsa加密等)
-
检查接口测试工具是否支持这种加密方式,如果支持的话,直接使用对应功能就行了(比如Jmeter支持md5);如果加密方式是公司内部特有的算法,可以在接口测试工具中调用公司的加密算法代码(如jar包)来实现加密。
签名接口:
了解签名规则之后,在接口请求之前先对参数按照签名规则加密之后再发送请求。签名sign一般通过请求头传值。
9、没有接口文档,如果做接口测试?
方式一:可以使用Fiddler、Charles等抓包工具抓取接口数据之后整理成接口文档,接口中不清楚的字段,找时间集中找开发解答。然后再进行接口测试;
方式二:可以通过Jmeter的代理录制功能,先把接口请求录制下来,然后再逐一进行接口测试。
10、依赖于第三方数据的接口如何进行测试?
可以通过Postman搭建mock服务,但是Postman的mock服务有访问次数限制,每天只能访问1000次,也可以通过Flask,Servlet等技术搭建接口Mock服务器。
11、依赖于登录状态的接口如何测试?
答:依赖登录状态的接口的本质上是在每次发送请求时需要带上session或者cookie才能发送成功,
postman会自动关联cookie,jmeter通过添加http cookie管理器来处理cookie关联。
12、为什么要做接口测试
A、 在目前前后端分离开发的模式下,项目在开发过程中,客户端和服务端开发的进度不一致,比如服务端先开发完了,这个时候可以先对服务端进行接口测试,确保服务端逻辑和返回数据是正确的,然后再测试客户端。
B、在测试某些业务时,不能仅仅通过前端来测试,比如用户注册,前端限制了用户名不能为空,但是可以通过工具绕过前端直接调用服务端接口,如果服务端没有做相关的逻辑判断,就会造成数据错误。包括接口数据传输过程中是否对关键信息加密等。所以必须针对服务端接口做测试。
C、接口测试属于集成测试、测试介入越早、就越能在项目早期发现问题,其修复问题的
成本越低,在开发提测后,可以先通过工具把服务端的接口测试跑一遍,确保接口测试用例都是通过的,快速判断服务端接口是否符合预期。然后再通过UI界面进行测试。否则接口有bug,前端页面必定有bug。并且接口测试非常快速、接口测试用例执行的时间是毫秒级的。
13**、cookie ,session ,token有什么相同点和不同点。**
相同点:三者都是用于鉴权并且都是由服务器产生的。不同点:
-
cookie保存在客户端的浏览器上,cookie不安全,其他人可以通过分析存放在本地的cookie并进行 cookie欺骗。
-
session比cookie安全,它会在一定时间内保存在服务器的内存,但当访问增多时,比较占用服务器的性能。单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie,而 session则存储与服务端,浏览器对其没有限制。
-
token就是令牌,是一个字符串,主要是用于做客户端身份认证,通常登录成功后,服务端会返回 token,客户端需要把token值保存下来,后续请求其他接口时,需要在请求中携带这个token值,只有服务端对token校验通过后,才允许访问。
14**、get 和post的区别**
区别在于:
1) GET一般用于查询数据;而POST一般用于添加、删除或修改数据。
2) 传参方式不同:get通过地址栏传输,post通过表单报文传输,所以post请求比get请求的安全性相对较好。get请求可以直接通过浏览器访问,支持刷新和后退。post请求不能直接使用浏览器访问,刷新后数据要重新发送。
3) 传参长度不同:get参数有长度限制(受限于url长度),而post无限制
4) GET产生一个TCP数据包(对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200返回数据),POST产生两个TCP数据包(对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok返回数据)、
15**、http 和https的区别**
-
http是超文本传输协议,信息是明文传输,Https协议是由HTTP协议+SSL协议构建的加密传输协议,比http协议安全;
-
http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443;
-
HTTP 无需证书,而 HTTPS 需要认证证书
16**、说一下你知道的HTTP状态码,以及它们代表什么意思**
| 1xx | 信息提示(表示临时的响应) |
| 200 | 正常(表明服务器成功地接受了客户端请求) |
| 307 | 重定向(服务器要求客户端重新请求一个新的URL) |
| 401 | 未授权,需要身份认证 |
| 403 | 服务端禁止访问 |
| 404 | 请求的资源未找到(比如url写错了,页面被删除等) |
| 405 | 请求方法不允许(比如服务端的POST类型,客户端使用GET方式请求) |
| 5xx | 服务端内部错误(服务器由于遇到错误而不能完成该请求) |
17、常见的请求头以及它们的作用是什么?
Accept: (客户端可以接收的数据格式)
X- Requested-With:(ajax请求,异步请求) User-Agent: (客户端的用户)
Content-Type: application/x-www-form-urlencoded; charset=UTF-8(内容的格式) Cookie: csrf_token=2c76c391ab3922fe; (cookie信息)
18**、工作中常用的jmeter自带函数有哪些**
-
random():随机数函数
-
randomString():随机字符串函数
-
time():获取当前时间戳函数
-
md5():加密函数
-
setpropty():跨线程组设置属性值函数
19**、使用jmeter如何做接口之间的数据关联**
接口数据关联指的是上一个接口的某个返回值,作为下一个接口的请求参数。
如果上一个接口返回的是json格式的,可以用json提取器把数据保存到一个变量里,如果是其他格式的,可以使用正则提取器保存数据。
那么在下一个接口中,直接使用${变量名}就能使用这个数据。
20**、Jmeter中常用的断言方式**
1、Json断言,可以通过Json路径表达式判断接口返回的Json字符串中某些字段是否符合预期
2、响应断言,可以判断响应头/响应体中是否包含预期的字符串。区别在于:Json断言只能判断Json格式;响应断言只要是文本格式都可以判断,应用范围更广
3、beanshell断言,可以判断当一个接口经过CSV数据驱动之后,对返回的正常结果和异常结果同时进行判断。
20、postman 你在工作中使用流程是什么样的?
-
获取接口文档,熟悉单接口以及链路接口业务,包括接口地址,请求方式,鉴权方式,入参,出参,错误码等。
-
编写好用例
-
在 postman 先建好 url 环境变量
-
根据接口用例所属的模块新建集合管理
-
在集合中不同模块下录入测试用例
-
录入测试用例的时候根据预期结果在 tests 页签中增加断言
-
导出通过 Newman+Jenkins 去运行
21**、Postman 中常见的POST提交数据方式有哪些?**
主要有以下四种方式:
application/x-www-form-urlencoded表单方式提交数据。 multipart/form-data 报文包含有文件上传 application/json(text/plain,text/xml) 报文类型为json字符串类型。 binary 报文类型为二进制文件上传。
22**、接口测试中关联是什么含义?如何用** postman 设置关联?
关联就是把上一个接口返回值的部分截取出来,作为下一个接口的参数,能让接口串联运行在 postman 中设置关联的步骤如下:
-
先通过正则表达式提取的方式或 json 取值的方式把下一个接口需要的信息从上一个接口截取出来
-
使用设置全局变量的代码把取出来的值保存到全局变量
-
在下一个接口中,使用{{全局变量}}代替要替换的静态值
23**、工作中用fiddler抓包工具来做什么**
a) 当测试出bug时,可以通过fiddler抓包,分析bug是客户端还是服务端的问题
b) 当做接口测试时,通过抓包获取接口的入参和返回值,包括接口之间的数据关联
c) 当对客户端做弱网测试,可以修改fiddler的网络模拟参数,模拟出不同的网络速度
c) 当需要对客户端测试一下特殊场景(线上调试),可以使用fiddler设置响应断点,修改服务端响应的数据,测试客户端对应的逻辑处理。
24**、如何分析一个bug是前端还是后端的?**
平常提bug的时候,当不清楚是前端开发还是后端开发的bug时。我们可以通过抓包分析。
抓包之后,重点分析返回的报文,返回报文和页面的数据进行对比,如果返回的报文数据以及报文的条数和页面不符并且返回的报文格式和接口文档一致,那么可以确定是前端页面显示的问题。
其次,如果返回的报文格式和接口文档不一致,再分析请求报文是否有问题。参考物可以是前端页面元素也可以是接口文档,如果有问题就是前端开发的数据不对。如果没有问题是后端的问题。
还可以结合日志去分析。如果日志有报错肯定是后端问题。
25、长链接和短链接的区别?
前提:
-
HTTP/1.0默认使用短连接,HTTP/1.1开始默认使用长连接;
-
HTTP协议的长连接和短连接,实质就是TCP协议的长连接和短连接;
-
TCP协议建立连接需要3次握手,断开连接需要4次握手,这个过程会消耗网络资源和时间;
定义:
-
长连接:在一个TCP连接上可以发送多个数据包,但是如果没有数据包发送时,也要双方发检测包以维持这个长连接;三次握手后连接,不断开连接,保持客户端和服务端通信,直到服务器超时自动断开连接,或者客户端主动断开连接。
-
短连接:当双方需要数据交互的时候,就建立一个TCP连接,本次交互完之后就断开这个连接;三次握手后建立连接,发送数据包并得到服务器返回的结果后,通过客户端和服务器的四次握手后断开连接。
优缺点:
-
长连接可以省去较多建立连接和断开连接的操作,所以比较节省资源和时间,但是长连接如果一直存在的话,需要很多探测包的发送来维持这个连接,这对服务器将是很大的负担;
-
短连接不需要服务器承担太大负担,只要存在的连接就是有用的连接,但如果客户端请求频繁,就会在TCP的建立连接和断开连接上浪费较大的资源和时间。
使用场景:
-
短连接:适用于网页浏览等数据刷新频度较低的场景。一般而言像及京东,淘宝这些大型网站,随时都会有成千上万的用户请求,一般使用短连接,用户量太大,服务器扛不住那么多长连接;
-
长连接:适用于客户端和服务端通信频繁的场景,例如:聊天室,实时游戏等场景。即时通讯(QQ)般使用的都是长连接,但并不是永久连接(比如20分钟,半个小时),因为即时通讯是频繁的发送请 求,使用长连接只需要建立一次连接,同时再根据业务设置保持时间,超过这个时间就会断开连接,一定程度上保证了服务器的压力不会过大。
二、web自动化测****试
1**、你觉得WEB自动化测试的价值在哪里?你们公司为什么要做**WEB
自动化测试?
Web自动化测试就是模拟手工测试人员来做功能测试。用机器的自动执行代替人的操作。主要用于产品的核心功能冒烟测试、回归测试。从系统最核心的功能开始做,再根据情况慢慢展开。
引用自动化测试之后,能代替大量繁琐的回归测试工作,把业务测试人员解放出来,既而让业务测试人员把精力集中在复杂的业务功能模块上,自动化测试一般是对稳定下来的功能进行自动化,保证不会因为产品的更新导致之前稳定下来的功能出现BUG。
类似于数据库中的:索引。
2、在上一家公司做自动化你们用的什么UI自动化框架以及它们的优缺点。如果让你设计一个自动化测试框架?你会考虑哪些因素?
可以说出以下自己擅长的一种: 1.RobotFramework+Selenium2Library优点:
(1) 图形化界面,表格化用例,降低了用例的编写难度。
(2) 通过关键字驱动的方法,利用已有的关键字可以创建新的需要的关键字,重用行好,简化了自动化测试过程。
(2) 它由通用工具和测试库组成,可以自定义测试库,有比较高的扩展性,可以在单独的项目中使用。
(3) 易于集成(比如jenkins),功能全面,支持web,接口等多种自动化测试。缺点:
(1) 自定义HTML报告比较麻烦
(2) 界面反应慢,经常卡死。
(3) 很多语法太死板(比如if和for结构)
2.Python+Selenium+PO/关键字驱动
+Unittest/Pytest+DDT+HTMLTestrRunner/Allure+Jenkins自主搭建测试框架:
优点:
(1) 自主搭建测试框架可以帮助我们编写更加简单而且好维护的自动化用例;让我们把主要精力放在测试用例的设计上;
(2) 一套好的测试框架,可以让团队其他同事不需要有很强的代码基础,就能编写自动化测试用例,维护测试用例,执行自动化用例,利于团队协作,起到提质保效的作用。
(3) 自主搭建测试框架更加灵活,可以根据项目组的需求随时调整和封装一些必须用的功能。缺点:
(1) 需要把---些额外的东西抽象出来,封装起来;例如:selenium二次封装,日志封装,PO和关键字封装等。
(2) 需要有较强的框架设计和封装能力以及全局的把控能力。
考虑的因素包括:框架的落地实施,计划,方案,用例设计,基础封装,设计模式(PO或关键字),数据驱动(数据和代码分离,三层架构),日志,错误截图,报告定制以及并发执行测试用例等。
3**、你们Web自动化怎么做的?**
-
项目组做自动化的可行性分析,包括自动化率能够实施到什么程度?主要考虑:
-
项目时间是否比较长,一般需要一年以上的项目或者长期的产品
-
需求会不会频繁变更
-
自动化脚本是否能够持续反复的使用。
-
项目组调研自动化工具的选择和demo演示,主要演示selenium和robotframework两种。如果有以往成熟的框架演示更好。
-
逐渐在项目中实施自动化,发现问题并改善。主要包括:
-
编写自动化测试计划
-
提取或编写自动化测试用例
-
由leader编写自动化测试框架脚本
-
编写,调试并维护自动化测试脚本(代码规范以及根据分工编写响应的自动化测试脚本,自测没有问题之后提交到Git服务器)
-
Jenkins持续集成无人值守测试
-
后期维护脚本(主要是因为版本更新添加用例)
4) 把自动化流程化,规范化,文档化,自动化框架出使用文档以及规范文档。
5) 生成定制的报告。继续完善框架。并推广到其他的项目
4、你们WEB自动化测试框架是如何搭建的?
我们web自动化测试使用的技术栈是:
Python+Selenium+Pytest+Parametrices+Excel+Allure+Jenkins
框架使用的是基于Excel的关键字驱动,将维护框架和使用框架分离开来
进行自动化测试时,将元素定位表达式及要执行在操作写入excel即可,显著降低了自动化测试的落地难度
主要功能:
内置常用关键字,实现关键字驱动测试,有升级为BDD潜力
自动的判断浏览器类型版本,并自动下载、启动合适的浏览器驱动
内置自动等待,避免正常情况下UI测试的出错情况
通过执行js的方式,实现特殊场景交互,如强制点击、强制输入、拖拽上传等
以字符串为核心断言策略,支持等于、包含、正则匹配、内容组合等多种断言方式
自动生成allure的测试报告,报告内置与excel内容一一对于匹配
支持并行测试和分布式测试
文件架构:
conf # 项目配置
data # 数据驱动测试文件 action.py # 关键字驱动封装 case.py # 用例管理和封装 data.py # 数据驱动封装 pages # PO 封装
report # allure测试报告
tests # 存放 excel文件作为测试用例框架用法:
-
创建execl文件,每个sheet页看作一个TestSuite
-
在sheet页中申明测试用例,填写测试用例的名称
-
在单元格中填写步骤名、关键字、关键字参数,完成测试步骤
5**、web 自动化有多少case?覆盖率是多少?全部执行完需要多久?**
1)WEB自动化用例个数根据功能测试用例数而定。自动化用例覆盖率一般为功能测试用例的10%-30%左右
- 所有WEB自动化用例执行完成大概30-60分钟左右。
6**、web自动化测试用例如何设计?**
WEB自动化测试用例是从手工测试用例中提取出来的,主要是冒烟用例和回归测试的用例。自动化测试用例的选取更加需要注重用例的严谨性,选择用例的时候遵循以下原则:
-
优先选取覆盖产品核心业务流程的用例;
-
选取的用例是需要重复执行或繁琐的验证功能,比如字段验证、提示信息验证;
-
优先选择正向的测试用例,反向用例一般情况复杂、数量多;
-
不要选择流程太复杂的用例(主流程除外);
7、如何保证(提升)自动化测试的稳定性?
自动化测试稳定性主要表现在两个方面:一个是元素定位的稳定性,另一个是用例之间依赖稳定性:元素定位稳定性问题:
(1)尽量用相对路径的xpath表达式;
(2)定位元素使用智能(隐式)等待+显示等待的方式避免元素未加载完成问题; (3)脚本执行失败后加入重试机制,提升用例的稳定性;
(4)用例执行结束后对测试场景进行还原,避免影响其他用例的执行; (5)尽量保证单独的测试环境,避免其他的测试同步进行;
用例之间依赖稳定性问题:
(1) 用例与用例之间尽量避免依赖,用例尽量可以独立执行;让每条用例都从一个共同的页面开始执行,比如首页,这就需要在测试框架中采用后置处理的方式使每条用例执行完成后都回到首页。
8、什么是PO模式?什么是关键字驱动模式?为什么要使用他们?
POM模式,全称为Page Object Model ,简称PO,是页面对象模式。意思是,把一个页面,当做一个对象,页面的元素就是对象的属性,页面的操作就是对象的行为(方法),PO模式一般使用三层架构,分别为:基础封装层BasePage,PO页面对象层,TestCase测试用例层。
使用PO模式可以使我们的测试用例更简单,更清晰,很多时候我们可以在页面对象中封装很多业务操作方法,测试脚本只需要调用相关方法就可以。
另一个就是如果有页面元素发生改变,我们只需要去修改这个页面对象的元素定位和相关方法就可以了,不需要修改其它脚本。增加代码的可维护性。
关键字驱动是从面向对象的思路出发,同样的业务逻辑会编写成一个函数作为关键字来被不同的测试脚本所调用。当所有的业务逻辑测试都可以被写好的函数所组合完成时,就是关键字驱动框架。这个时候测试用例的开发就变成了测试数据和关键字的组合,并把这种组合工作简化为所有人都很熟悉的表格填写任务,从而最终达到一个由数据和关键字驱动整个测试的效果。
9、说说你对数据驱动的理解,在自动化测试过程中,你如何处理测试数据?
数据驱动是从某个数据文件(例如Excel文件、Csv文件、YAML文件等)中读取输入、输出的测试数据,然后通过数据驱动方法(ddt,parameterize等)传入自动化测试脚本中。在整个过程中,自动化测试脚本实现数据的读取、测试状态的改变、结果的判断等,从而实现数据和代码分离,这种方式叫数据驱 动。
10**、自动化测试发现BUG多吗?**
不多,因为WEB自动化的用例就是之前项目组已经测试过的基本功能,然后再进行自动化脚本的编写和执行,它主要是保证已经测试通过的功能在新版本更新后不会因为新增的功能而导致原来的基本功能产生错误。
11**、举例说明一下你在自动化测试过程中主要用到了哪些**Python
库?碰到过哪些异常?
web自动化测试:
webdriver,WebDriverWait,By,os,xlrd,xlwt,unittest/pytest,time,logging, HTMLTestRunner等
接口自动化测试: requests,time,logging,json,csv,jsonpath,pyyaml,re,unittest/pytest,allure常见的异常有以下:
NoSuchElementException: 没有如此元素异常 NoSuchAttributeException : 没有如此属性异常 NoSuchFrameException : 没有如此frame异常 ElementNotSelectableException :元素不能选择异常 ElementNotVisibleException :元素不可见异常 Element not visible at this point :在当前点元素不可见 TimeoutException : 超时异常
12、自动化测试过程中,你遇到了哪些问题,是如何解决的?
-
频繁地变更页面,经常要修改页面对象类里面的代码
-
自动化测试偶尔出现过误报
-
自动化测试结果出现覆盖的情况:Jenkins根据时间建立文件夹
-
自动化测试代码维护比较麻烦
-
自动化测试进行数据库校验,对数据库表和结构不是很清晰的话不是很方便。
13、自动化测试产生误报怎么办?
误报就是指自动化测试发现了 bug,实际去通过手工测试去确认又不存在该 bug;
误报原因可能是:
(1)元素识别不稳定--尽量提高脚本的稳定性; (2)开发更新了页面--测试没有及时维护;
14. 数据库你们是在什么时候去校验的,哪些场景使用到了?
数据库主要用于断言核心关键点的时候用的。比如走完一个流程之后校验这种流程的最终状态。或者是增加和修改数据的时候。
比如:核保成功,出单承保成功之后有一张静态表中的有一个关键字段accept_insurance状态为6,出单完就需要进行行验证是否成功。
比如:电商从登陆到搜索商品到加入购物车到支付到下单完成后,需要验证order订单表中增加了一条记录,并且这个记录中order_status为0,表示待发货状态。
15**、selenium的原理。**
-
启动浏览器的驱动
-
通过HTTP请求浏览器驱动启动的接口webdriver
16、元素定位方法有哪些?如果一个元素无法定位,你一般会考虑哪些方面的原因?
定位方法:
定位方法:id,name,xpath,css,link_text,partial_link_text,tag_name,class_name定位不到的原因可能是:
-
定位器或者是定位字符串选择错误
-
页面加载元素过慢,加等待时间
-
页面有frame/iframe框架页,需要先跳转入frame框架再定位
-
元素在新打开的窗口window中
-
可能该元素是动态元素,定位方式要优化,可以使用部分元素定位或通过父节点或兄弟节点定位。
-
可能识别了元素,但是不能操作,比如元素不可用,不可写等。需要使用js先做处理,
-
元素可能不在当前页面
17**、Webdriver 中关闭浏览器的quit 和close有什么区别**
简单来说,这两个都可以实现退出浏览器session功能,
close是关闭你当前聚焦的tab页面,而quit是关闭全部浏览器tab页面,并退出浏览器session。 quit一般用在结束测试之前的操作,close用在执行单个用例过程中关闭某一个页面的操作
18、web自动化中有哪三类等待?他们有什么特点?
-
线程等待(强制等待)如time.sleep(3):线程强制休眠3秒钟,3秒过后,再执行后续的代码。建议少用。
-
imlicitlyWait(隐式等待)这种是全局设置的等待,如设置超时时间为10秒,使用了implicitlyWait
后,如果第一次没有找到元素,会在10秒之内不断循环去找元素,如果超过10秒还没有找到,则抛出异常,特点是必须等待整个页面加载完成。
- WebDriverWait(显式等待)也称为智能等待,通常是我们自定义的一个函数代码,这段代码用来针对指定元素定位指定等待时间,在指定时间范围内进行元素查找,找到元素则直接返回,如果在超时还没有找到元素,则抛出异常,显示等待是 selenium 当中比较灵活的一种等待方式,他的实现原理其实是通过 while 循环不停的尝试需要进行的操作。
19、验证码的几种处理方式
-
在产品没有上线前,需要找开发将验证码先注释掉,或者让开发给web验证码留一个万用验证码,只要输入给定的验证码,就可以强制登录
-
可以通过Cookie跳过登录验证码。
3) 滑块验证码可以直接使用人工智能+代码的方式处理。
- 使用第三方的验证码识别技术(比如百度智能,超级鹰等)
20**、在selenium中如何处理多窗口?**
这个多窗口之间跳转处理,我们在项目中也经常遇到。就是,当你点击一个链接,这个链接会在一个新的tab打开,然后你接下来要在新tab打开的页面定位元素并处理。
步骤如下
-
我们在点击链接前使用driver.current_window_handle获得当前窗口句柄。
-
再点击链接。点击后通过driver.window_handles获得所有窗口的句柄,
-
然后再循环找到新窗口的句柄,然后再通过driver.switch_to.window()方法跳转到新的窗口。
-
window太多则可以按照title、url等其他信息进行判断切换
21**、你是如何处理iframe里面元素定位的?**
有时候我们写的元素定位表达式没有问题,但是脚本还是提示no such element,那么我们就需要考虑这个元素是否在frame/iframe中。通过f12查看元素HTML中是否有frame/iframe标签,如果有 frame/iframe,需要先将driver切换到frame/iframe中,可以通过frame的name和id和索引三种方法来定位frame。
步骤如下:
先用driver.switch_to.frame()跳转进去frame,然后再操作页面元素,
操作完后使用driver.swith_to.default_content()跳转出来
22、在执行脚本过程,如何实现当前元素高亮显示?
这个其实就是利用javaScript去修改当前元素的边框样式来到达高亮显示的效果。
23、数据库你们是在什么时候去校验的,哪些场景使用到了?
数据库主要用于断言核心关键点的时候用的。比如走完一个流程之后校验这种流程的最终状态。或者是增加和修改数据的时候。
比如:核保成功,出单承保成功之后有一张静态表中的一个关键字段accept_insurance状态为6,出单完就需要进行验证是否成功。
比如:电商从登陆到搜索商品到加入购物车到支付到下单完成后,需要验证order订单表中增加了一条记录,并且这个记录中order_status为0,表示待发货状态。
24**、在Selenium中如何实现用例执行失败才截图**?
在Selenium中提供了一个get_screenshot_as_file()的方法来截图的,一般结合try/except捕获异常时使用,进行错误截图。
然后把截图作为附件写入到Allure报告中。
25、如何实现文件上传?
定位元素后,直接使用send_keys()方法设置就行,参数为需要上传的文件的路径。
26、你写的测试脚本能在不同浏览器上运行吗
当然可以,我写的用例可以在在IE,火狐和谷歌这三种浏览器上运行。实现的思路是封装一个方法,分别传入一个浏览器的字符串,如果传入IE就使用IE,如果传入FireFox就使用FireFox,如果传入Chrome就使用Chrome浏览器,并且使用什么浏览器可以在总的ini配置文件中进行配置。需要注意的是每个浏览器使用的驱动不一样。
27**、遇到alert弹出窗如何处理?**
使用driver.switch_to.alert方法先跳转到alert弹出窗口
然后再通过accept点击确定按钮,通过dismiss点击取消按钮,通过text()获得窗口文本。
28**、怎么验证元素是enable/disabled/checked状态?**
定位元素后:分别通过isEnabled(),isSelected(),isDisplayed()三个方法进行判断。
29、如何处理下拉菜单?
(1)正常的Select下拉框
在Selenium中有一个叫Select的类,这个类支持对下拉菜单进行操作。使用方法如下:
-
定位元素
-
把定位的元素转化成Select对象。 sel = Select(定位的元素对象)
-
通过下标或者值或者文本选中下拉框。
sel.select_by_index(index); sel.select_by_value(value); sel.select_by_visible_text(text);
(2)通过div改造的下拉框
直接通过Xpath定位即可。
30**、日历这种**web 表单你是如何处理的?
首先要分析当前网页使用日历插件的前端代码,看看能不能通过元素定位,点击日期实现,如果不能,可能需要借助javascript。
还有些日历控件是一个不可编辑的文本输入框,这种先需要使用Javascript改变不可编辑属性,然后再使用sendKeys()方法来实现传入一个时间的数据。
31、对于属性动态变化的元素如何处理?
可以利用 xpath 的属性包含或属性开头来识别,或者通过 css 的属性开头、属性结尾、属性包含来识别
三、 接口自动化测试
1**、有Postman/Jmeter工具实现接口测试,为什么还要用代码实现****接口自动化测试。**
这种工具包括一些开源框架最大的缺点就是不够灵活,如果是单接口的接口自动化还好处理理,但是一旦系统复杂起来,这些工具和开源的就不好用了。
比如:
-
敏捷开发,接口数量巨大,工具实现团队合作和版本控制就不方便。
-
功能太死板,有些接口功能完全无法实现(比如:自定义加密接口,签名接口等)。
-
排错,定位问题不方便需要结合fiddler抓包工具
-
没有办法生成美观的测试报告。
-
连接数据库、日志监控难以实现。
2、你们接口自动化测试框架是如何搭建的?
我们的接口自动化测试框架文件架构是这样的:
Commons用于封装公共方法,比如日志,请求,yaml处理等 Datas用于存放YAML数据驱动文件
Hotloads用于编写热加载函数文件 logs:存放日志文件
reports:存放定制的allure报告 temps:存放临时报告文件夹 testcases:存放YAML测试用例 config.yaml:全局配置文件 conftest.py:全局fixture固件
extract.yaml:全局接口关联中间变量提取文件 pytest.ini:全局pytest配置文件
run.py:全局运行文件
这个框架实现的功能包括:一、规范YAML测试用例:
一级关键字必须要包含:name,base_url,request,validate,在request下必须包含:method,url二、支持多种传参方式:
1.get请求,那么必须通过params传参 2.post请求
传json格式,需要使用json传参。传表单格式,需要使用data传参
3.文件上传:使用files传参
三、接口关联:支持多种提取方式:正则表达式和jsonpath表达式提取提取方式:
extract:
access_token: '"access_token":"(.?)"' #正则 expires_in: $.expires_in #jsonpath
取值方式:其中read_extract_data是热加载方法名,access_token是提取的变量名
${read_extract_data(access_token)}
四、热加载
-
在hotloads目录下创建一个py文件并新建一个类(可以自定义),然后写方法,注意返回值需要字符串就返回字符串,需要整形就返回整形,如下:
-
在测试用例当中传入类的对象,如DebugTalk() @pytest.mark.parametrize("caseinfo", read_yaml('/testcases/pm_create_flag.yaml')) def test_create_flag(self, caseinfo):
RequestsUtil(DebugTalk()).standard_yaml(caseinfo)
- 在YAML测试用例中调用函数:如:
json: {"tag":{"name":"码尚教育${get_random_number(10000,99999)}"}}
五、此框架支持两种断言方式:分别为equals和contains断言,如:
validate:
equals: {status_code: 205}
equals: {expires_in: 7200}
contains: access_token
六、数据驱动使用yaml和一级关键字parameterize实现:如:测试用例yaml写法:引入数据驱动文件
parameterize:
name-appid-secret: /datas/product_manage/get_token_data.yaml
引入变量
$ddt{name}
七、基础路径的设置。
在测试用例中使用一级关键字和热加载,如:
base_url: ${read_config(base,base_spgl_url)}
3. 你们公司没有通用的接口自动化框架吗?为什么还需要你们来搭建这套框架?
因为公司业务比较复杂,每个部门情况都不太一样,所以我们公司都是每个部门各自搭建维护自己的自动化框架。这样更加符合部门业务场景,使用起来更加高效。
我们部门业务比较复杂,而不是简单的单接口调用,需要定制开发才能更加灵活。
4、接口自动化的优缺点
优点:
-
提高回归测试效率
-
开发提测时,先跑下接口自动化脚本,提前发现功能bug
缺点:
- 需要提前写脚本,有一定的维护成本
5、公司如何把接口自动化测试在项目中开展起来?
-
项目组做自动化可行性分析,包括自动化率能够实施到什么程度?项目时间是否允许等
-
项目组调研接口自动化工具的框架演示,我们主要是requests和httprunner两种。
-
逐渐在项目中实施自动化,发现问题并改善。主要包括:
-
编写自动化测试计划
-
编写接口化测试用例
-
由leader编写接口试框架脚本
-
编写,调试并维护自动化测试脚本(代码规范以及根据分工编写响应的自动化测试脚本,自测没有问题之后提交到Git服务器)
-
Jenkins持续集成无人值守测试
-
后期维护脚本(主要是因为版本更新添加用例)
4) 把自动化流程化,规范化,文档化,自动化框架出使用文档以及规范文档。
5) 生成定制的报告。继续完善框架。并推广到其他的项目
6、接口自动化有多少case?覆盖率是多少?执行完需要多久?
-
接口自动化用例个数根据接口个数而定,比如200多个接口,那么大概有4500多个用例。
-
接口自动化测试用例的覆盖率可以达到99%以上。
-
所有接口自动化用例执行完成大概10-15分钟左右。(以前2500个接口用例大概是8-10分钟左右)
7、接口自动化回归过程中有没有发现什么问题?取得了怎么样的效果和收益?
每天都会运行一次,从而监控是否有因开发代码变更或者新功能添加而导致的遗漏bug
-
开发有时候会修改一些公共代码和底层代码,影响到一些其它接口,需要发版前全部跑一遍,之前就有一个文件上传接口,改了底层代码,没测出来,自动化测试用例执行报错,分析接口返回发现的。
-
下游有时候会改动一些接口校验之类的,但是没有通知我们,这时候跑自动化脚本就可以及时发现,这时候自动化可以发现问题,并及时去评估到相关影响。
做自动化之前全部回归一遍接口需要2-3人/日,而且还覆盖不全都是回归核心接口功能,也出现过回归不到导致生产问题,自动化只需要15分钟就可以全部回归一遍,覆盖更全,大大提升了效率,节约了人力。
8、接口自动化搭建过程中最难的技术难点是什么?
-
最难的难点还是接口自动化框架的搭建以及执行不够稳定。
-
第二个就是各个接口不同的参数类型处理。(比如有传整形,字符串,列表,文件上传等)
-
RSA的加密接口
9、你们持续集成怎么做的?
主要是通过配置定时自动构建,跑测试用例,自动发送邮件到相关测试人员邮箱和企微群,每天晚上自动跑自动化用例,上线前或者重大改动也会手动构建查看执行结果。
10、你主要负责参与哪部分框架搭建,你们怎么合作
我主要负责封装requests统一请求和接口关联,规范yaml用例格式和读取,日志监控等相关模块,除此之外还写了很多自动化测试用例,我们总共三个人参与,我和一个资深测试外加一个测试。那个测试负责编写用例更多一些,我和资深测试负责框架方面多一些。共享代码包括测试用例数据主要通过git共 享,每次写代码之前要先update一下保证是最新代码和数据。
11、数据驱动怎么做的?
数据驱动主要是使用pytest的parametrize装饰器结合yaml实现,parametrize主要是减少代码重复,比如一个接口有很多测试用例,但区别是入参不一样,断言不一样,比如一些必填项校验,这时候可以用 parametrize把YAML数据都读取出来,传入测试用例即可。
从而实现将数据和测试用例代码进行分离。具体实现方法如下:引入数据驱动文件
parameterize:
name-appid-secret: /datas/product_manage/get_token_data.yaml
引入变量
$ddt{name}
12、接口自动化中接口关联怎么处理的?
-
通过一个单独yaml文件来保存中间提取的变量,这个变量在所有的测试用例之前通过fixtrue清空。
-
在测试用例的yaml里面通过一级关键字extract提取,提取支持json提取和正则表达式提取。提取方式:
extract:
access_token: '"access_token":"(.?)"' #正则 expires_in: $.expires_in #jsonpath
- 在其他的接口里面使用${}或热加载的方式提取。
13**、requests 中的Session会话管理的作用是什么?**
因为很多接口都需要使用到 cookies或session来记录登录状态,而requests的session会话管理的作用就是可以保持会话,将cookies值自动传到下一个接口,这样我们去请求下一个接口时就不需要手动输入或者是关联cookies信息,接口自动化测试框架中都是使用requests.session()对象来发送请求。
14、接口鉴权怎么做的?
我们接口中主要就两种鉴权,一个是cookie鉴权,一个是token鉴权。
-
cookie鉴权我们是使用requests.session()对象来发送请求。而requests的session会话对象会将 cookies值自动传到下一个接口请求。
-
token鉴权我们是通过接口关联来实现的。
15、接口自动化测试中断言是如何实现的?
断言在接口自动化测试框架中我们会把它封装成一个方法,在这个方法中通过读取yaml文件的validate关键字得到断言的方式和断言的数据,主要包含相等断言以及包含断言,然后在封装好的这个方法中实现断言,也就是说当断言方法封装好之后,我们只需要修改yaml文件的validate字段即可实现断言。不需要额外写脚本。
16、数据库断言是什么时候去校验的,哪些场景使用到了?
数据库断言主要应用于核心的业务接口或者链路接口业务。
比如:电商从登陆接口到搜索商品接口到加入购物车接口到下单接口完成后,需要验证order订单表中增加了一条记录,并且这个记录中order_status为0,表示待发货状态。
17、接口自动化测试框架中动态参数接口,加密接口,签名接口你们是怎么处理的?
可以使用热加载的方式调用debug_talk.py中DebugTalk类里面的方法。通过${}调用方法即可。在面试中不要说热加载三个字,因为很多面试官不知道,换成:在YAML中调用python函数。
四、其他
1. 使用git合并代码的时候有冲突怎么办
Git合并代码冲突一般出现在对同一个配置文件进行修改的情况,处理方式如下: 1)先拉取远程库中最新代码,命令:git fetch origin master:tmp 2)然后合并分支tmp中代码,命令:git merge tmp
如有代码有冲突,这里会合并失败,那么你先进行本地提交自己的修改的,命令1:git add -A
命令2:git commit -m"message(修改了什么的信息)"
3)本地提交完后,你需要再一次进行合并代码,然后git就会帮你自动合并,并指出冲突文件有哪些,冲突文件里面往往都会存在"<<<", 只需要搜索它,就能看到冲突的代码地方。
当你对哪些冲突文件进行修改后,需要再进行一次本地提交git add -A和git commit -m,这时候那些冲突文件就会完全被你的修改覆盖,然后删除下载下来的分支代码:git branch -d tmp然后你可以再试试编译代码,看看会不会出现编译错误,如果没有,就可以将代码进行上传到远程库,命令:git push
origin master
-
RF框架用过吗?关键字驱动的原理?如何开发系统关键字?
-
Selenium的底层核心原理是什么?有没有做过二次封装? 4.Unittest/Pytest有什么区别?
-
自动化遇到用例fail掉如何排查故障
-
如何在脚本中组织测试用例,按什么模式设计
-
如何提高selenium脚本的执行速度?
11、自动化测试的时候是不是需要连接数据库做数据校验?
12、什么是关键字驱动?
五、HR面试相关问题
1. 离职原因是什么
尽量说客观原因,比如:
公司目前经营状况不太好,现在接的项目也比较少,很多时候比较闲,感觉再待下去就废了,还是希望趁年轻多积累一些经验
公司经营状况不太好,目前已经裁了很多人了,我想找一个更稳定的平台去发展公司出差比较频繁,我个人不太喜欢频繁出差,所以想看看外面的一些机会
2. 还有什么想问我们的吗
一定要问,比如:
a ) 入职后的工作内容、负责业务
b ) 测试团队规模,组织架构
- 你有其他的 offer吗
如果真的有其他offer,如实说
如果没有其他的offer,就说"现在有两家正在走流程,正式offer还没下来,只是HR一个口头的offer"如果HR问是什么公司的offer,你就说"是做xx行业的,具体名称我就不说了"
如果HR问那个offer的薪资是多少,你就说出你本次面试的期望薪资即可。