加餐篇:部分面试问题
1. get、post请求有什么区别?
参考回答:
1)区别1:操作数据方式不同
get是从服务器获取数据
post是把需要处理的数据提交到服务器上
2)区别2:传参方式及长度限制
get参数通过url传递,参数衔接在url后面,而url的长度根据浏览器及服务器的不同而有不同限制。比如:
- IE((Browser)):2083字符(2K+35)
- Chrome(Browser):8182字符
- Firefox (Browser):65536字符
- Apache(Server):8192字符
post参数放在Request body中,理论上讲,是没有大小限制的,http协议规范也没有进行大小限制,起限制作用的是服务器的处理程序的处理能力。比如:
- Tomcat默认:2M
3)区别3:参数数据类型及编码方式
get参数只允许ASCII字符,进行url编码
post参数数据类型没有限制,支持多种编码方式,可发送类型包括如下:
- 表单
- 任意格式的文本:如text、javascript、json、xml、html等
- 二进制文件
- GraphQL查询语言
4)区别4:安全性
get参数直接暴露在URL上,所以安全性相比post差
post参数包含在body体中,不会被保存在浏览器历史或 web 服务器日志中,因而相比get安全一些
5)区别5:缓存
get请求会被浏览器主动cache
post请求不会被浏览器缓存,除非手动设置
6)区别6:幂等性
get方法具有幂等性,其用于获取资源,不会改变资源的状态,不论调用一次还是N次都没有副作用,因而是幂等的
2. 为什么要对接口做测试?
在回答这个问题之前,先举个例子:
比如通过App测试用户登录功能,用户名为6~18个字符,包含字母(区分大小写)、数字、下划线,不允许其他任何特殊字符。这样的话,如果App端用户名后增加'#字符,组成sql注入句式(第五章第一节 接口安全测试--sql注入 篇,我们会专门讲接口sql注入的内容)就无法通过App的校验,因而无法提交请求给服务器,阻止了sql注入的可能性。但是App是调用api接口实现数据提交的,如果有人通过抓包抓取到api请求包体,就可以绕过App直接向服务器发起请求,这时候App的页面校验就无法起到作用,api参数中的用户名可以随意输入,比如直接在用户名后增加'#字符,要是服务端存在sql注入漏洞,那么就可以正常登录系统了。另外,如果App没有对'#特殊字符做限制或者限制失效,api层的特殊字符校验还能起到一层拦截防护的作用。现在系统的设计基本都是采用前后端分离的策略,所以服务端自己需要做好各种数据的校验和异常的处理,不能全部依赖前端。
通过上面的例子,你一定对为什么要做接口测试有了一定的认识,当然做接口测试的原因不止上面例子中提到的几点,总结如下:
1)检查接口安全性、容错性
虽然 UI 界面会对输入做相关校验,但是对于有一定计算机的知识的人来说,很容易通过篡改接口数据,绕过校验,或者输入通过前端页面无法输入的数据,对系统造成破坏,而对接口进行测试,就可以有效防止此类问题发生
2)微服务架构
微服务架构越来越流行,模块与模块间的交互变成了服务与服务之间的交互,服务之间的交互都是通过接口进行通信,因此需要通过接口测试来保证每个微服务接口自身的功能正常,如果某个服务出现异常,通过接口测试可及时发现问题,减少定位问题的时间消耗
3)屏蔽 UI 层不稳定性
接口逻辑相对于前端 UI 界面更加稳定,较不容易发生变化,因此,接口测试自动化维护成本比UI自动化维护成本更低,接口测试相对更容易实现自动化测试持续集成
4)提高测试效率
如果接口程序出现问题,需要让异常或错误尽快的抛出。在接口测试中,由于接口测试是相对底层的测试,所以,可以更早、更快的发现程序错误
5)节省测试成本
一个系统服务越接近底层,对系统的影响也就越大,服务端接口的一个 bug 可能会引发前端的 重大故障。接口测试能够提供系统复杂度上升情况下的低成本高效率的解决方案
3. 什么是pytest框架?
pytest是Python的第三方测试框架,是基于unittest的扩展框架,它是一个非常成熟的全功能的Python测试框架,主要有以下几个特点:
- 简单灵活,容易上手
- 支持参数化
- 能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests)
- pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等
- 测试用例的skip和xfail处理
- 可以很好的和jenkins集成
- report框架----allure 也支持了pytest
4. 为什么手机号、身份证号、银行卡号、地址等通常不用MD5加密?
参考回答:
5.性能测试时,为什么要对数据做参数化?
参考答案:
1)业务限制唯一性:
- 比如注册账号功能,相同用户名的不允许重复注册,如需要验证正常注册用户的性能,模拟真实场景,就需要对用户名进行参数化;
- 再比如登录功能,某些场景下,会要求用户同一时期只能在一处登录,即用户用账号A在Android设备登录App后,再在iOS端用账号A登录,将提示:“A用户已在其他设备登录,是否继续登录”,此时也需要对用户名进行参数化。
2)业务数据缓存:
我们知道,应用服务器(如JVM)、数据库服务器(如MySQL)都会有缓存机制,有时候还会增加Redis等内存数据库作为数据缓存,以用户下订单流程为例,下单前先从Redis缓存查询商品信息,如果存在相应的商品信息,就不会去访问Mysql数据库,如果Redis中查询不到相应的商品信息,才会访问Mysql数据库,如果压测时,商品不做参数化,那始终查询的是同一个商品信息,Redis缓存100%命中,就不会对MySQL有任何压力,无法测试出MySQL的真实压力,另外,做参数化需要结合实际业务,计算实际需要参数化的数据量,参数过多,对系统的压力就会大,参数过少,不符合真实场景中的数据量,则无法测试出系统真实的压力。
<p> 本专刊共五章 21 篇正文及 5 个对应的 GitHub 项目,主要介绍了接口测试基础知识及测试用例设计方法,认证鉴权、加密验签,自动化测试,安全性测试,性能测试等内容,每一章节都有代码实例来剖析其原理,并提供了一个完整电商系统的代码,可以直接实操演练,让你知其然知其所以然,轻松搞定接口测试。加入专刊,你就加入了一大群志同道合的优质测试人圈子,同时还有和作者及作者的朋友们互动交流的机会。 本专刊购买后即可解锁所有章节,故不可以退换哦~ </p> <p> <br /> </p>