day:41 总结(五)接口+接口自动化

1. 讲解接口基本原理,接口的组成?get请求方法和post请求方法的区别?怎么对接口进行断言,鉴权的方式,cookie,session,set-cookie和token的区别?

1)接口的原理:
客户端发送http或者https协议的接口请求给到服务器,服务器对请求进行处理,把处理后的结果返回给到客户端
其他的协议,可以参考:https://www.cnblogs.com/xiaoshubass/p/17729410.html

2)接口的组成:
http://49.233.201.254:8080/cms/manage/loginJump.do
① 请求头
请求的协议http --》http1.0和http2.0
ip地址和端口
请求的URL地址
接口的请求方法 --》get、post、delete、put
user-agent --》用户代理
content-type --》内容类型--》application/json(json串) 或 application/x-www-form-urlencoded(键值对)
cookie --》本地缓存技术
token --》令牌
Authorization --》主要用来做鉴权--》Berer+token
② 请求体
请求的参数==》userAccount=admin&loginPwd=123456
③ 响应头
content-type --》内容类型--》application/json(json串) 或 application/x-www-form-urlencoded(键值对)
server ==》服务器的名称
时间戳 ==》服务器返回数据的时间戳
set-cookie ==》种cookie或者叫设置cookie
④ 响应体
token ==》令牌
响应的文本信息msg
响应状态码

不同的响应状态码及含义:
参考地址:https://www.cnblogs.com/xiaoshubass/p/16963822.html
2xx (成功类)--》表示成功处理了请求的状态代码。
200 (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页
3XX(重定向)--》HTTP状态码3XX表示重定向,表明浏览器需要执行某些特殊的处理以正确处理请求。--》重定向后的地址,看location
301 永久性定向。该状态码表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI。
302 临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问。和301相似,但302表示的资源不是永久移动,只是临时性的。
4xx(客户端请求错误)--》这些状态代码表示请求可能出错,妨碍了服务器的处理。
400 (错误请求) 服务器不理解请求的语法。
401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
403 (禁止) 服务器拒绝请求。
404 (未找到) 服务器找不到请求的网页。
5xx(服务器错误)--》这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。
500 (服务器内部错误) 服务器遇到错误,无法完成请求。
501 (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。
502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。
503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。
504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本

3)get请求方法和post请求方法的区别【超级重点】
① get请求的请求参数在URL地址栏里面,安全性比较差
② post请求的请求参数在请求体body里面,安全性比较高
③ post请求携带的数据量比get请求更多,post一般没有限制,但是可以设置最大可携带2GB,get请求一般最多携带2kb的数据
④ post一般用来做表单提交,get请求一般用来做数据查询
⑤ get请求刷新服务器或回退没有影响,post请求回退时会重新提交数据请求
⑥ get请求可以被缓存,post请求不会被缓存

4)怎么对接口进行断言?==》你平常会对接口断言哪些内容?
① 对接口的响应状态码进行断言
② 对接口返回的具有唯一性的文本信息进行断言 msg
③ 当返回值有动态数据需要进行判断的时候怎么办?==》首先我会通过Python结合pymysql去封装一个操作数据库的工具方法,然后通过查询数据库中对应的数据赋值给到一个变量,然后在把这个变量的值和返回值进行断言和对比

5)鉴权的方式
① cookie+session ==》web端用的比较多
② token鉴权 ==》APP和web都可以用
③ api_key秘钥鉴权 ==》商品消费型的
web项目可以采用 cookie+session、token鉴权 api_key秘钥鉴权
APP项目只能采用 token鉴权 api_key秘钥鉴权

6)cookie,session,set-cookie和token的区别?
参考地址:https://www.cnblogs.com/xiaoshubass/p/13114740.html
① cookie是一种本地缓存技术,是由服务器生成并返回的,但是保存在浏览器和客户端,cookie最长的失效时间为1个月
② session是会话技术,是又服务器生成的,保存在服务器端,session一般默认的失效时间是30分钟
③ set-cookie是设置cookie,服务端生成session,并且给session进行编号,编号就是JsessionId,然后通过接口的响应头返回,并且种到浏览器当中去
④ token是令牌,服务器生成的,一式两份,一份在服务器,一份给到接口的响应体,token是有失效时间的,不同的APP失效时间不一样的,一般银行类的APP失效时间1-3分钟,一般的APP有30-60分钟不等

2. 接口抓包工具的原理?介绍当前常见的接口测试工具,接口设计测试用例应该从哪些方面去考虑?你们1个接口可以写多少条自动化测试用例?你测过多少个接口?总共有多少条接口自动化用例,每次运行时间要多久? 你们自动化和功能测试的占比是怎样的?

1)常见的抓包工具:
fiddler、Charles、wrieshark(TCP/UDP)、浏览器F12开发者调试模式
2)抓包工具的原理:
fiddler作为一个代理服务器,代理的是本地,端口号8888,客户端发送请求给到服务端,fiddler可以打请求前断点进行拦截,修改请求的数据,然后发送给到服务端,服务端接收到数据进行处理并响应,然后fiddler可以打响应后断点,修改响应后的数据,再把响应后的数据返回给到客户端

打断点:
① 全局断点
② 单个断点
请求前断点 ==》bpu + 接口路径 ==》取消断点:bpu
响应前断点 ==》bpafter +接口路径 ==》取消断点:bpafter

【面试题】你主要用fiddler来做什么?
答:用来抓包、打断点--》那你还能用来做什么?--》还可以进行mock测试,弱网测试
--》为什么要打断点?--》通过断点修改请求参数和响应的内容来对接口进行正常场景和异常场景的测试

3)常见的接口测试工具 ==》postman、jmeter、swagger(存接口)、apifox、apipost
Apifox = Postman + Swagger + Mock + JMeter
Apipost = Postman + Swagger + Mock + Jmeter
apifox、apipost ==》团队协作更为鉴权
Postman ==》不登录也是可以使用的
apifox ==》必须要扫码登录

4)接口设计测试用例应该从哪些方面去考虑【超级重点】
① 首先我会考虑接口入参的必填和选填,参数的长度校验和类型校验
② 不同的请求方法,比如把post换成get请求
③ 不同的请求的内容类型,比如表单键值对换成json字符串
④ 还会根据接口不同的返回值去设计不同的入参来进行覆盖
⑤ 还会考虑接口之间的逻辑关系,比如关联接口等等
⑥ 用户无效的token或者错误的token进行鉴权
⑦ 还有需要考虑接口的幂等性
⑧ 还会考虑接口查询数据的性能表现==》会不会有慢SQL等等的问题

5)你们1个接口可以写多少条自动化测试用例?你测过多少个接口?总共有多少条接口自动化用例,每次运行时间要多久? 你们自动化和功能测试的占比是怎样的?
1个接口大概写8-10条自动化测试用例
之前项目组测了大概有100多个接口--》100个接口8-10条=800-1000条用例--》接口自动化测试用例写了大概了1000多条--》10000.5秒每条=8-9分钟
自动化和功能测试的占比--》功能和业务占到60-70%,UI和接口自动化以及性能占30%左右

3. 对于接口幂等性你是怎么测试的?
参考地址:https://www.cnblogs.com/xiaoshubass/p/16895272.html
幂等性的概念:接口幂等性就是用户对同一个接口发起一次或多次请求的结果是一致的,不会因为多次请求而产生不同的结果
查:是有天然幂等,不需要再做额外的幂等
删:也是有天然幂等的

更新操作--》数据库锁
1)数据库悲观锁--》指的就是每次操作的时候,先把记录锁定起来,其他人无法操作这条记录
2)数据库乐观锁--》就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制。

新增操作==》唯一索引
前端:如防止表单重复提交,按钮置灰、隐藏、按钮不可点击等方式
后端:唯一索引
【面试题】你对接口幂等性是怎么测试的【重点】
答:我会在jmeter里面去组建接口,并且设置比如50个并发线程数,加入同步定时器(集合点)同时去对接口发起请求,如果只有一个接口能请求的通,其他的49次请求都是失败的,就说明接口是做了幂等性校验的

4. 你给后端接口做幂等性校验,那这个key(唯一索引)加在哪个字段上面?
电商项目:唯一索引加在订单号上面
银行贷款项目:贷款申请号,借据号上面
保险项目:保单号上面

5. 在测试过程当中有没有出现过资损的情况?怎么防止资损或者资损这块怎么测
1)没有出现过资损的情况
2)防止资损的技术手段:数据库不用float等数据类型,用bigdecimal 或 decimal等数据类型 ==》比如3333.33 变成了3333.333333333333333333
==》有些除不尽的数据,比如10000分3期,第一期3333.33,第二期3333.33,第三期3333.34
==》通过对账对金额和资损进行测试

6. mock和沙箱环境是什么意思
1)mock测试:① 后端接口功能还没有实现好,但是有需要用到这个还没有开发完成的接口,就可以通过模拟接口的返回值,先进行mock数据测试;② 测试一下第三方接口的时候,可以通过mock测试达到测试的目的
==》fiddler如何做mock测试:https://www.cnblogs.com/xiaoshubass/protected/p/17788756.html
沙箱环境:https://www.cnblogs.com/xiaoshubass/p/17722620.html

7. 第三方接口是怎么测试的
1)如果对方有沙箱环境我们就使用第三方的沙箱环境进行测试
2)如果没有,我们可以通过mock进行第三方接口的测试

8. 要求学员结合项目讲解项目中实战接口操作(postman和jmeter挑一个)
postman版本答案一:
我用的postman工具做的 接口测试的过程:首先我会问开发拿到接口文档,编写对应的接口测试用例,然后把对应的url地址,data信息,headers都放入到postman里面,然后设置断言,然后发送接口的请求,看一下接口是否断言成功,对于一些关联接口的测试,我会首先把登录接口调通,然后拿到登录接口返回的token值,通过在后置处理器tests里面把token设置为环境变量,然后在下一个接口的请求头里面通过{{token}} 俩个大括号进行引用,达到关联接口的测试,如果是有参数化的接口测试,我首先会在本地创建一个CSV文件然后造对应的测试数据,在postman左侧栏有一个run点击一下,然后选择本地对应的CSV文件,然后批量运行接口,看一下接口是否运行成功和是否断言成功,完成参数化接口的测试。

postman版本答案二:
我用的postman工具做的,如果有接口文档,我会问开发拿到接口文档,如果没有的话我会自己用fiddler抓包,编写对应的接口测试用例,然后把对应的url地址,还有入参都放入到postman里面,然后设置断言,然后发送接口的请求,看一下接口是否调通并且断言成功,对于一些关联接口的测试,我会首先把上一个接口调通,然后拿到上一个接口的返回值,通过在tests里面把拿到的值,设置为环境变量,然后在下一个接口的请求头里面通过俩个大括号进行引用,达到关联接口的测试,如果要批量运行接口的话,我会在左侧栏集合里面点击运行,然后设置迭代次数和选择参数化文件进行运行,达到批量运行的目的。

jmeter版本:
首先我会问开发同事拿到接口文档并且设计对应的测试用例,然后打开jmeter,创建一个测试计划和线程组,添加http请求,把对应的URL地址,入参和端口都填写进去,然后添加断言和断言结果,添加察看结果树,发送请求,如果是对于关联接口的话我首先会把登录接口调通然后设置一个jsonpath提取器或者正则表达式提取器,拿到登录接口返回的token值,并且在http信息头管理器里面通过${token}进行引用,完成关联接口的测试,对于需要做参数化的接口,首先我会在本地准备csv文件,然后在jmeter里面添加csv data set config,然后把本地的csv文件加载进来,点击运行,查看接口通过的情况。

9. 接口当中遇到了哪些问题以及哪些bug?最后是怎么处理的?(准备2个接口bug)
参考地址:https://www.cnblogs.com/xiaoshubass/protected/p/16738470.html

10. flask框架启服务+json入参接口
1)flask框架是一个Python的开源的后台开发框架,可以用来编写后台代码和编写接口服务,测试开发工程师用的比较多
2)下载flask框架:在dos窗口里面用:pip install flask
第二种方法:pip install flask==2.0.2 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
3)接口的本质就是函数,接口的入参就是函数里面的形式参数

11. 接口自动化框架设计、接口分层讲解
==》我们大概分了6-7层,来对我们的接口自动化进行了封装,要和您讲一下具体的代码吗?【超级重点】
答案一:
我们这个接口自动化框架大致分了6-7层,首先
第1层的话是config配置层,这个里面主要是封装了一些我们测试环境的url地址和一些连接数据库的IP地址,用户名密码等等
第2层是data数据层,这个里面主要放的是接口的用例,把接口的入参,接口的路径,接口的编号,请求方法都放在Excel表格里面了,有正常场景的也有异常场景的
第3层是一个library第三方的公共库层,里面主要是放了发邮件,生成测试报告的工具类,还有做数据驱动的ddt模块
第4层就是utils工具类层,主要封装了读取Excel表格,读取ini配置文件和发送接口请求的工具类
第5层就是testcase用例层,这里面会创建一个类,然后在里面创建以test开头的方法,然后用data装饰器用来接受Excel表格里面的接口入参,先把数据处理,然后发送接口请求拿到response响应信息进行断言
第6层就是run运行层,首先会通过把所有的用例加载到一个suite套件里面,然后再通过调用run方法运行这个套件,并且通过HTMLtestrunner模块生成测试报告放到第7层报告层里面,然后最后通过Jenkins做可持续集成,在回归测试阶段,每天晚上都会运行一下我们的接口自动化用例,大致的一个框架结构就是这样的。

答案二:
我们是使用 python+requests+unittest 来搭建我们的做接口自动化测试框架,使用 python,组建接口,把url接口地址,data入参和headers都定义好
调用第三方的库 requests 来根据我们接口方法 get 或者 post 来发送接口请求,并接收响应回来的数据转换为字典,再通过 unittest 框架提供的断言来判断响应结果是否符合我们预期,通过 HTMLTextRunner 的类库来输出 html 格式的测试报告。
在这个过程中,为了方便用例与数据的使用,做了分级处理。用例里面主要是编写发送接口请求的流程以及接口校验的流程,里面的测试数据不会直接写死在用例里面,而我们的用例会单独剥离出来放在其他的地方。这个过程我们采用分层封装的形式进行处理,那我们这个框架里面大概分了7层
比如说就是我的这个用例层也就是testcase层,主要是存放接口的用例,一般一个接口封装在一个类里面,一个类放在一个模块(.py)里面,以接口的形式去写的。采取了ddt数据驱动的形式去编写数据用例,这样可以让我达到一条用例执行我所有场景接口的情况,然后接口运行完会进行断言,断言的话一般会在用例里面加一些try except捕获异常语句,因为后续这个用例执行通不过的话,在报告里面直接可以看到报错信息直接进行修改
然后在用例里面获取的数据我们一般都会保存在data层里面。然后我需要去封装一些操作这些数据的工具方法出来,我们会把它集中封装在util工具层。
还有一个就是配置信息层,这个里面就是保存项目的配置文件,比如环境的信息,数据库的信息。
然后run层,可以保存不同的运行对象,在指定目录下用discover方法寻找以test开头的用例,形成一个套件对象,然后用run,运行不同组合下的用例。
然后还有一个library层存放我需要用到的一些公共库,比如htmltestrunner 或ddt驱动工具模块,在用例层直接导入即可,后续还用其他工具模块也可以直接放这里面。
在report层把生成报告指定保存在这个层里面,展示成功或者失败的用例,方便我查找问题,对用例进行一个管理和输出,整个接口自动化框架的分层处理就是这样的

12. app测试和web测试的区别【重点】
1)功能方面:在流程和功能测试上没有区别,就是需要测试的系统和一些细节可能会不一样,
① web项目,一般是b/s架构,基于浏览器的,而APP项目是c/s架构,必须要有客户端
② web测试只要更新了服务器,客户端就会同步更新,可以保证每一个用户使用的客户端是完全一致的,但APP端就不能保证完全一致,需要用户手动更新客户端,所以APP服务端更新之后,客户端用户所用的核心版本都需要做回归测试
2)兼容性方面:web项目是基于浏览器,更倾向不同的浏览器,以及浏览器版本,和电脑硬件,电脑系统(win、mac)之间的兼容,APP则是依赖手机或平板,不仅要关注分辨率,屏幕尺寸,设备系统(苹果、安卓、鸿蒙),系统之间的不同版本(ios18、ios17....),手机不同的品牌(苹果、华为、小米、三星.....)
3)性能方面:web页面可能只会关注响应时间,而APP则还需要关心流量、电量、cpu、memory
4)APP测试比web测试还要多一些专项性测试,比如,一些异常场景的考虑,如中断性测试(来电、来短信、关机、重启切换手机后台),以及弱网测试,网络切换测试,页面回退和刷新是否会造成2次提交
5)APP还需要考虑安装、卸载、更新升级,web就不需要考虑这些
6)界面操作:APP一般是手动触屏,那就需要考虑手势,横竖屏的切换,多点触控,事件触发区域等;

posted @ 2025-04-10 20:47  君庭  阅读(35)  评论(0)    收藏  举报